==当我使用像这里的文字字符串时,我在使用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".所以,a并b指向同一个实例.
在您的第二个片段中c,d指向不同的 string实例.
然而重要的一点是,a == b并且c == d不要打电话==给string班级的操作员,而是object.因此,执行简单的参考比较,而不是string比较.
请注意,您正在比较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比较.
在你的基本情况下,比较导致了真实,因为它实际上是同一个对象!
在第二种情况下,您有两个"新"语句,因此有两个不同的字符串构建器,它会生成两个新的字符串对象.不一样的常量字符串对象.
使用的比较由变量的类型决定.