在c#中混淆使用==运算符

时间:2017-08-29 09:23:03

标签: c# .net

我对在(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); }
}

6 个答案:

答案 0 :(得分:17)

object a="hello";
object b="hello";

此处编译器为文字string创建单个 "hello"实例。因此ab指向相同的实例。

在您的第二个代码段cd指向不同的 string个实例。

重要的一点是,a == bc == 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。

的原因