В чем разница между использованием класса и структуры с Dictionary.ContainsKey ()? - PullRequest
0 голосов
/ 14 декабря 2010

Ниже приведен пример определения моего словаря. Когда я определяю DicKeys как class, ContainsKey() не работает. Если я изменю DicKeys на struct, он будет работать правильно.

Почему ContainsKey() работает для class иначе, чем для struct?

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.
}

1 Ответ

4 голосов
/ 14 декабря 2010

Ну, вы еще не показали, где вы заполняете словарь или что такое sfTKey ... но я сильно подозреваю, что это потому, что вы не переопределили Equals или GetHashCode в DicKeys.

По умолчанию классы используют ссылочный идентификатор для равенства - другими словами, две ключевые ссылки будут сравниваться как равные, только если они ссылаются на один и тот же объект. Вы можете переопределить Equals и GetHashCode, чтобы обеспечить равенство на основе содержимого объектов. Типы значений (структуры) автоматически используют равенство на основе значений, но я, конечно, не рекомендую использовать изменяемую структуру, как вы получили здесь. (Если честно, я бы вообще не рекомендовал использовать открытые поля.)

См. в этом вопросе для примера того, что вы могли бы делать в Equals и GetHashCode - и некоторых других членах, которые вы, возможно, захотите предоставить для типов, имеющих равенство на основе значений.

...