2012-01-01 12 views
6

¿Cuál es la diferencia entre estas tres formas de crear una nueva List<string> en C#?¿Cuál es la diferencia entre estas tres formas de crear una nueva lista <string> en C#?

A = new List<string>(); 
B = new List<string> { }; 
C = new List<string>() { }; 
+0

() inits la variable {} pone datos en la variable ¿No estoy seguro de que B compilaría? Pero A = C;) – craig1231

+0

Tal vez() inda la variable, pero qué diferencia hace, aún Count = 0 –

+0

Todos compila, de hecho, acabo de encontrar algunos de mis primeros códigos como B, me siento raro, entonces vengo aquí pregunto esta pregunta :) –

Respuesta

4

Esas son equivalentes, las tres crean un List<string> vacío.

  1. es un constructor simple, sin parámetros
  2. utiliza la sintaxis de inicialización de recogida, donde se le permite omitir las llaves del constructor si la clase proporciona un constructor sin parámetros
  3. lo mismo que 2, simplemente proporcionando las llaves de constructor opcionales.

La sintaxis de inicialización colección le permite proporcionar datos al tiempo que la construcción del objeto,

List<string> list = new List<string> { "one", "two", "three" }; 

consigue ampliar a

List<string> list = new List<string>(); 
list.Add("one"); 
list.Add("two"); 
list.Add("three"); 

por el compilador.

+2

Sintaxis de inicialización de objetos: 'new Foo() {Bar =" hello ", Count = 2};' Sintaxis de inicialización de colección: 'new List () {" one "," two "};' - so "sintaxis de inicialización de colección" es el término correcto en su uso. – Adam

+0

cierto, corregido. – Femaref

4

Todos son idénticos. No hay diferencia en el resultado final, solo en la sintaxis.

1

En su ejemplo, las tres instrucciones hacen lo mismo: crean una lista de cadenas vacía. Los enunciados B y C pueden asignar algunos datos iniciales a la lista, p.

ingredients = new List<string> { "Milk", "Sugar", "Flour" }; 

El () como en la declaración C se puede omitir a continuación.

8

No hay diferencia porque no está inicializando nada dentro de la lista en el momento de declararlo.

Si se va a añadir algunas cuerdas en la declaración-tiempo, que tendría que ir con la segunda o tercera opción:

var B = new List<string> { "some", "strings" }; 
var C = new List<string>() { "some", "strings" }; 

La tercera opción sólo sería necesario si se va a pasar un valor en List<of T> el constructor:

var C = new List<string>(5) { "some", "strings" }; 

o

var C = new List<string>(5); // empty list but capacity initialized with 5. 

Hay mo re constructores disponibles para la clase List<of T> también (p. pasando una colección existente o IEnumerable en el constructor List). Vea MSDN para más detalles.

+0

+1 - Buena explicación. –

1

{} se utiliza para collection \ object initilizer.
Si permanece en blanco, no hace nada.

Así que todas esas líneas producen lo mismo.

1

En el ejemplo que nos dio, el resultado será el mismo.

En términos de rendimiento, no encontrará ningún problema al utilizar cualquiera de esas opciones para inicializar una lista vacía, porque la IL generada contendrá el ctor(), como puede ver con el IL DASM.

Si desea inicializar la lista con un poco de información, usted puede ir a la opción 2 o 3.

List<string> b = new List<string> { "abc", "abc" }; 
List<string> c = new List<string>() { "abc", "abc"}; 

En términos de rendimiento es también la misma, el IL generado será exactamente el mismo, que contiene el ctor() y dos Agregue para ambos.

Pero debe usar la mejor para leer. Para evitar cualquier problema al leer el código para usted colegas, me gustaría ir a

List<string> a = new List<string>(); 

pero eso es una cuestión de opinión personal.

+0

Estaba usando la nueva lista {}, más como un objeto para mí. Pero ahora empiezo a usar la nueva lista () {}, más clara en lo que estoy haciendo. –

Cuestiones relacionadas