我有一个检查两个变量引用的代码,我遇到了这个有点混乱的情况:
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
为什么会这样?
我不知道为什么当你把它从10改为1时它会改变,但我认为你的问题的一部分与关于极客的信息有关:
“在C#4.0中,引入了一种称为动态类型的新类型。它用于避免编译时类型检查。编译器在编译时不检查动态类型变量的类型,而是在运行时获取类型。”
第一个问题的答案是,字符串相等性不是基于对象引用,因为默认情况下引用类型是基于对象引用。
first
和third
都是类型string
,即使只在运行时已知,系统也是如此。调用字符串的运算符
=
覆盖,并:
...反过来,调用静态Equals(String,String)方法,该方法执行顺序(区分大小写和不区分区域性)比较。
(来源)
至于第二个问题(编辑)。。。见@GuruStron的答案。
我还将指出,Visual Studio 2022在
first==第二
处提供了CS0253编译器警告:
可能的非预期引用比较;要获得值比较,请将右侧转换为键入“字符串”
我不知道为什么当你把它从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];
}
至于平等-请检查:
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个比较运算符。 > 大于运算符 < 小于运算符 <= 小于或等于运算符 >= 大于或等于运算符 == 相等运算符 === 严格相等运算符 != 不相等运算符