c #: diferencia entre “System.Object” y “object”

En C #, ¿hay alguna diferencia entre usar System.Object en el código en lugar de solo object , o System.String lugar de string y así sucesivamente? ¿O es solo una cuestión de estilo?

¿Hay alguna razón por la cual una forma es preferible a la otra?

string es un alias para global::System.String . Es simplemente azúcar sintáctica. Los dos son exactamente intercambiables en casi todos los casos, y no habrá diferencia en el código comstackdo.

Personalmente utilizo los alias para nombres de variables, etc., pero utilizo los nombres de tipo CLR para nombres en API, por ejemplo:

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

(Tenga en cuenta que el tipo de devolución no es realmente un nombre, está codificado como un tipo en los metadatos, por lo que no hay confusión allí).

Los únicos lugares que conozco donde uno puede usarse y el otro no (de lo que soy consciente) son:

  • nameof prohíbe el uso de alias
  • Al especificar un tipo subyacente base enum, solo se pueden usar los alias

El tipo de objeto es un alias para System.Object . El tipo de objeto se usa y se muestra como una palabra clave. Creo que tiene algo que ver con el legado, pero eso es solo una suposición descabellada.

Eche un vistazo a esta página de MSDN para más detalles.

Prefiero el uso de las versiones en minúscula, pero sin motivos especiales. Solo porque el resaltado de syntax es diferente en estos tipos “básicos” y no tengo que usar la tecla Mayús al escribir …

Uno es un alias para el otro. Se reduce al estilo.

string es un alias para global::System.String y object for global::System.Object

Siempre que tengas using System; en su clase, String / string y Object / object son funcionalmente idénticos y el uso es una cuestión de estilo.

(EDITAR: se eliminó una cita ligeramente engañosa , según el comentario de Jon Skeet)

No hay diferencia Hay una serie de tipos, llamados Tipos de datos primitivos que son amenazados por el comstackdor en el estilo que usted mencionó.

El estilo de denominación en mayúsculas es la regla de denominación ISO. Es más general, común; fuerza las mismas reglas de denominación para todos los objetos en la fuente sin excepciones como el comstackdor C #.

Por lo que sé, sé que es un atajo, es más fácil usar cadena, en lugar de System.string.

Pero tenga cuidado de que haya una diferencia entre cadena y cadena (c # es sensible a las mayúsculas y minúsculas)

string (con la “s” minúscula) es el tipo de cadena del lenguaje C # y el tipo System.String es la implementación de string en .NET framework.

En la práctica, no hay diferencia además de las estilísticas.

EDITAR: Dado que lo anterior obviamente no era lo suficientemente claro, no hay diferencia entre ellos, son del mismo tipo una vez comstackdos. Estaba explicando la diferencia semántica que ve el comstackdor (que es simplemente azúcar sintáctica, muy similar a la diferencia entre un ciclo y un ciclo).

object , int , long y bool se proporcionaron como ruedas de entrenamiento para los ingenieros que tenían problemas para adaptarse a la idea de que los tipos de datos no eran una parte fija del lenguaje. C #, a diferencia de los idiomas anteriores, no tiene límite en la cantidad de tipos de datos que puede agregar. La biblioteca ‘System’ proporciona un kit de inicio que incluye tipos útiles como System.Int32 , System.Boolean , System.Double , System.DateTime , etc., pero se recomienda a los ingenieros que agreguen los suyos propios. Debido a que Microsoft estaba interesado en la rápida adopción de su nuevo idioma, proporcionaron alias que lo hicieron parecer como si el lenguaje fuera más parecido a “C”, pero estos alias son una característica completamente desechable (C # sería un lenguaje tan bueno si eliminado todos los alias de comstackción, probablemente mejor).

Si bien StyleCop impone el uso de los alias de estilo C heredados, es una imperfección en un conjunto de reglas que, de otro modo, sería lógico. Hasta el momento, no he escuchado una sola justificación para esta regla (SA1121) que no se basó en el dogma. Si cree que SA1121 es lógico, ¿por qué no hay ningún tipo de buildin para datetime ?