微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

有关c#

如何解决有关c#

我有以下问题
我们在C#中知道

  1. 字符串是引用类型
  2. 用于字符串==运算符的方法已重载,因此可以按值进行比较

定义了以下变量

string s1 = "foo";
object s2 = "foo";
string s3 = new String(new char[] {'f','o','o'});

bool b1 = (s1==s2); //true
bool b2 = (s2==s3); //false
bool b3 = (s1==s3); //true
bool b4 = (s1.equals(s3)); //true 
对于所有变量s1,s2,s3的

gettype()返回相同的val字符串 问题是:为什么s1 == s3是true s2 == s3 false? s1和s2具有相同的类型-因此==运算符的行为应相同。据我了解,S1和S2也实习。 (object.ReferenceEquals(s1,s2)返回True) 我想念什么?

高度重视

解决方法

为什么对象==字符串与string.operator == (string,string)不匹配?因为参数之一不是字符串...所以下一个匹配的参数是object.operator ==,它不表现为字符串同伴。

为什么字符串的intern版本(s1和s2)指向同一对象?因为这是实习生所做的-确保同一值作为一个对象仅出现一次。特别是对同一模块中的所有字符串常量都进行了此操作(由编译器自行决定),因此s1和s2均指向同一且仅表示该程序集中"foo"的对象。

为什么非实习字符串(s3)与(s1 / s2)是不同的对象?因为它不一样,所以在运行时创建字符串不会实习字符串。

,

==运算符(以及C#中的任何运算符重载)都是静态方法,因此,被调用的运算符由参数的静态类型选择。在(s2==s3)中,左操作数的静态类型为object,因此它不能与operator ==(string,string)方法的签名匹配。

改为尝试s2.Equals(s3)Equals是一个虚函数,因此对s2的动态类型进行操作,即string。 (这也是s2.GetType()返回string的原因。)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。