你能比较字符串的内存位置而不是内容吗?

时间:2014-01-17 03:56:52

标签: c# string pointers memory clr

我在某处读到如果你的应用程序中有多个字符串是相同的,那么实际上只创建了一个字符串,并且所有引用都指向相同的字符串。

在阅读有关锁时,我看到有关此行为的警告。就像从不锁定字符串一样,因为应用程序中任何地方的任何其他锁都可能锁定在同一个字符串上特别是如果你锁定:

string lockObj = "";
...
{
  lock(lockObj){
  ...
  }
}

所以这让我回到那里只有一个特定字符串的单个副本。所以,如果我想比较两个字符串,有没有办法通过它们的内存位置来做到这一点?像..

public bool areSame(string s1,string s2){
   return &s1 == &s2;
}

感谢您的帮助!

3 个答案:

答案 0 :(得分:5)

  

我在某处读到如果你的应用程序中有多个字符串是相同的,那么实际上只创建了一个字符串,并且所有引用都指向相同的字符串。

这是不正确的。虽然您可以按照每个唯一字符串使用单个对象的方式排列程序,但.NET不能提供此类保证。确实,C#编译器会使程序中由字符串文字生成的所有string对象指向同一个字符串对象。但是,创建具有相同内容的多个string对象相当容易。

  

如果我想比较两个字符串,有没有办法通过它们的内存位置来实现呢?

您可以使用Object.ReferenceEquals方法:

public bool areSame(string s1,string s2){
   return Object.ReferenceEquals(s1, s2);
}

答案 1 :(得分:1)

您可以使用Object.ReferenceEquals Method

根据MSDN:Determines whether the specified Object instances are the same instance.

答案 2 :(得分:1)

var x = "a";
x+= "b";
var y = "ab";
Console.WriteLine(x==y);
Console.WriteLine(object.ReferenceEquals(x, y));

你会看到第二个返回false(即它们位于2个不同的内存位置)

为什么我需要按照我的方式分配x?好吧因为.net会自动填充所有字符串文字。这意味着所有相同的字符串文字实际上都指向内存中的相同位置