Почему Object.GetType () является методом, а не свойством? - PullRequest
12 голосов
/ 11 июня 2009

С точки зрения дизайна, мне интересно, почему создатели .NET выбрали System.Object.GetType () вместо свойства System.Object.Type только для чтения.

Это просто (очень незначительный) недостаток дизайна или есть какое-то обоснование? Любые огни приветствуются.

Ответы [ 5 ]

17 голосов
/ 11 июня 2009

Если вы посмотрите на объявление GetType () в Reflector, вы найдете это:

[MethodImplAttribute(MethodImplOptions.InternalCall)]
public extern Type GetType(); 

Что означает эта комбинация атрибута и extern, так это то, что этот метод фактически реализован в неуправляемом коде внутри самой среды выполнения .NET. Вопрос GUID в этой статье углубляется в детали. Очевидно, они сделали это по соображениям производительности, решив, что вычисление Type будет быстрее, если обработать его на более низком уровне.

Это приводит к двум причинам, по которым метод GetType не реализуется как свойство. Во-первых, вы не можете определять свойства extern так, как вы можете с помощью методов, поэтому это должно быть обработано в собственном коде .NET. Во-вторых, даже если бы вы могли определить их как внешние, выполнение небезопасного, неуправляемого вызова изнутри свойства определенно нарушило бы правила использования свойства, поскольку гораздо сложнее гарантировать отсутствие побочных эффектов.

7 голосов
/ 11 июня 2009

В руководствах говорится, что свойство должно представлять состояние объекта, оно не должно быть дорогостоящим с точки зрения производительности и не должно иметь побочных эффектов, кроме вычисления / установки этого состояния. Я предполагаю, что GetType () не соблюдает эти правила, поэтому они сделали его методом.

GetType () - это немного дорогая операция. Если бы это было свойство, это поощрило бы использование как

DoStuff(obj.Type);
....
DoStuff(obj.Type);

и т.д.

вместо

Type type = obj.GetType();
DoStuff(type);
....
DoStuff(type); 

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

3 голосов
/ 11 июня 2009

Только Microsoft может ответить на этот вопрос, но я думаю, это потому, что несколько классов в .NET Framework создают свои собственные перегруженные версии GetType () с дополнительными параметрами. Если бы это было свойство, они не могли бы использовать одно и то же имя (потому что свойства не имеют параметров).

Только мои мысли по этому вопросу.

3 голосов
/ 11 июня 2009

Насколько я понимаю, в целом считается хорошей практикой для внутренних полей или значений, которые тривиально рассчитать для выставления с использованием свойства, и для раскрытия других значений, которые могут потребовать больше времени или других ресурсов для вычисления используя метод.

2 голосов
/ 21 ноября 2009

Немного запоздалый ответ, но врезался в вопрос при попытке найти что-то связанное.

GetType может генерировать исключение. В руководящих принципах структуры указано, что свойства не должны вызывать исключения. Это еще одна причина, почему это должен быть метод, а не свойство.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...