c#中字符串的比较

zhu*_*ien 3 c# string string-comparison

因此,正如我们所知,对象(在当前示例中 - 字符串)相对于它们在堆中的引用进行比较.因此,如果:

string a = "something"; 
string b = "something"; 
bool isEqual = (a == b);
Run Code Online (Sandbox Code Playgroud)

将投入的值一个在字符串池中并找到的值后b是相同同时通过池搜索,将指定相同的参考变量b.好的,这很清楚.但是如果发生了什么:

string a = "somethingNew";
bool isEqual = (a == "somethingNew");
Run Code Online (Sandbox Code Playgroud)

这些比较文字如何在内存中表示(如果有的话)以及在这种情况下如何完成整个比较过程?

Han*_*ney 12

可以相对于堆中的引用来比较对象.如果这是它们本地使用的方式,大多数对象都不会比较人类友好,因此string实际上实现相等运算符的重载更直观.string比较相等(通过相等==运算符)首先检查内存引用(通过object.ReferenceEquals(object, object)先调用),如果不是相同的引用,则回退到比较字符串中的字符,而不管内存位置如何.

字符串文字,例如"somethingNew"编译成一个变量,在.NET调用实习内存池时引用该字符串值...这是一种方法,通过该方法,具有相同值(意味着相同的大小写和字符)的所有字符串都用作指针实习池中的单个引用,而不是每个引用具有相同值的内存分配.这样可以节省内存,但需要在实习池中查找值.这是有效的,因为字符串是不可变的(只读),因此通过与++=运算符串联来更改字符串的值,否则实际上会创建一个全新的字符串.默认情况下,字符串变量不会被中断,除非它们是文字.

您的示例中的字符串比较将在初始字符串相等对象引用检查上成功,并返回true,而不进行任何进一步的相等性分析.这将发生,因为您的变量是字符串文字,因此实习(具有相同的内存地址).如果它们没有被实习,那么无论内存位置如何,比较都将回归到字符比较.

您可以使用手动实习非文字字符串 string.Intern(string)

  • 我意识到所有相同值的字符串将指向相同的引用(包括字符串常量),这意味着OP的第二个示例将仅检查引用,并且它应该返回true.要创建一个具有相同值的新引用,我认为我们可以使用`string.Copy`然后它将回退以比较你说的每个字符. (2认同)

Mar*_*ell 5

因此,正如我们所知,对象(在当前示例中 - 字符串)相对于它们在堆中的引用进行比较.

不正确; 该==操作可以被重载,的确超载的string.

但是如果发生了什么:

使用字符串比较; 然而,即使它们不是:因为该数据来自文字(ldstr),相同的字符串实例将导致这种情况由于"实习" - 所以即使它使用参考比较,它仍然可以工作.