Ejemplo ( tenga en cuenta el caso ):
string s = "Hello world!";
String s = "Hello world!";
¿Cuáles son las pautas para el uso de cada uno? ¿Y cuáles son las diferencias?
string
es un alias en C # para System.String
.
Entonces, técnicamente, no hay diferencia. Es como int
vs System.Int32
.
En cuanto a las pautas, generalmente se recomienda usar string
cada vez que se refiera a un objeto.
p.ej
string place = "world";
Del mismo modo, creo que generalmente se recomienda usar String
si necesita referirse específicamente a la clase.
p.ej
string greet = String.Format("Hello {0}!", place);
Parece que la orientación en esta área puede haber cambiado, ya que StyleCop ahora impone el uso de los alias específicos de C #.
string.Format()
. @KlitosG No, eso no es cierto. Todos funcionan exactamente igual.
nameof(string)
no compilará mientras que lo nameof(String)
hará.
Solo por completo, aquí hay un volcado de información relacionada ...
Como otros han señalado, string
es un alias para System.String
. Se compilan con el mismo código, por lo que en el momento de la ejecución no hay diferencia alguna. Este es solo uno de los alias en C #. La lista completa es:
object: System.Object
string: System.String
bool: System.Boolean
byte: System.Byte
sbyte: System.SByte
short: System.Int16
ushort: System.UInt16
int: System.Int32
uint: System.UInt32
long: System.Int64
ulong: System.UInt64
float: System.Single
double: System.Double
decimal: System.Decimal
char: System.Char
Aparte de string
y object
, los alias son todos para valorar tipos. decimal
es un tipo de valor, pero no un tipo primitivo en el CLR. El único tipo primitivo que no tiene un alias es System.IntPtr
.
En la especificación, los alias de tipo de valor se conocen como "tipos simples". Los literales se pueden usar para valores constantes de cada tipo simple; ningún otro tipo de valor tiene formas literales disponibles. (Compare esto con VB, que permite DateTime
literales y también tiene un alias).
Hay una circunstancia en la que tiene que utilizar los alias: al especificar explícitamente el tipo subyacente de una enumeración. Por ejemplo:
public enum Foo : UInt32 {} // Invalid
public enum Bar : uint {} // Valid
Eso es sólo una cuestión de la forma en la especificación define enumeración declaraciones - la parte después de los dos puntos tiene que ser el de tipo integral de producción, que es una muestra de sbyte
, byte
, short
, ushort
, int
, uint
,long
, ulong
, char
... en lugar de un tipo de producción, utilizado por las declaraciones de variables, por ejemplo. No indica ninguna otra diferencia.
Finalmente, cuando se trata de qué usar: personalmente uso los alias en todas partes para la implementación, pero el tipo CLR para cualquier API. Realmente no importa demasiado lo que use en términos de implementación: la consistencia entre su equipo es agradable, pero a nadie más le importará. Por otro lado, es realmente importante que si se refiere a un tipo en una API, lo haga de forma neutral en cuanto al idioma. Un método llamado ReadInt32
no es ambiguo, mientras que un método llamado ReadInt
requiere interpretación. La persona que llama podría estar usando un lenguaje que define un int
alias para Int16
, por ejemplo. Los diseñadores marco .NET han seguido este patrón, buenos ejemplos de estar en las BitConverter
, BinaryReader
y Convert
las clases.
string
y String
es que string' is a keyword in c#, so you can not use it as a variable name.For Ex:
string string = "hi"; //compiler error, but
String String = "hi"; `es aceptable, ya que String
es un identificador, no una palabra clave.
@string
para crear un identificador que termine como string
si así fuera. Es una especie de mecanismo de escape.
String
significa System.String
y es un tipo de .NET Framework. string
es un alias en el lenguaje C # para System.String
. Ambos están compilados System.String
en IL (lenguaje intermedio), por lo que no hay diferencia. Elige lo que te gusta y úsalo. Si codifica en C #, preferiría string
que sea un alias de tipo C # y bien conocido por los programadores de C #.
Puedo decir lo mismo sobre ( int
, System.Int32
) etc.
int
se define en la especificación del lenguaje C # como un entero de 32 bits, independientemente del hardware. C #, a pesar de una herencia compartida en las brumas del tiempo, en realidad no es C. Cambiar int
a un entero de 64 bits sería un cambio radical en la especificación y el idioma. También requeriría redefinir long
, ya long
que actualmente es el entero de 64 bits. La otra razón para no preocuparse es irrelevante ya que los tipos nunca cambiarán, pero .NET es lo suficientemente abstracto como para que el 99% del tiempo no tenga que pensar en ello de todos modos. ;-)
Int16
, Int32
y Int64
es mucho más transparente en el código que usar el no short
int
long
La mejor respuesta que he escuchado sobre el uso de los alias de tipo proporcionados en C # proviene de Jeffrey Richter en su libro CLR Via C # . Aquí están sus 3 razones:
- He visto a varios desarrolladores confundidos, sin saber si usar string o String en su código. Debido a que en C # la cadena (una palabra clave) se asigna exactamente a System.String (un tipo de FCL), no hay diferencia y se puede usar.
- En C #, long se asigna a System.Int64 , pero en un lenguaje de programación diferente, long podría asignarse a Int16 o Int32 . De hecho, C ++ / CLI de hecho trata durante mucho tiempo como un Int32 . Alguien que lea el código fuente en un idioma podría malinterpretar fácilmente la intención del código si estuviera acostumbrado a programar en un lenguaje de programación diferente. De hecho, la mayoría de los idiomas ni siquiera tratar larga como palabra clave y no el código de compilación que lo utiliza.
- El FCL tiene muchos métodos que tienen nombres de tipo como parte de sus nombres de método. Por ejemplo, el tipo BinaryReader ofrece métodos como ReadBoolean , ReadInt32 , ReadSingle , etc., y el tipo System.Convert ofrece métodos como ToBoolean , ToInt32 , ToSingle , etc. Aunque es legal escribir el siguiente código, la línea con flotante me parece muy poco natural, y no es obvio que la línea sea correcta:
BinaryReader br = new BinaryReader(...);
float val = br.ReadSingle(); // OK, but feels unnatural
Single val = br.ReadSingle(); // OK and feels good
Entonces ahí lo tienes. Creo que todos estos son puntos realmente buenos. Sin embargo, no me encuentro usando los consejos de Jeffrey en mi propio código. Tal vez estoy demasiado atascado en mi mundo C # pero termino tratando de hacer que mi código se vea como el código marco.
string
, int
etc.
long
se define como un entero de 64 bits con signo, independientemente de la plataforma o el compilador. Por lo que en algunos casos al menos, eso sí, que no depende de la lengua.
string
es una palabra reservada, pero String
es solo un nombre de clase. Esto significa que string
no se puede usar como un nombre de variable por sí mismo.
Si por alguna razón quisieras una variable llamada cadena , solo verías la primera de estas compilaciones:
StringBuilder String = new StringBuilder(); // compiles
StringBuilder string = new StringBuilder(); // doesn't compile
Si realmente desea un nombre de variable llamado cadena , puede usarlo @
como prefijo:
StringBuilder @string = new StringBuilder();
Otra diferencia crítica: Stack Overflow los resalta de manera diferente.
@string
tiene mucho sentido, ya que los nombres de los locales solo están presentes en los PDB. También podría llamarlo _string
o algo así. Tiene más sentido para cosas que tienen nombres accesibles a través de la reflexión, donde @string
estaría el nombre de un miembro "string"
.
Hay una diferencia : no se puede usar String
sin using System;
antes.
using
declaraciones que necesito y elimino explícitamente todo lo que no. Herramientas de productividad de energía> "[x] Eliminar y formatear usos al guardar"
internal sealed
.
Ha sido cubierto arriba; sin embargo, no puedes usar string
en la reflexión; debes usar String
.
typeof(string)
en la reflexión. Ejemplo uno: if (someMethodInfo.ReturnType == typeof(string)) { ... }
Ejemplo dos: var p = typeof(string).GetProperty("FirstChar", BindingFlags.NonPublic | BindingFlags.Instance);
¿Dónde es lo que debe usar String
, no string
? Si intenta cosas como Type.GetType("String")
o Type.GetType("string")
, tampoco encontrará la clase porque falta el espacio de nombres. Si por alguna tonta razón comparas .Name
un tipo con "string"
mayúsculas y minúsculas, tienes razón.
System.String
es la clase de cadena .NET, en C # string
es un alias para System.String
, por lo que en uso son lo mismo.
En cuanto a las pautas, no me atascaría demasiado y solo usaría lo que desee: hay cosas más importantes en la vida y el código será el mismo de todos modos.
Si ustedes se encuentran la construcción de sistemas en los que es necesario especificar el tamaño de los enteros que está utilizando y por lo que tienden a usar Int16
, Int32
, UInt16
, UInt32
etc, entonces puede ser que parezca más natural de utilizar String
- y cuando tenga que desplazarse entre diferentes lenguajes .NET que podría hacer las cosas más comprensibles; de lo contrario, usaría string e int.
short
, int
, ushort
, uint
en lugar de Int16
, etc. Sobre todo porque esta es la forma en que aprendí. Por supuesto, Int16
es más fácil de entender de inmediato para aquellos con menos experiencia. +1 De mi parte!
Prefiero los .NET
tipos en mayúscula (en lugar de los alias) por razones de formato. Los .NET
tipos tienen el mismo color que otros tipos de objetos (los tipos de valor son objetos adecuados, después de todo).
Las palabras clave condicionales y de control (como if
, switch
y return
) son minúsculas y de color azul oscuro (de forma predeterminada). Y preferiría no tener el desacuerdo en el uso y el formato.
Considerar:
String someString;
string anotherString;
Int32 i=1;
lugar de int i = 1;
encontrar que el primero es más legible en cuanto a mi intención: es decir, que quiero un entero con signo de 32 bits.
var
string
y String
son idénticos en todos los sentidos (excepto la "S" mayúscula). No hay implicaciones de rendimiento de ninguna manera.
string
Se prefiere la minúscula en la mayoría de los proyectos debido al resaltado de sintaxis
C # es un lenguaje que se usa junto con el CLR.
string
es un tipo en C #.
System.String
es un tipo en el CLR.
Cuando use C # junto con el CLR string
se asignará a System.String
.
Teóricamente, podría implementar un compilador C # que generó el código de bytes de Java. Una aplicación sensata de este compilador probablemente mapa string
a java.lang.String
fin de interoperar con la biblioteca de tiempo de ejecución de Java.
string
no es un tipo en C #; es una palabra reservada que se asigna a un tipo en el CLR.
Este YouTube video de demuestra prácticamente cómo se diferencian.
Pero ahora para una larga respuesta textual.
Cuando hablamos de que .NET
hay dos cosas diferentes, una hay un .NET
marco y la otra hay idiomas ( C#
, VB.NET
etc.) que usan ese marco.
" System.String
" aka "String" ("S" mayúscula) es un .NET
tipo de datos de marco mientras que "string" es un C#
tipo de datos.
En resumen "String" es un alias (la misma cosa llamada con diferentes nombres) de "string". Entonces, técnicamente, las dos declaraciones de código a continuación darán el mismo resultado.
String s = "I am String";
o
string s = "I am String";
Del mismo modo, hay alias para otro tipo de datos de C # como se muestra a continuación: -
object:, System.Object
string:, System.String
bool:, System.Boolean
byte:, System.Byte
sbyte:, System.SByte
short: System.Int16
y así sucesivamente
Ahora la pregunta del millón de dólares desde el punto de vista del programador Entonces, ¿cuándo usar "String" y "string"?
Lo primero para evitar confusiones es usar uno de ellos constantemente. Pero desde la perspectiva de las mejores prácticas, cuando se hace una declaración de variables, es bueno usar "cadena" (pequeña "s") y cuando se usa como un nombre de clase, se prefiere "Cadena" ("S" mayúscula).
En el siguiente código, el lado izquierdo es una declaración variable y se declara usando "string". En el lado derecho estamos llamando a un método para que "String" sea más sensible.
string s = String.ToUpper() ;
String
, sugiera que "simplifique su código", llevándolo a string
...
La minúscula string
es un alias para System.String
. Son lo mismo en C#
.
Hay un debate sobre si se debe utilizar el tipo de sistema ( System.Int32
, System.String
, etc.) o el tipoC# aliases
( int
, string
, etc.). Personalmente, creo que deberías usar el C# aliases
, pero esa es solo mi preferencia personal.
string
es solo un alias para System.String
. El compilador los tratará de manera idéntica.
La única diferencia práctica es el resaltado de sintaxis como mencionas, y que tienes que escribir using System
si lo usas String
.
using System
al usar String
, de lo contrario obtendrá el siguiente error:The type or namespace name 'String' could not be found (are you missing a using directive or an assembly reference?)
Ambos son lo mismo. Pero desde la perspectiva de las pautas de codificación es mejor usar en string
lugar de String
. Esto es lo que generalmente usan los desarrolladores. por ejemplo, en lugar de usar Int32
, usamos int
como int
es aliasInt32
FYI "La cadena de palabras clave es simplemente un alias para la clase predefinida System.String
". - Especificación del lenguaje C # 4.2.3
http://msdn2.microsoft.com/En-US/library/aa691153.aspx
Como dicen los demás, son lo mismo. StyleCop reglas, por defecto, harán cumplir su uso string
como un estilo de código C # las mejores prácticas, excepto cuando se hace referencia System.String
funciones estáticas, tales como String.Format
, String.Join
, String.Concat
, etc ...
Nueva respuesta después de 6 años y 5 meses (dilación).
Si bien string
es una palabra clave reservada de C # que siempre tiene un significado fijo, String
es solo un identificador ordinario que podría referirse a cualquier cosa. Dependiendo de los miembros del tipo actual, el espacio de nombres actual y las using
directivas aplicadas y su ubicación, String
podrían ser un valor o un tipo distinto deglobal::System.String
.
Proporcionaré dos ejemplos donde las using
directivas no ayudarán .
Primero, cuando String
es un valor del tipo actual (o una variable local):
class MySequence<TElement>
{
public IEnumerable<TElement> String { get; set; }
void Example()
{
var test = String.Format("Hello {0}.", DateTime.Today.DayOfWeek);
}
}
Lo anterior no se compilará porque IEnumerable<>
no tiene un miembro no estático llamado Format
y no se aplican métodos de extensión. En el caso anterior, aún es posible usarlo String
en otros contextos donde un tipo es la única posibilidad sintáctica. Por ejemplo, String local = "Hi mum!";
podría estar bien (dependiendo del espacio de nombres y las using
directivas).
Peor aún: String.Concat(someSequence)
es probable que decir (dependiendo de using
s) vaya al método de extensión Linq Enumerable.Concat
. No irá al método estático string.Concat
.
En segundo lugar, cuando String
es otro tipo , anidado dentro del tipo actual:
class MyPiano
{
protected class String
{
}
void Example()
{
var test1 = String.Format("Hello {0}.", DateTime.Today.DayOfWeek);
String test2 = "Goodbye";
}
}
Ninguna de las declaraciones en el Example
método compila. Aquí String
es siempre un piano cadena , MyPiano.String
. Ningún miembro ( static
o no) Format
existe en él (o se hereda de su clase base). Y el valor "Goodbye"
no se puede convertir en él.
using String = System.Int32; using Int32 = System.String;
y luego contar los errores.
string
es System.String
. String
Podría ser cualquier cosa.
String
tipo que no se establecería en el objeto System.String. Echa un vistazo: blog.paranoidcoding.com/2019/04/08/…
string
tiene un significado concreto en C #. Es el tipo System.String
que existe en el ensamblaje central de tiempo de ejecución. El tiempo de ejecución comprende intrínsecamente este tipo y proporciona las capacidades que los desarrolladores esperan strings
en .NET. Su presencia es tan crítica para C # que si ese tipo no funciona no existe, el compilador saldrá antes de intentar incluso analizar una línea de código. Por lo tanto, string
tiene un significado preciso e inequívoco en el código C #. String
Aunque el identificador no tiene un significado concreto en C #. Es un identificador que pasa por todas las reglas de búsqueda de nombres como Widget
, Student
etc ... "
El uso de los tipos de sistema facilita el puerto entre C # y VB.Net, si te gusta ese tipo de cosas.
Frente a lo que parece ser una práctica común entre otros programadores, prefiero String
sobrepasar string
, solo para resaltar el hecho de que String
es un tipo de referencia, como mencionó Jon Skeet.
string
es un alias (o abreviatura) de System.String
. Eso significa que al escribir string
nos referimos System.String
. Puede leer más en think link: 'string' es un alias / abreviatura de System.String.
Solo me gustaría agregar esto a la respuesta de lfousts, del libro de Ritchers:
La especificación del lenguaje C # establece: "Como cuestión de estilo, se favorece el uso de la palabra clave sobre el uso del nombre completo del tipo de sistema". No estoy de acuerdo con la especificación del lenguaje; Prefiero usar los nombres de tipo FCL y evitar por completo los nombres de tipo primitivos. De hecho, desearía que los compiladores ni siquiera ofrecieran los nombres de tipo primitivos y forzaran a los desarrolladores a utilizar los nombres de tipo FCL. Aquí están mis razones:
He visto a varios desarrolladores confundidos, sin saber si usar string o String en su código. Debido a que en la cadena C # (una palabra clave) se asigna exactamente a System.String (un tipo FCL), no hay diferencia y tampoco se puede usar. De manera similar, escuché que algunos desarrolladores dicen que int representa un número entero de 32 bits cuando la aplicación se ejecuta en un sistema operativo de 32 bits y que representa un número entero de 64 bits cuando la aplicación se ejecuta en un sistema operativo de 64 bits. Esta afirmación es absolutamente falsa: en C #, un int siempre se asigna a System.Int32 y, por lo tanto, representa un número entero de 32 bits independientemente del sistema operativo en el que se ejecuta el código. Si los programadores usaranInt32 en su código, entonces esta posible confusión también se elimina.
En C #, long se asigna a System.Int64 , pero en un lenguaje de programación diferente, long podría asignarse a Int16 o Int32 . De hecho, C ++ / CLI trata por mucho tiempo como Int32 . Alguien que lea el código fuente en un idioma podría malinterpretar fácilmente la intención del código si estuviera acostumbrado a programar en un lenguaje de programación diferente. De hecho, la mayoría de los idiomas ni siquiera tratar larga como palabra clave y no el código de compilación que lo utiliza.
El FCL tiene muchos métodos que tienen nombres de tipo como parte de sus nombres de método. Por ejemplo, el tipo BinaryReader ofrece métodos como ReadBoolean , ReadInt32 , ReadSingle , etc., y el tipo System.Convert ofrece métodos como ToBoolean , ToInt32 , ToSingle , etc. Aunque es legal escribir el siguiente código, la línea con flotante me parece muy poco natural, y no es obvio que la línea sea correcta:
BinaryReader br = new BinaryReader(...); float val = br.ReadSingle(); // OK, but feels unnatural Single val = br.ReadSingle(); // OK and feels good
Muchos programadores que usan C # exclusivamente tienden a olvidar que se pueden usar otros lenguajes de programación contra el CLR, y debido a esto, los mecanismos de C # se deslizan en el código de la biblioteca de clases. Por ejemplo, FCL de Microsoft está casi escrito exclusivamente en C # y desarrolladores en el equipo FCL ahora han introducido métodos en la biblioteca como matriz ‘s GetLongLength , que devuelve un Int64 valor que es un tiempo en C #, pero no en otros idiomas (como C ++ / CLI). Otro ejemplo es el método LongCount de System.Linq.Enumerable .
No entendí su opinión antes de leer el párrafo completo.
String ( System.String
) es una clase en la biblioteca de clases base. string (minúscula) es un trabajo reservado en C # que es un alias para System.String. Int32 vs int es una situación similar como es Boolean vs. bool
. Estas palabras clave específicas del lenguaje C # le permiten declarar primitivas en un estilo similar a C.
String
no es una palabra clave y se puede usar como identificador, mientras que string
es una palabra clave y no se puede usar como identificador. Y en el punto de vista funcional ambos son iguales.
Es una cuestión de convención, de verdad. string
simplemente se parece más al estilo C / C ++. La convención general es usar cualquier atajo que haya proporcionado el idioma elegido (int / Int para Int32
). Esto va para "objeto" y decimal
también.
Teóricamente, esto podría ayudar a portar código en algún estándar futuro de 64 bits en el que "int" podría significar Int64
, pero ese no es el punto, y esperaría que cualquier asistente de actualización cambie cualquier int
referencia de Int32
todos modos solo para estar seguro.
Llegando tarde a la fiesta: uso los tipos CLR el 100% del tiempo (bueno, excepto si me veo obligado a usar el tipo C #, pero no recuerdo cuándo fue la última vez).
Originalmente comencé a hacer esto hace años, según los libros CLR de Ritchie. Tenía sentido para mí que todos los lenguajes CLR finalmente tengan que ser capaces de admitir el conjunto de tipos CLR, por lo que el uso de los tipos CLR proporcionó un código más claro y posiblemente más "reutilizable".
Ahora que lo he estado haciendo durante años, es un hábito y me gusta la coloración que VS muestra para los tipos CLR.
El único inconveniente real es que el autocompletado usa el tipo C #, por lo que termino reescribiendo los tipos generados automáticamente para especificar el tipo CLR.
Además, ahora, cuando veo "int" o "cadena", me parece muy mal, como si estuviera viendo el código C de 1970.
No hay diferencia.
La palabra clave C # se string
asigna al tipo .NET System.String
: es un alias que cumple con las convenciones de nomenclatura del lenguaje.
Del mismo modo, se int
asigna a System.Int32
.
int*
y los tipos compuestos por [U] IntPtrs o punteros reales).
Hay una cita sobre este tema del libro de Daniel Solis .
Todos los tipos predefinidos se asignan directamente a los tipos .NET subyacentes. Los nombres de tipo C # (cadena) son simplemente alias para los tipos .NET (String o System.String), por lo que usar los nombres .NET funciona bien sintácticamente, aunque esto se desaconseja. Dentro de un programa C #, debe usar los nombres C # en lugar de los nombres .NET.
string es una palabra clave y no puede usar string como identificador.
La cadena no es una palabra clave, y puede usarla como identificador:
Ejemplo
string String = "I am a string";
La palabra clave string
es un alias,
System.String
aparte del problema de la palabra clave, los dos son exactamente equivalentes.
typeof(string) == typeof(String) == typeof(System.String)
Sí, no hay diferencia entre ellos, al igual que el bool
y Boolean
.
@JaredPar (un desarrollador en el compilador de C # y prolífico usuario SO!) Escribió una gran publicación de blog sobre este tema. Creo que vale la pena compartirlo aquí. Es una buena perspectiva sobre nuestro tema.
string
vs.String
no es un debate de estilo[...]
La palabra clave
string
tiene un significado concreto en C #. Es el tipoSystem.String
que existe en el ensamblaje central de tiempo de ejecución. El tiempo de ejecución comprende intrínsecamente este tipo y proporciona las capacidades que los desarrolladores esperan para las cadenas en .NET. Su presencia es tan crítica para C # que si ese tipo no existe, el compilador se cerrará antes de intentar incluso analizar una línea de código. Por lo tanto,string
tiene un significado preciso e inequívoco en el código C #.Sin
String
embargo, el identificador no tiene un significado concreto en C #. Es un identificador que pasa por todas las reglas de búsqueda de nombres comoWidget
,Student
etc ... Podría unirse a una cadena o podría unirse a un tipo en otro ensamblado completamente cuyos propósitos pueden ser completamente diferentes astring
. Peor aún, podría definirse de tal manera que el código comoString s = "hello"
; continuó compilando.class TricksterString { void Example() { String s = "Hello World"; // Okay but probably not what you expect. } } class String { public static implicit operator String(string s) => null; }
El significado real de
String
siempre dependerá de la resolución del nombre. Eso significa que depende de todos los archivos de origen en el proyecto y de todos los tipos definidos en todos los ensamblados a los que se hace referencia. En resumen, requiere bastante contexto para saber lo que significa.Es cierto que en la gran mayoría de los casos
String
ystring
se unirá al mismo tipo. Pero usarString
todavía significa que los desarrolladores están dejando su programa para interpretación en lugares donde solo hay una respuesta correcta. Cuando seString
une al tipo incorrecto, puede dejar a los desarrolladores depurando durante horas, archivando errores en el equipo del compilador y, en general, perdiendo el tiempo que podría haberse ahorrado mediante el usostring
.Otra forma de visualizar la diferencia es con esta muestra:
string s1 = 42; // Errors 100% of the time String s2 = 42; // Might error, might not, depends on the code
Muchos argumentarán que, si bien esta información es técnicamente precisa, el uso
String
todavía está bien porque es extremadamente raro que una base de código defina un tipo de este nombre. O que cuandoString
se define es una señal de una mala base de código.[...]
Verá que
String
se define para una serie de propósitos completamente válidos: ayudantes de reflexión, bibliotecas de serialización, lexers, protocolos, etc. Para cualquiera de estas bibliotecasString
vs.string
tiene consecuencias reales dependiendo de dónde se use el código.Así que recuerde cuando vea el debate
String
vs.string
esto se trata de semántica, no de estilo. Elegir una cadena le da un significado nítido a su base de código. ElegirString
no está mal, pero está dejando la puerta abierta para sorpresas en el futuro.
Nota: Copié / pegué la mayor parte de la publicación del blog por razones de archivo. Ignoro algunas partes, por lo que recomiendo omitir y leer la publicación del blog si puedes.
string
es una construcción léxica de la gramática de C #, mientras queSystem.String
es solo un tipo. Independientemente de cualquier diferencia explícita mencionada en cualquier especificación, todavía existe esta diferencia implícita que podría ser acomodada con cierta ambigüedad. El lenguaje en sí mismo debe soportarstring
de manera que la implementación no esté (tan) tan obligada a considerar para una clase particular en el BCL.string
exactamente igual al tipo BCLSystem.String
, nada más. Eso no es ambiguo en absoluto. Por supuesto, puede implementar su propio compilador, utilizando la gramática de C #, y utilizar todos los tokens que se encuentran así para algo arbitrario, no relacionado con lo que se define en la especificación del lenguaje C #. Sin embargo, el lenguaje resultante solo sería similar a C #, no podría considerarse C #.string
sin una directiva de uso para el Sistema. No puedes hacer eso conString
.string
. Es necesario abreviarSystem.String
, pero, como un alias, parece bastante, pero no exactamente lo mismo. Después de varios años de C #, sin embargo, yo diría, es seguro de usar, simplementestring
ystring.Format()
no que preocuparse porSystem.String
.System.String
clase todavía está allí, y lastring
palabra clave sigue siendo un alias para ella. Justo comoSystem.Int32
yint
. Son literalmente lo mismo.