我在下面的代码片段中总结了我的问题
struct Point
{
public int X;
public int Y;
public Point(int x, int y)
{
this.X = x;
this.Y = y;
}
public override int GetHashCode()
{
return base.GetHashCode();
}
public void PrintValue()
{
Console.WriteLine(
"{0},{1}",
this.X, this.Y);
}
}
Run Code Online (Sandbox Code Playgroud)
上面的struct是从包含GetHashCode方法的ValueType派生的.下面是一个派生自Object和包含GetHashCode方法的类版本.
class Point
{
public int X;
public int Y;
public Point(int x, int y)
{
this.X = x;
this.Y = y;
}
public override int GetHashCode()
{
return base.GetHashCode();
}
public void PrintValue()
{
Console.WriteLine(
"{0},{1}",
this.X, this.Y);
}
}
Run Code Online (Sandbox Code Playgroud)
我只是想知道.这些实现之间有什么区别吗?
是; struct默认情况下,value-types 将其哈希码作为其字段值的组合.您可以尝试通过以下方式观察:
var s = new Point(1,2); // struct
Console.WriteLine(s.GetHashCode());
s.X = 22; // <=============== struct fields should usually be readonly!
Console.WriteLine(s.GetHashCode()); // different
Run Code Online (Sandbox Code Playgroud)
请注意,Equals遵守类似的规则.
相反,引用类型(class)使用,默认情况下,该参考本身两者GetHashCode()和Equals().该s.X = 22会不会影响一个class:
var s = new Point(1,2); // class
Console.WriteLine(s.GetHashCode());
s.X = 22;
Console.WriteLine(s.GetHashCode()); // same
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
138 次 |
| 最近记录: |