我有一个类型的对象Foo.
Foo有一个Id(int)
a)代码是否"好"?
b)如果两者都为空,我应该返回什么?
// overload operator ==
public static bool operator ==(Foo a, Foo b)
{
if (ReferenceEquals(x, y))
{
return true;
}
if (x == null && y == null)
{
return // ???
}
if (x == null || y == null)
{
return false;
}
return x.Id == y.Id; // Ids are the same
}
public static bool Equals(Foo x, Foo y)
{
return x == y;
}
Run Code Online (Sandbox Code Playgroud)
编辑:
c)Equals方法应该调用==运算符,还是反之?
最后一个问题
d)ReferenceEquals(x, y) == true AND 可能
x.Id != y.Id吗?
Row*_*haw 14
这实际上是无法访问的代码,如ReferenceEquals()被记录返回true如果两个操作数都为空.
编辑:专门回答你的观点(d):当ReferenceEquals返回时true,两个引用必须相同; 所以他们指向同一个对象.因此,除非您在属性访问器中执行不可预测的操作,否则将从同一对象读取Id的值,并且预期它们将是相同的.(这里的故事的道德是,属性应该以可重复的方式表现,没有其他副作用,如果没有已经设置可能分配ID)
完全有可能你有两个具有相同Id但不同引用的对象.例如:
Foo a = new Foo();
Foo b = new Foo();
Run Code Online (Sandbox Code Playgroud)
ReferenceEquals()在比较a和b(因为它们是不同的实例)时会给出错误,但除非该构造函数做了类似分配的事情,否则Id我希望它们共享该Id并且您的等式检查将通过.
是
null只是内部指针,零值.所以它比较两个值为零的引用.
事实上,object.ReferenceEquals(null, null)因为这个事实总是如此,所以你不需要第二次检查.
if (ReferenceEquals(x, y))
{
return true;
}
if (x == null && y == null) // THIS CHECK IS REDUNDANT!!!
{
return true;
}
Run Code Online (Sandbox Code Playgroud)
在最后一点,==和Equals处理相同,除非在盒装值类型上:
object s1 = 2;
object s2 = 1+1;
Console.WriteLine(s1 == s2);
Console.WriteLine(s1.Equals(s2));
Run Code Online (Sandbox Code Playgroud)
这产生false和true.
d点:NO是相同的对象,相同的内存空间-如果它们指向的对象上的字段.
| 归档时间: |
|
| 查看次数: |
5551 次 |
| 最近记录: |