文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

.Net中字符串不变性与相等判断的特殊应用场景分析

2023-06-30 08:12

关注

这篇文章主要介绍了.Net中字符串不变性与相等判断的特殊应用场景分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇.Net中字符串不变性与相等判断的特殊应用场景分析文章都会有所收获,下面我们一起来看看吧。

问题

请看以下例子,并回答问题。

var s1 = "12";var s2 = "12";//序列化方式1var o3 = Newtonsoft.Json.JsonConvert.DeserializeObject<string>(Newtonsoft.Json.JsonConvert.SerializeObject(s1));//序列化方式2MemoryStream stream = new MemoryStream();System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bf = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();bf.Serialize(stream, s1);stream.Seek(0, SeekOrigin.Begin);var o4 = bf.Deserialize(stream);//====分割线===================================================var e1 = object.ReferenceEquals(s1, s2);var e2 = o4 == s1;var e3 = s1.Equals(o4);var e4 = o3 == o4;Console.ReadKey();

请回答分割线后e1, e2, e3, e4 值为true还是false。

人人都知道在.Net中字符串是享元模式的经典范例。字符串具有不变性。(至少在托管层,事实上可以在非托管层修改字符串的值),但你真的能回答对上面的问题么?

答案

e1 = true;
e2 = false;
e3 = true;
e4 = false;

要了解这个问题首先可以看下字符串在内存中的布局。

如何在visual studio中查看变量的内存布局

在VS中可以非常方便的查看托管或非托管变量的内存值。方法如下。

字符串变量在内存中的布局

在.Net中字符串是以UTF-16格式在内存中保存的。在本例中s1的内存如下。

00 00 00 00 00 00 00 00 98 d6 fc e5 fb 7f 00 00 02 00 00 00 31 00 32 00

这里可能与你拿到的结果不一样。你可能并没有前8位0x00,因为我把对象头带上了。下面依次解释各段含义。

拿以上s1 s2 o3 o4分别实验可以发现他们的内存一模一样,其中s1 s2直接就是同一块内存地址,但剩下的内存地址都不一样

比较与解答

        // Determines whether two strings match.        public override bool Equals([NotNullWhen(true)] object? obj)        {            if (object.ReferenceEquals(this, obj))                return true;            if (!(obj is string str))                return false;            if (this.Length != str.Length)                return false;            return EqualsHelper(this, str);        }

EqualsHelper方法最终则调用如下。(在.Net 6下)

        // Optimized byte-based SequenceEquals. The "length" parameter for this one is declared a nuint rather than int as we also use it for types other than byte        // where the length can exceed 2Gb once scaled by sizeof(T).        public static unsafe bool SequenceEqual(ref byte first, ref byte second, nuint length)

由于实现过于复杂(.Net framework 4.5.2下则较简单,直接按长度比较char,有兴趣的自行查阅),这里就不贴具体实现了。我们很容易看出这里比较的目的是比较两段内存是否相等,显然为true

关于“.Net中字符串不变性与相等判断的特殊应用场景分析”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“.Net中字符串不变性与相等判断的特殊应用场景分析”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯