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

С#: разница между "System.Object" и "object"

В С# есть ли разница между использованием System.Object в коде, а не только object или System.String, а не string и т.д.? Или это просто вопрос стиля?

Есть ли причина, почему одна форма предпочтительнее другой?

4b9b3361

Ответ 1

string является псевдонимом для global::System.String. Это просто синтаксический сахар. Эти два являются абсолютно взаимозаменяемыми почти во всех случаях, и не будет никакой разницы в скомпилированном коде.

Лично я использую псевдонимы для имен переменных и т.д., но я использую имена типов CLR для имен в API, например:

public int ReadInt32() // Good, language-neutral

public int ReadInt() // Bad, assumes C# meaning of "int"

(Обратите внимание, что тип возврата на самом деле не является именем - он кодируется как тип в метаданных, поэтому там нет путаницы.)

Единственное, что я знаю о том, где можно использовать, а другое не может (что я знаю):

  • nameof запрещает использование псевдонимов
  • При указании базового типа базы перечисления могут использоваться только псевдонимы

Ответ 2

Тип объекта - это псевдоним для System.Object. Тип объекта используется и отображается как ключевое слово. Я думаю, что это имеет какое-то отношение к наследию, но это просто дикая догадка.

Посмотрите эту страницу MSDN для всех деталей.

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

Ответ 3

Один - это псевдоним другого. Его стиль.

Ответ 4

string является псевдонимом для global::System.String и object для global::System.Object

Если у вас есть using System; в вашем классе, string/string и object/object функционально идентичны, а использование - это вопрос стиля.

(EDIT: удалено слегка вводящая в заблуждение цитата, согласно комментарию Jon Skeet)

Ответ 5

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

Стиль заглавного наименования - это правило именования ISO. Это более общий, общий; заставляет те же правила именования для всех объектов в источнике без исключений, как у компилятора С#.

Ответ 6

Насколько мне известно, я знаю, что это ярлык, проще использовать строку, а не System.string.

Но будьте осторожны, разница между строкой и строкой (С# чувствительна к регистру)

Ответ 7

string (с нижним регистром "s" ) является строковым типом языка С#, а тип System.String - это реализация string в платформе .NET.

На практике нет никакой разницы, кроме стилистических.

РЕДАКТИРОВАТЬ:. Так как вышеуказанное явно недостаточно ясно, между ними нет разницы, они являются одним и тем же типом после компиляции. Я объяснял семантическую разницу, которую видит компилятор (это просто синтаксический сахар, очень похожий на разницу между временем и циклом).

Ответ 8

объект, int, long и bool были предоставлены как обучающие колеса для инженеров, которые не могли адаптироваться к идее, что типы данных не являются фиксированной частью языка. С#, в отличие от языков, которые были до него, не имеет ограничений на количество типов данных, которые вы можете добавить. Библиотека "System" предоставляет стартовый комплект с такими полезными типами, как System.Int32, System.Boolean, System.Double, System.DateTime и т.д., Но инженерам предлагается добавлять свои собственные. Поскольку Microsoft заинтересована в быстром внедрении своего нового языка, они предоставили псевдонимы, которые заставили его выглядеть так, как будто язык был более похожим на C, но эти псевдонимы являются полностью доступной функцией (С# будет таким же хорошим языком, если вы удалил все встроенные псевдонимы, возможно, лучше).

В то время как StyleCop обеспечивает принудительное использование устаревших псевдонимов C-стиля, это является пороком для логического набора правил. На данный момент я не слышал ни единого обоснования для этого правила (SA1121), которое не было основано на догме. Если вы считаете, что SA1121 логичен, то почему нет типа buildin для datetime?