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

mar*_*ark 5 .net c#

==当我使用像这里的文字字符串时,我在使用in(c#)时感到困惑:

object a="hello";
object b="hello";
Run Code Online (Sandbox Code Playgroud)

比较a==b是真的.

但是当我使用像这样的对象:

object c=new StringBuilder("hello").ToString();
object d=new StringBuilder("hello").ToString();
Run Code Online (Sandbox Code Playgroud)

比较a==b将是错误的.

即使a,b,c,d编译时所有类型的System.Object和 ==运算符比较值都取决于它们在编译时的值.

我使用扩展方法在编译期间获取varabiles的类型:

public static class MiscExtensions
{
    public static Type GetCompileTimeType<T>(this T dummy)
    { return typeof(T); }
}
Run Code Online (Sandbox Code Playgroud)

Ren*_*ogt 17

object a="hello";
object b="hello";
Run Code Online (Sandbox Code Playgroud)

在这里,编译器创建一个单一 string的文字实例"hello".所以,ab指向同一个实例.

在您的第二个片段中c,d指向不同的 string实例.

然而重要的一点是,a == b并且c == d不要打电话==string班级的操作员,而是object.因此,执行简单的参考比较,而不是string比较.


Pac*_*ac0 7

请注意,您正在比较object而不是string!

这可能是真的:

string c = new StringBuilder("hello").ToString();
string d = new StringBuilder("hello").ToString();

c == d; // true
Run Code Online (Sandbox Code Playgroud)

或这个 :

var c = new StringBuilder("hello").ToString();
var d = new StringBuilder("hello").ToString();

c == d; // true
Run Code Online (Sandbox Code Playgroud)

(因为在这种情况下,var将隐式键入变量作为表达式的结果StringBuilder.ToString(),这是string),请参阅此处以获取更多信息


不要混合object比较和string比较.

在你的基本情况下,比较导致了真实,因为它实际上是同一个对象!

在第二种情况下,您有两个"新"语句,因此有两个不同的字符串构建器,它会生成两个新的字符串对象.不一样的常量字符串对象.

使用的比较由变量的类型决定.