- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
为什么 ThrowIfNull
实现为:
static void ThrowIfNull<T>(this T argument, string name) where T : class
{
if (argument == null)
{
throw new ArgumentNullException(name);
}
}
重写为:
不是更好吗? static void ThrowIfNull<T>(this T argument, string name) where T : class
{
if (object.ReferenceEquals(argument, null))
{
throw new ArgumentNullException(name);
}
}
优点:它有助于避免混淆 Equals
重载,并可能使代码更清晰。
这有什么缺点吗?应该有一些。
最佳答案
两者没有区别。您混淆了覆盖 Equals
(这两个实现中都没有调用)与重载 ==
(这由于在编译时执行重载,并且编译器对 T
的了解不足,因此无法使用任何特定的重载)。
只是为了说明我的意思:
static void ThrowIfFoo<T>(this T argument, string name) where T : class
{
if (argument == "foo")
{
throw new Exception("You passed in foo!");
}
}
测试:
"foo".ThrowIfFoo(); // Throws
string x = "f";
x += "oo"; // Ensure it's actually a different reference
x.ThrowIfFoo(); // Doesn't throw
ThrowIfFoo
不知道 T
将是一个字符串 - 因为这取决于 调用 代码 - 并且重载决议只是在编译 ThrowIfFoo
时执行。因此它使用运算符 ==(object, object)
而不是 ==(string, string)
。
换句话说,它是这样的:
object foo1 = "foo";
string tmp = "f";
object foo2 = tmp + "oo";
Console.WriteLine(foo1.Equals(foo2)); // Prints True
Console.WriteLine(foo1 == foo2); // Prints false
Console.WriteLine((string) foo1 == (string) foo2); // Prints True
在最后一行,编译器知道它可以使用 == 的重载,因为两个操作数都有 编译时 类型的 string
。
关于c# - object.ReferenceEquals 或 == 运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7119594/
试图在 Visual Studio Professonal 2008 的测试功能中创建一个初始的、失败的单元测试时,我似乎无法让 Assert.ReferenceEquals() 在对象实例为 不等于
如图所示 here ,在运行时创建的字符串无法被保留。 但是,下面的代码: class Program { static void Main(string[] args) {
我只是好奇 .NET 中某些类和方法的背景,所以我只是想知道 ReferenceEquals 方法如何理解 2 个引用是否属于同一对象? 最佳答案 因为“相同的对象”意味着“内存中的相同位置”,并且该
在按照声明式风格编写的 .NET 程序中,ReferenceEquals() 有哪些合法用途? 最佳答案 不确定“按照声明式编写”是什么意思,但是 ReferenceEquals 通常在覆盖 == 运
为什么在这种情况下对象的 ReferenceEquals 方法表现不同? string a= "fg"; string b= "fg"; Console.WriteLine(object.Refere
private class global { public static int a = 0; public static int val = 0;
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
谁能告诉我为什么不满足以下条件? List timestamps = new List(); timestamps.Add(DateTime.Parse("8/5/2011 4:34:43 AM"))
自 C# 7.2 起,可以在结构上使用“ref”关键字来创建嵌入引用。如何确定两个结构变量是否指向同一个引用? ReferenceEquals 始终返回 false: 示例代码: struct MyS
我正在使用 Mono,在比较两个字符串的引用时遇到了一个有趣的结果。下面的代码演示了一个例子: using System; class Program { static void Main()
下面的代码如何打印 true? string x = new string(new char[0]); string y = new string(new char[0]); Console.Writ
在编写单元测试时,我想使用 Assert.AreSame(..)针对 Nullable类型,我得到了意想不到的结果。然后我意识到下面的代码失败了: int? k = 10; Assert.IsTrue
为什么 ThrowIfNull 实现为: static void ThrowIfNull(this T argument, string name) where T : class {
我对这三者的理解是: .Equals() 测试数据相等性(缺少更好的描述)。 .Equals() 可以为同一对象的不同实例返回 True,这是最常被覆盖的方法。 .ReferenceEquals()
当我使用 SlSvcUtil.exe 创建我的服务客户端文件时,我看到如下代码: private string CategoryField; [System.Runtime.Serialization
对于我正在编写的一些通用辅助方法,我希望能够在该值是其类型的默认值时调用特殊处理。对于引用类型,这很简单——默认值为 null。我不能使用泛型类型参数,尽管我可以解决这个问题。 我可以这样做: pub
有没有默认IEqualityComparer使用 ReferenceEquals 的实现? EqualityComparer.Default使用 ObjectComparer,它使用 object.E
考虑我正在审查的以下代码: public override bool Equals(object other) { return !object.ReferenceEquals(null, t
除非一个类专门覆盖为对象定义的行为,ReferenceEquals and == do the same thing ...比较引用。 在属性 setter 中,我常用的模式 private MyTy
如果 object.ReferenceEquals 返回 true,instance.Equals 是否应该始终返回 true? 如果下面的输出是通过/未通过,您会认为它的意外行为吗? Assert.
我是一名优秀的程序员,十分优秀!