如何在c#中区分两个相同的对象?

如何在c#中区分两个相同的对象?,c#,C#,对不起,我不太擅长解释问题。 我可以通过以下例子更好地解释我的问题: string first = "hello"; string second = "Bye"; first = second; 在上面的例子中,考虑第三行第一=第二次/代码> 在这里,我将对象第二个指定给第一个。因为c#中的字符串是不可变的,即每次为现有字符串对象指定新值时,CLR将创建一个新对象并释放旧对象(我从这里阅读)。 简单地说,它意味着第一行中的objectfirst不同于第三行中的objectfirst。 所以我

对不起,我不太擅长解释问题。 我可以通过以下例子更好地解释我的问题:

string first = "hello";
string second = "Bye";
first = second;

在上面的例子中,考虑第三行<代码>第一=第二次/代码>


在这里,我将对象第二个指定给第一个。因为c#中的字符串是不可变的,即每次为现有字符串对象指定新值时,CLR将创建一个新对象并释放旧对象(我从这里阅读)。 简单地说,它意味着第一行中的object
first
不同于第三行中的object
first


所以我的问题是如何证明两者不同?
i、 如果它(字符串)在C中是可能的,那么我可以在第三条语句前后打印两个对象的地址来证明它。

是否有任何方法可以访问这些地址或其他替代方法?

*您可以使用
.Equals()
方法或
HashCode()
方法来比较*

*您可以使用
.Equals()
方法或
HashCode()
方法来比较*

我相信您想要这个方法。它可以用来检查对象的两个实例是否完全相同,即引用同一个对象。

我相信您需要该方法。它可用于检查对象的两个实例是否完全相同,即引用同一对象。

如果必须比较底层内存地址,以下不安全代码可能会帮助您(未测试):


如果必须比较底层内存地址,以下不安全代码可能会帮助您(未测试):


如果希望查看内存中的物理位置,可以使用以下(不安全)代码

我的机器上的示例输出:

Address of first: 41793976 
Address of second: 41794056
Address of first: 41794056
您会注意到,.NET缓存字符串实例,这是完全有效的,因为它们是不可变的。要演示此行为,可以将
second
更改为
hello
,所有内存地址都将相同。这就是为什么您不应该依赖本机内存,而应该使用托管方式来处理对象

另见:

公共语言运行库通过维护 表,称为实习生池,其中包含对 在中以编程方式声明或创建的每个唯一文字字符串 你的节目。因此,使用 特定值在系统中只存在一次

来源:


如果希望查看内存中的物理位置,可以使用以下(不安全)代码

我的机器上的示例输出:

Address of first: 41793976 
Address of second: 41794056
Address of first: 41794056
您会注意到,.NET缓存字符串实例,这是完全有效的,因为它们是不可变的。要演示此行为,可以将
second
更改为
hello
,所有内存地址都将相同。这就是为什么您不应该依赖本机内存,而应该使用托管方式来处理对象

另见:

公共语言运行库通过维护 表,称为实习生池,其中包含对 在中以编程方式声明或创建的每个唯一文字字符串 你的节目。因此,使用 特定值在系统中只存在一次

来源:


你误解了你读到的东西。是的,字符串是不可变的。这意味着您不能更改现有字符串。此将不起作用:

string x = "Hello";
x[3] = 'q';
连接字符串时,会得到一个新字符串:

string a = "a";
string b = "b";
string c = a+b; // You get a new string and a and b are unchanged.
即使是自连接,也会得到一个新字符串:

string a = "a";
a += "b"; // The same as a = a + "b" and yields a new string.
但赋值给变量(或传递给函数,或从函数返回等)不会创建新字符串

字符串是“引用类型”。这意味着该变量:

string a = "Hello";
只是对字符串的引用。这样做:

string b = a;
只需将引用分配给变量。它不会改变字符串

或者,用C术语来说:引用变量是指向对象的指针。考虑:

string a = "Hello"; // a now points to the string object
string b = a; // b now points to the same object.
不变性意味着不能更改指针指向的内存(字符串对象本身)。但是指针变量仍然是可变的。您可以为其分配不同的地址

要返回到原始示例,请执行以下操作:

string first = "hello"; // Allocates memory for "hello" and points first to it.
string second = "Bye";  // Allocates memory for "Bye" and points second to it.
first = second;         // Assigns the address of second to first.
最后,
first
second
都指向相同的地址,即字符串
Bye
的地址。字符串
hello
的内存现在未被引用(没有指向它的指针,无法访问)。垃圾收集器稍后会回收它

添加:与C.String变量.NET的另一个类比有点类似:

const char* str;
它是指向常数的指针。您可以更改指针,但不能更改指针指向的内容

添加了2:您应该仔细阅读.NET中的值类型与引用类型。简而言之,值类型都是
struct
类型,引用类型都是
class
类型。赋值时(或从函数传递/返回时)复制值类型;引用类型是指针


注意这里有一个不直观的部分。类
对象
,它是所有类型的基类,是引用类型。然而,值类型继承自它,您可以将值类型分配给
object
类型的变量。如果您这样做,这将导致调用某个内容,并且需要复制该值,因此这是一个有点昂贵的操作。

您误解了所读内容。是的,字符串是不可变的。这意味着您不能更改现有字符串。此将不起作用:

string x = "Hello";
x[3] = 'q';
连接字符串时,会得到一个新字符串:

string a = "a";
string b = "b";
string c = a+b; // You get a new string and a and b are unchanged.
即使是自连接,也会得到一个新字符串:

string a = "a";
a += "b"; // The same as a = a + "b" and yields a new string.
但赋值给变量(或传递给函数