С точки зрения дизайна, мне интересно, почему создатели .NET выбрали System.Object.GetType(), а не свойство System.Object.Type для чтения.
Это просто (очень незначительный) недостаток дизайна или там есть обоснование? Любые огни приветствуются.
С точки зрения дизайна, мне интересно, почему создатели .NET выбрали System.Object.GetType(), а не свойство System.Object.Type для чтения.
Это просто (очень незначительный) недостаток дизайна или там есть обоснование? Любые огни приветствуются.
Если вы посмотрите на объявление GetType() в Reflector, вы найдете следующее:
[MethodImplAttribute(MethodImplOptions.InternalCall)]
public extern Type GetType();
Какая эта комбинация атрибута и extern означает, что этот метод фактически реализован в неуправляемом коде внутри самой среды выполнения .NET. Вопрос GUID в в этой статье содержит дополнительную информацию. Они, очевидно, сделали это по соображениям производительности после определения того, что вычисление типа будет быстрее, если будет обработано на более низком уровне.
Это приводит к двум причинам: не применять метод GetType как свойство. Во-первых, вы не можете определять свойства extern, как вы можете, с помощью методов, поэтому его нужно будет обрабатывать в собственном .NET-коде. Во-вторых, даже если бы вы могли определить их как extern, выполнение небезопасного неуправляемого вызова внутри свойства, безусловно, нарушит правила использования свойств, поскольку гораздо труднее гарантировать отсутствие побочных эффектов.
В руководящих принципах указано, что свойство должно представлять состояние объекта, оно не должно быть дорогостоящим по производительности, и оно не должно иметь побочных эффектов, кроме вычисления/установки этого состояния. Я предполагаю, что GetType() не соблюдает эти правила, поэтому они сделали его методом.
GetType() - немного дорогая операция. Если бы это было свойство, оно поощряло бы использование, например,
DoStuff(obj.Type);
....
DoStuff(obj.Type);
и др.
вместо
Type type = obj.GetType();
DoStuff(type);
....
DoStuff(type);
и это было бы не так оптимально. Поэтому они сделали это методом, чтобы предположить, что его следует называть экономно.
Как я понимаю, в целом считается хорошей практикой для внутренних полей или значений, которые тривиальны для вычисления, которые могут быть выставлены с использованием свойства, и других значений, которые могут потребовать больше времени или других ресурсов для вычисления, используя метод.
Только Microsoft может ответить на этот вопрос, но я думаю, потому что несколько классов в .NET Framework создают свои перегруженные версии GetType() с дополнительными параметрами. Если бы это было свойство, они не могли использовать одно и то же имя (поскольку свойства не имеют параметров).
Только мои мысли по этому вопросу.
Немного поздно ответ, но рухнул на вопрос, пытаясь найти что-то связанное.
GetType может генерировать исключение. В руководящих принципах Framework указано, что свойства не должны генерировать исключения. Это еще одна причина, почему это должен быть метод вместо свойства.