c #: разница между "System.Object" и "object" - PullRequest
69 голосов
/ 19 июня 2009

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

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

Ответы [ 8 ]

67 голосов
/ 19 июня 2009

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

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

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

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

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

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

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

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

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

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

6 голосов
/ 19 июня 2009

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

3 голосов
/ 19 июня 2009

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

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

(ПРАВКА: удалено слегка вводящая в заблуждение цитата , согласно комментарию Джона Скита)

1 голос
/ 19 июня 2009

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

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

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

0 голосов
/ 11 июля 2013

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

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

0 голосов
/ 19 июня 2009

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

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

0 голосов
/ 19 июня 2009

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

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

...