C# 将类和结构与Dictionary.ContainsKey()一起使用有什么区别?

C# 将类和结构与Dictionary.ContainsKey()一起使用有什么区别?,c#,class,dictionary,struct,c#-2.0,C#,Class,Dictionary,Struct,C# 2.0,下面是我的字典定义示例。当我将DicKeys定义为类时,ContainsKey()不起作用。如果我将DicKeys更改为struct,它将正常工作 为什么ContainsKey()对类的工作方式与对结构的工作方式不同 Dictionary<DicKeys, DicVals> aDic = new Dictionary<DicKeys, DicVals>(); // original version as below public Class DicKeys {

下面是我的字典定义示例。当我将
DicKeys
定义为
类时,
ContainsKey()
不起作用。如果我将
DicKeys
更改为
struct
,它将正常工作

为什么
ContainsKey()
类的工作方式与对
结构的工作方式不同

Dictionary<DicKeys, DicVals> aDic = new Dictionary<DicKeys, DicVals>();

// original version as below
public Class DicKeys 
{
   public EnKey1 DicKeyItem1,
   public EnKey2 DicKeyItem2,
}

// revised version as below
public struct DicKeys
{
   public EnKey1 DicKeyItem1,
   public EnKey2 DicKeyItem2,
}

// common parts of code below
public enum EnKey1 
{
   A1,
   A2,
}

public enum EnKey2 
{
   B11,
   B12,
}

DicKeys aDicKey = new DicKeys();
// assigned value to aDicKey obj here;

if (aDic.ContainsKey(aDicKey ) == true)  
{
 // do some thing here
 // If I defined as 'class', it doesn't hit here.
 // Updated to 'struct', it hit here.
}
Dictionary aDic=newdictionary();
//原文如下
公共类密钥
{
公共密钥1 DicKeyItem1,
公共密钥2 DicKeyItem2,
}
//修订版本如下
公共结构密钥
{
公共密钥1 DicKeyItem1,
公共密钥2 DicKeyItem2,
}
//下面是代码的常见部分
公共枚举EnKey1
{
A1,
A2,
}
公共枚举EnKey2
{
B11,
B12,
}
DicKeys aDicKey=新DicKeys();
//此处为aDicKey obj赋值;
if(aDic.ContainsKey(aDicKey)=true)
{
//在这里做点什么
//如果我把它定义为“类”,它就不会出现在这里。
//更新为“struct”,点击这里。
}

好吧,你还没有显示你在哪里填充字典或者什么是
sfTKey
。。。但我强烈怀疑这是因为您没有在
DicKeys
中重写
Equals
GetHashCode

默认情况下,类使用引用标识来表示相等-换句话说,两个关键引用只有在引用完全相同的对象时才会作为相等进行比较。您可以重写
Equals
GetHashCode
以基于对象的内容提供相等性。值类型(struct)自动使用基于值的相等性,但我当然不建议使用这里提到的可变结构。(老实说,我根本不建议使用公共字段。)


有关在
Equals
GetHashCode
中可能执行的操作的示例,请参阅,以及您可能希望在基于值的相等类型上提供的其他一些成员。

好吧,您还没有显示在哪里填充字典或
sfTKey
是什么。。。但我强烈怀疑这是因为您没有在
DicKeys
中重写
Equals
GetHashCode

默认情况下,类使用引用标识来表示相等-换句话说,两个关键引用只有在引用完全相同的对象时才会作为相等进行比较。您可以重写
Equals
GetHashCode
以基于对象的内容提供相等性。值类型(struct)自动使用基于值的相等性,但我当然不建议使用这里提到的可变结构。(老实说,我根本不建议使用公共字段。)


有关您可能在
Equals
GetHashCode
中执行的操作的示例,请参阅,以及您可能希望在基于值的相等类型上提供的其他一些成员。

对不起,
sfTKey
应该是
aDicKey
。对我的案例进行了验证并成功分配。根据我的实践,我确信它是由
class
struct
的关键字引起的。@Nano:更改变量的名称没有任何区别。您仍然没有显示在哪里填充词典。是的,它不会对我完成的代码中的
Equals
GetHashCode
执行任何重写操作。我会介入的。谢谢。对不起,
sfTKey
应该是
aDicKey
。对我的案例进行了验证并成功分配。根据我的实践,我确信它是由
class
struct
的关键字引起的。@Nano:更改变量的名称没有任何区别。您仍然没有显示在哪里填充词典。是的,它不会对我完成的代码中的
Equals
GetHashCode
执行任何重写操作。我会介入的。谢谢。@Xaqron,为我的输入错误感到抱歉,应该是
aDicKey
。不要怀疑,但是公共类DicKeys,C类应该是C…@Xaqron,为我的输入错误感到抱歉,应该是
aDicKey
。不要怀疑,但是公共类DicKeys,C类应该是C。。。