Концептуально KeyValuePair<TKey,TValue>
— это просто пара переменных, Key
и Value
. Если бы Microsoft реализовала его с открытыми общедоступными полями Key
и Value
, его семантика была бы идеальной; при использовании в качестве управляющей переменной ForEach
она была бы неизменной, но можно было бы обновить поле ключа или значения обычной переменной или элемента массива без необходимости обновления другого.
К сожалению, Microsoft, похоже, не желает, чтобы типы фреймворков выставляли какие-либо общедоступные поля, даже для таких типов, как KeyValuePair<TKey,TValue>
или Drawing.Rectangle
, семантика которых диктует, что (1) тип должен быть структурой; (2) все его состояние видно в фиксированном наборе свойств (могут быть и другие вычисляемые свойства помимо тех, которые определяют состояние объекта), и (3) этим свойствам может быть присвоена любая комбинация значений, подходящая для их типов. Следовательно, Microsoft рассматривала возможность предоставления членов, составляющих состояние типов, только как свойства, доступные только для чтения, или как свойства для чтения и записи. Использование свойств чтения-записи будет означать, что такой код:
for each (var item in myDictionary)
item.Value += 1;
or
...assuming MyList is a List<Drawing.Rectangle>
MyList[3].Width += 9;
будет интерпретироваться существующим компилятором C# либо как
for each (var item in myDictionary)
{ var temp = item; temp .Value += 1; }
or
...assuming MyList is a List<Drawing.Rectangle>
{ temp = MyList[3]; temp.Width += 9; }
оба приводят к ужасному поведению, которое почти наверняка не соответствует намерениям программиста. Разработчики .net решили, что значение того, что члены KeyValuePair<TKey,TValue>
могут изменяться по отдельности, не оправдывает опасности, исходящей от первого, но полезность изменения отдельных членов Rectangle
была достаточной, чтобы оправдать опасность, создаваемую вторым. Обратите внимание, что ни один из примеров не должен был бы представлять какой-либо опасности, если бы типы использовали открытые поля, а не свойства, поскольку запись в поле временной структуры никогда не была разрешена, даже при вызове установщиков свойств.
person
supercat
schedule
12.12.2012