当前位置: 首页 > 知识库问答 >
问题:

使用==运算符比较两个对象

羊舌涵涤
2023-03-14

我有一个检查两个变量引用的代码,我遇到了这个有点混乱的情况:

string first = "10";
object second = 10.ToString();
dynamic third = second;

Console.WriteLine($"{first == second}   {first == third}");

结果是:False-True

我的第一个问题是为什么第一个和第三个引用相等?如果第三个变量等于第二个变量,它应该是False,因为它们的对象引用不相等。

当我将值更改为“1”时,我感到困惑,如下所示:

string first = "1";
object second = 1.ToString();
dynamic third = second;

Console.WriteLine($"{first == second}   {first == third}");

然后结果变成:True True

为什么会这样?

共有3个答案

皇甫建木
2023-03-14

我不知道为什么当你把它从10改为1时它会改变,但我认为你的问题的一部分与关于极客的信息有关:

“在C#4.0中,引入了一种称为动态类型的新类型。它用于避免编译时类型检查。编译器在编译时不检查动态类型变量的类型,而是在运行时获取类型。”

麹正业
2023-03-14

第一个问题的答案是,字符串相等性不是基于对象引用,因为默认情况下引用类型是基于对象引用。

firstthird都是类型string,即使只在运行时已知,系统也是如此。调用字符串的运算符=覆盖,并:

...反过来,调用静态Equals(String,String)方法,该方法执行顺序(区分大小写和不区分区域性)比较。

(来源)

至于第二个问题(编辑)。。。见@GuruStron的答案。

我还将指出,Visual Studio 2022在first==第二处提供了CS0253编译器警告:

可能的非预期引用比较;要获得值比较,请将右侧转换为键入“字符串”

金何平
2023-03-14

我不知道为什么当你把它从10改为1时它会改变

我相信这是一个实现细节,你不应该依赖它(会尝试在规格中找到一些东西),但是一些正个位数缓存在。NET Core的int. ToString实现中。以下是UInt32ToDecStr的摘录,它在内部由int. ToString调用:

// For single-digit values that are very common, especially 0 and 1, just return cached strings.
if (bufferLength == 1)
{
    return s_singleDigitStringCache[value];
}

至于平等-请检查:

  1. C#==和等于()之间的差
  2. 字符串实习。Net框架。(编译器将插入字符串文本,因此它们都将指向内存中的同一地址)
  3. 使用类型动态

UPD:

无法在规格中找到任何东西,但下一个代码在. NET Framework和. NET 6中表现不同(前者打印11次False,后者打印10次True和1次False):

var dict = new Dictionary<int, string>()
{
    {0, "0"},
    {1, "1"},
    {2, "2"},
    {3, "3"},
    {4, "4"},
    {5, "5"},
    {6, "6"},
    {7, "7"},
    {8, "8"},
    {9, "9"},
    {10, "10"},
};

foreach(var kvp in dict)
{
    Console.WriteLine(object.ReferenceEquals(kvp.Key.ToString(), kvp.Value));
}
 类似资料:
  • 我用一个字段构造了一个类。然后创建了两个对象,并且必须使用运算符和对它们进行比较。以下是我所做的:

  • 问题内容: 我建立了一个领域的课程。然后,我创建了两个对象,我也必须使用运算符对其进行比较。这是我所做的: 问题答案: 比较对象引用,它检查两个操作数是否指向同一对象(不是等效对象,是同一对象)。 如果要比较字符串(以查看它们是否包含相同的字符),则需要使用来比较字符串。 在你的情况下,如果字符串匹配,则确实将两个居中实例视为相等,则: …但是通常,如果你要定义一个类,那么等效性要比单个字段的等效

  • 问题内容: 我需要使用位运算符比较两个整数。我遇到了一个问题,我必须不使用比较运算符就比较两个整数。使用位运算符会有所帮助。 假设a = 4;b = 5; 我们必须证明a不等于b。但是,我想进一步扩展它,例如,我们将显示哪个更大。这里b更大。 问题答案: 您至少需要将其与0进行比较,并且在概念上这是CPU所做的比较。例如 可以建模为等于,因为位必须相同才能返回0 如果这是你可以删除的,因为这可以暗

  • 我想比较ArrayList中的两个元素,我编写了以下代码: 结果为,但具有其他值,如: 我知道比较的是引用,而不是值,在这种情况下,这两个整数有不同的引用,因此从逻辑上讲,这两种情况都必须有。我不明白为什么我只对从的取而对其他取。 注:我在Stackoverflow和Google上看到很多问题,但我找不到我问题的答案

  • 问题内容: 稍微打错一下就遇到了这个问题(在Python 2.7.5中): 当它,我不小心爆炸了月亮。 我的理解是相当于和表现良好的类(如内置函数),相当于。 如果没有或运算符,那么我认为Python使用。 但是,这些方法都与工作对象,而与运营商 做 的工作。发生这种情况的原因是什么? 问题答案: 但是,当<和>运算符起作用时,这些方法都不能与函数对象一起起作用。发生这种情况的原因是什么? 在任何

  • 概述 比较运算符用于比较两个值的大小,然后返回一个布尔值,表示是否满足指定的条件。 2 > 1 // true 上面代码比较2是否大于1,返回true。 注意,比较运算符可以比较各种类型的值,不仅仅是数值。 JavaScript 一共提供了8个比较运算符。 > 大于运算符 < 小于运算符 <= 小于或等于运算符 >= 大于或等于运算符 == 相等运算符 === 严格相等运算符 != 不相等运算符