我对在(c#)中使用==
感到困惑
当我像这里一样使用文字字符串时:
object a="hello";
object b="hello";
比较a==b
将为真。
但是当我使用像这样的对象时:
object c=new StringBuilder("hello").ToString();
object d=new StringBuilder("hello").ToString();
比较a==b
将为false。
即使a,b,c,d
编译时所有类型的System.Object也是如此
==
运算符比较值取决于它们在编译时的值。
我使用扩展方法在编译期间获取varabiles的类型:
public static class MiscExtensions
{
public static Type GetCompileTimeType<T>(this T dummy)
{ return typeof(T); }
}
答案 0 :(得分:17)
object a="hello";
object b="hello";
此处编译器为文字string
创建单个 "hello"
实例。因此a
和b
指向相同的实例。
在您的第二个代码段c
和d
指向不同的 string
个实例。
重要的一点是,a == b
和c == d
不会调用==
类的string
运算符,而是object
。因此,执行简单的引用比较,而不是string
比较。
答案 1 :(得分:7)
请注意,您正在比较object
而不是string
!
这是真的:
string c = new StringBuilder("hello").ToString();
string d = new StringBuilder("hello").ToString();
c == d; // true
或者这个:
var c = new StringBuilder("hello").ToString();
var d = new StringBuilder("hello").ToString();
c == d; // true
(因为在这种情况下,var
会隐式输入变量作为表达式StringBuilder.ToString()
的结果,string
),请参阅here了解更多信息
不要混合object
比较和string
比较。
在你的基本情况下,比较导致了真实,因为它实际上是同一个对象!
在第二种情况下,你有两个&#34;新&#34;语句,因此两个不同的字符串构建器,它生成两个新的字符串对象。不一样的常量字符串对象。
使用的比较取决于您的变量类型。
答案 2 :(得分:2)
对于string以外的引用类型,==如果是两个,则返回true 操作数指的是同一个对象。
在第一个例子中:
object a="hello";
object b="hello";
a 和 b 指向同一个对象,因此它们相等,但在第二个:
object c=new StringBuilder("hello").ToString();
object d=new StringBuilder("hello").ToString();
你创建两个不同的 StringBuilder 实例: c 和 d ,因此它们指向不同的对象并且不相等( false )
您可以在Microsoft Docs找到更多详细信息。
答案 3 :(得分:2)
来自msdn page:
对于预定义的值类型,等于运算符(==)返回true,如果 其操作数的值相等,否则为false。以供参考 除了string之外的类型,==如果它的两个操作数引用则返回true 同一个对象。对于字符串类型,==比较的值 字符串。
所以两个比较都不应该相等,因为你是专门投射到一个对象而不是一个字符串。
然而,c#编译器已经过优化,并且识别出您使用了两个相同的字符串文字,因此编译器将两个字符串合并为一个对象,因此对象比较为true。但是编译器无法合并StringBuilder
实例,因为您使用new
关键字构建新对象。
答案 4 :(得分:1)
当您使用常量字符串“hello”时,编译器将生成此字符串的实习版本,并将此值用于a和b。
当您使用StringBuilder和ToString时,将比较包含“hello”的字符串的两个单独实例。
如果要检查字符串相等性,则应使用Equals()方法
答案 5 :(得分:1)
object a="hello";
object b="hello";
这里a和b都指向同一个对象。具体而言,他们指向相同的记忆。而在第二个例子中
object c=new StringBuilder("hello").ToString();
object d=new StringBuilder("hello").ToString();
在这里,您要创建一个新实例,具体来说,c和d的内存位置会有所不同。 所以这就是a == b和c!= d。
的原因