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。。。