c #: diferença entre “System.Object” e “object”

Em C #, existe alguma diferença entre usar System.Object no código em vez de apenas object ou System.String vez de string de string e assim por diante? Ou é apenas uma questão de estilo?

Existe uma razão pela qual uma forma é preferível à outra?

string é um apelido para global::System.String . É simplesmente açúcar sintático. Os dois são exatamente intercambiáveis ​​em quase todos os casos, e não haverá diferença no código compilado.

Pessoalmente, eu uso os aliases para nomes de variables, etc, mas eu uso os nomes de tipos CLR para nomes em APIs, por exemplo:

 public int ReadInt32() // Good, language-neutral public int ReadInt() // Bad, assumes C# meaning of "int" 

(Observe que o tipo de retorno não é realmente um nome – ele é codificado como um tipo nos metadados, portanto não há confusão lá.)

Os únicos lugares que eu conheço onde um pode ser usado e o outro não (que eu saiba) são:

  • nameof proíbe o uso de aliases
  • Ao especificar um tipo subjacente de base de enum, somente os aliases podem ser usados

O tipo de object é um alias para System.Object . O tipo de object é usado e mostrado como uma palavra-chave. Eu acho que tem algo a ver com o legado, mas isso é apenas um palpite.

Dê uma olhada nesta página do MSDN para todos os detalhes.

Eu prefiro o uso das versões em minúsculas, mas sem razões especiais. Só porque o realce de syntax é diferente nesses tipos “básicos” e não preciso usar a tecla Shift ao digitar …

Um é um alias para o outro. É até o estilo.

string é um alias para global::System.String e object para global::System.Object

Fornecendo você using System; na sua class, String / string e Object / object são funcionalmente idênticos e o uso é uma questão de estilo.

(EDIT: removido citação ligeiramente enganosa , de acordo com o comentário de Jon Skeet)

Não há diferença. Há um número de tipos, chamados Primitive Data Types, que são tratados pelo compilador em estilo que você mencionou.

O estilo de nomenclatura capitalizado é a regra de nomenclatura ISO. É mais geral, comum; força as mesmas regras de nomenclatura para todos os objects na origem, sem exceções, como o compilador C # possui.

Pelo que sei, sei que é um atalho, é mais fácil usar string, em vez de System.string.

Mas tenha cuidado, há uma diferença entre String e string (c # faz distinção entre maiúsculas e minúsculas)

string (com a minúscula “s”) é o tipo de string da linguagem C # e o tipo System.String é a implementação da string na estrutura .NET.

Na prática, não há diferença além das estilísticas.

EDIT: Como o acima exposto obviamente não foi claro o suficiente, não há diferença entre eles, eles são o mesmo tipo, uma vez compilado. Eu estava explicando a diferença semântica que o compilador vê (que é apenas açúcar sintático, muito parecido com a diferença entre while e for loop).

object , int , long e bool foram fornecidos como rodinhas de treinamento para engenheiros que tiveram problemas para se adaptar à idéia de que os tipos de dados não eram uma parte fixa da linguagem. C #, ao contrário dos idiomas anteriores, não tem limite no número de tipos de dados que você pode adicionar. A biblioteca ‘System’ oferece um kit inicial com tipos úteis como System.Int32 , System.Boolean , System.Double , System.DateTime e assim por diante, mas os engenheiros são incentivados a adicionar os seus próprios. Como a Microsoft estava interessada na rápida adoção de seu novo idioma, eles forneceram apelidos que faziam parecer que a linguagem era mais ‘C’, mas esses apelidos são um recurso completamente descartável (C # seria uma linguagem tão boa se você removeu todos os aliases do build-in, provavelmente melhor).

Embora o StyleCop imponha o uso dos aliases herdados do estilo C, isso é uma falha em um conjunto de regras lógicas. Até o momento, não ouvi uma única justificativa para essa regra (SA1121) que não fosse baseada em dogma. Se você acha que o SA1121 é lógico, por que não há um tipo de buildin para datetime ?