C#中Equals返回true,但==返回false。

24 浏览
0 Comments

C#中Equals返回true,但==返回false。

这是我的数据集的一部分数据:\n\"enter\n请查看第16行和第17行的数据(partno列),其数值为\"CTS04\",但是当我后续进行检查时,出现了以下情况:\n\"enter\npartno列的数据类型是字符串,第17行的数据是使用以下代码手动创建的:\n

DataRow newRow = ds.Tables[tableToAdd].Rows.Add();
newRow["partno"] = ds.Tables[tableToAdd].Rows[i - 1]["partno"];

\n因此,从逻辑上讲,我只是尝试从上一行复制partno,但为什么当我使用\"==\"运算符检查值时,结果为false?

0
0 Comments

在C#中,有时候我们会遇到一个奇怪的问题:当使用Equals方法比较两个对象时,它返回了true,但是当使用==运算符比较这两个对象时,它返回了false。这种情况可能会让我们感到困惑,这篇文章将帮助我们了解出现这个问题的原因以及解决方法。

出现这个问题的原因是==运算符和Equals方法在比较对象时使用了不同的逻辑。==运算符比较的是对象的引用,而Equals方法比较的是对象的值。具体来说,在这个问题中,==运算符比较的是数据行(Data Rows)的引用,而Equals方法比较的是数据行的值。

比如说,我们有两个数据行A和B,它们的值相同,但是它们是两个不同的对象。当我们使用==运算符比较这两个数据行时,它会比较它们的引用,因此返回了false。而当我们使用Equals方法比较这两个数据行时,它会比较它们的值,因此返回了true。

解决这个问题的方法是,我们可以使用Equals方法来比较对象的值,而不是使用==运算符来比较对象的引用。通过这种方式,我们可以确保我们比较的是对象的值,而不是对象的引用。

下面是一个示例代码,演示了这个问题的出现以及解决方法:

DataRow row1 = new DataRow(1, "John");
DataRow row2 = new DataRow(1, "John");
// 使用==运算符比较数据行的引用
bool result1 = (row1 == row2); // 返回false
// 使用Equals方法比较数据行的值
bool result2 = row1.Equals(row2); // 返回true

在这个示例中,我们创建了两个数据行row1和row2,它们的值相同。当我们使用==运算符比较这两个数据行时,它返回了false。而当我们使用Equals方法比较这两个数据行时,它返回了true。

通过这个示例,我们可以看到,当我们想要比较对象的值时,应该使用Equals方法而不是==运算符。这样可以避免出现上述问题。

总结起来,==运算符和Equals方法在比较对象时使用了不同的逻辑,导致了在某些情况下出现了C# Equals返回true但==返回false的问题。解决这个问题的方法是使用Equals方法来比较对象的值,而不是使用==运算符来比较对象的引用。

0
0 Comments

在C#中,当我们比较对象时,使用的是等号运算符(==),它执行的是“ReferenceEquals”的操作。而对于简单类型,比如数字和字符串,这个运算符执行的是值比较。

然而,在某些情况下,我们可能会遇到一个问题:使用等号运算符(==)返回false,而使用Equals方法返回true。这是因为在这些情况下,我们比较的对象并不是简单类型,而是复杂的对象。

一个典型的例子是在访问数据库时。假设我们有一个DataSet对象(ds),其中包含一个名为tableToAdd的表,我们想要比较该表的某一行的某个字段(partno)是否与某个值相等。我们可能会这样写代码:

ds.Tables[tableToAdd].Rows[i - 1]["partno"] == someValue

然而,这样的比较很可能会返回false,即使字段的值与someValue相等。这是因为ds.Tables[tableToAdd].Rows[i - 1]["partno"]并不返回一个简单的值,而是一个对象。因此,使用等号运算符(==)比较的是对象的引用,而不是对象的值。

要解决这个问题,我们可以使用Equals方法进行比较,因为它执行的是值比较。所以上述代码应该改为:

ds.Tables[tableToAdd].Rows[i - 1]["partno"].Equals(someValue)

这样就可以正确地比较字段的值是否与someValue相等了。

另外,我们还可以通过调用GetType()方法来检查ds.Tables[tableToAdd].Rows[i - 1]["partno"]的类型。这样可以帮助我们理解为什么使用等号运算符(==)和Equals方法会得到不同的结果。

总之,在C#中,当比较复杂对象时,使用等号运算符(==)和Equals方法可能会得到不同的结果。为了避免这个问题,我们应该使用Equals方法进行值比较,并且在需要时检查对象的类型。

0
0 Comments

C#中出现`Equals`返回`true`但`==`返回`false`的问题是因为`DataRow[index]`方法返回的内容被强制转换为`object`类型。所以当使用` == `进行比较时,会使用`object`类型的相等比较,只有当这两个对象之间存在引用相等性时,结果才会为`true`。

然而,实际上这些值是字符串类型,因此希望使用基于字符串的比较。如果要使用`==`进行比较,则需要将它们转换为字符串。或者使用重载了字符串类型的`.Equals()`方法进行比较。

以下是一个示例代码:

object a = "foo";
object b = new StringBuilder("foo").ToString();
Console.WriteLine(a == b); // false
Console.WriteLine((string)a == (string)b); // true
Console.WriteLine(a.Equals(b)); // true

以上代码中,首先将`a`赋值为字符串"foo",然后将`b`赋值为通过`new StringBuilder("foo").ToString()`创建的新的字符串对象。这样做是为了确保我们得到的是一个新的字符串对象,而不是在编译时创建的常量"foo"。

输出结果为:

false
true
true

这表明使用`==`进行比较时,结果为`false`;而使用`(string)a == (string)b`或`a.Equals(b)`进行比较时,结果为`true`。

更多信息请参见[为什么要使用String.Equals而不是==?](https://stackoverflow.com/questions/1659097)和[C#中==和Equals()的区别](https://stackoverflow.com/questions/814878)。

0