В С# есть ли разница между использованием System.Object
в коде, а не только object
или System.String
, а не string
и т.д.? Или это просто вопрос стиля?
Есть ли причина, почему одна форма предпочтительнее другой?
В С# есть ли разница между использованием System.Object
в коде, а не только object
или System.String
, а не string
и т.д.? Или это просто вопрос стиля?
Есть ли причина, почему одна форма предпочтительнее другой?
string
является псевдонимом для global::System.String
. Это просто синтаксический сахар. Эти два являются абсолютно взаимозаменяемыми почти во всех случаях, и не будет никакой разницы в скомпилированном коде.
Лично я использую псевдонимы для имен переменных и т.д., но я использую имена типов CLR для имен в API, например:
public int ReadInt32() // Good, language-neutral
public int ReadInt() // Bad, assumes C# meaning of "int"
(Обратите внимание, что тип возврата на самом деле не является именем - он кодируется как тип в метаданных, поэтому там нет путаницы.)
Единственное, что я знаю о том, где можно использовать, а другое не может (что я знаю):
nameof
запрещает использование псевдонимовТип объекта - это псевдоним для System.Object. Тип объекта используется и отображается как ключевое слово. Я думаю, что это имеет какое-то отношение к наследию, но это просто дикая догадка.
Посмотрите эту страницу MSDN для всех деталей.
Я предпочитаю использовать версии с нижним регистром, но без особых причин. Просто потому, что подсветка синтаксиса отличается от этих "основных" типов, и я не должен использовать клавишу shift при вводе...
Один - это псевдоним другого. Его стиль.
string
является псевдонимом для global::System.String
и object
для global::System.Object
Если у вас есть using System;
в вашем классе, string
/string
и object
/object
функционально идентичны, а использование - это вопрос стиля.
(EDIT: удалено слегка вводящая в заблуждение цитата, согласно комментарию Jon Skeet)
Нет никакой разницы. Существует несколько типов, называемых Примитивные типы данных, которые создаются компилятором в стиле, о котором вы говорили.
Стиль заглавного наименования - это правило именования ISO. Это более общий, общий; заставляет те же правила именования для всех объектов в источнике без исключений, как у компилятора С#.
Насколько мне известно, я знаю, что это ярлык, проще использовать строку, а не System.string.
Но будьте осторожны, разница между строкой и строкой (С# чувствительна к регистру)
string
(с нижним регистром "s" ) является строковым типом языка С#, а тип System.String
- это реализация string
в платформе .NET.
На практике нет никакой разницы, кроме стилистических.
РЕДАКТИРОВАТЬ:. Так как вышеуказанное явно недостаточно ясно, между ними нет разницы, они являются одним и тем же типом после компиляции. Я объяснял семантическую разницу, которую видит компилятор (это просто синтаксический сахар, очень похожий на разницу между временем и циклом).
объект, int, long и bool были предоставлены как обучающие колеса для инженеров, которые не могли адаптироваться к идее, что типы данных не являются фиксированной частью языка. С#, в отличие от языков, которые были до него, не имеет ограничений на количество типов данных, которые вы можете добавить. Библиотека "System" предоставляет стартовый комплект с такими полезными типами, как System.Int32, System.Boolean, System.Double, System.DateTime и т.д., Но инженерам предлагается добавлять свои собственные. Поскольку Microsoft заинтересована в быстром внедрении своего нового языка, они предоставили псевдонимы, которые заставили его выглядеть так, как будто язык был более похожим на C, но эти псевдонимы являются полностью доступной функцией (С# будет таким же хорошим языком, если вы удалил все встроенные псевдонимы, возможно, лучше).
В то время как StyleCop обеспечивает принудительное использование устаревших псевдонимов C-стиля, это является пороком для логического набора правил. На данный момент я не слышал ни единого обоснования для этого правила (SA1121), которое не было основано на догме. Если вы считаете, что SA1121 логичен, то почему нет типа buildin для datetime?