Подтвердить что ты не робот

Почему Object.GetType() метод вместо свойства?

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

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

и др.

вместо

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

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

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