Почему вы должны использовать предопределенные типы С#, а не псевдонимы в системном пространстве имен

В "Стандарте кодирования С#" Juval Lowy, доступном на www.idesign.net, рекомендуется использовать предопределенные типы С# вместо псевдонимов в пространстве имен System.

object NOT Object
string NOT String
int NOT Int32

В чем преимущество этого? Как они отличаются? Я следовал этому совету в своей собственной кодировке, но никогда не знал, как они отличаются.

Ответы

Ответ 1

Я думаю, что использование "синего" int, string и т.д. может быть немного интуитивным для чтения. В противном случае я использую класс при вызове на нем статического метода, т.е. Int32.TryParse()

Ответ 2

В большинстве случаев они неожиданно отличаются друг от друга, когда кто-то достаточно глуп, чтобы вызвать тип (или свойство /field/etc ) String (например), поскольку String всегда ссылается на global::System.String, где-as String может быть YourNamespace.String.

Ближе всего вы можете перейти к псевдониму С# @string, который имеет тенденцию торчать как больной палец.

Я предпочитаю псевдонимы С#.

btw, здесь интересный способ общаться с кем-либо с помощью dynamic слишком много:

using dynamic = System.Object;

Ответ 3

Они действительно не отличаются. Лично я тоже использую псевдонимы, но Джефф Рихтер выступает за полную противоположность. Сгенерированный код будет точно таким же. Используйте то, что вы найдете наиболее читаемым (и старайтесь быть последовательным).

Одна вещь, с которой большинство людей соглашается: при написании API используйте имя типа, а не псевдоним, поэтому:

int ReadInt32()

а не

int ReadInt()

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

В одном месте, где вы должны использовать псевдоним, указывается базовый тип для перечисления:

enum Foo : byte // Valid

enum Foo : System.Byte // Invalid

Ответ 4

В дополнение к тому, что сказал Джон, это еще одна разница.

var x = (Int32)-y;    // Does not compile.

var x = (int)-y;      // Negates the value of y and casts as an int.

Это из-за правила устранения неоднозначности грамматики, определенного в §7.6.6 спецификации языка программирования С#.

Ответ 5

Здесь другое отличие от компилятора:

public enum MyEnum : Byte {Value1, Value2} //does not compile

public enum MyEnum : byte {Value1, Value2} //ok

Ответ 6

Я всегда использую псевдонимы при указании типа в параметре, признаке свойства или метода или в поле (так: почти везде), за исключением случаев вызова статического члена для такого типа.

String.Format("{0}", 1);
Int32.Parse("123");
String.IsNullOrEmpty(value);

Ответ 7

Единственное отличие в том, что они лучше читать (это, конечно, вопрос мнения). Скомпилированный результат - это точно такой же байт-код.

Ответ 8

Генератор кода Entity Framework использует предопределенные типы, поэтому, если вы хотите полностью реализовать правила стиля кодирования Visual Studio 2017, вам нужно будет выбрать предопределенные типы (int вместо Int32 и т.д.). В противном случае ваш сгенерированный код не будет соответствовать.

(Опции- > Текстовый редактор- > С# → Стиль кода- > Общий- > предопределенный тип)