2009-04-20 11 views
6

¿Existe una regla general a seguir cuando se usa la palabra clave new y cuándo no al declarar objetos?Para "nuevo" o no para "nuevo"

List<MyCustomClass> listCustClass = GetList(); 

O

List<MyCustomClass> listCustClass = new List<MyCustomClass>(); 
listCustClass = GetList(); 
+0

¿Realmente está preguntando si debería escribir fábricas o no? – annakata

+6

No, creo que no entiende que "nuevo" significa una llamada de constructor y la creación de un nuevo objeto. De lo contrario, sabría mejor que crear un nuevo objeto y luego tirarlo. Tal vez proviene de VB.NET, donde la palabra clave "Nuevo" puede ser parte de la sintaxis de la declaración, por lo que piensa que eso es lo que es en C#. –

+0

No estoy seguro acerca de las etiquetas C# y .NET en esta, ya que es una pregunta de OOP bastante general. – Welbog

Respuesta

8

En su escenario, parece que la creación real del objeto se está realizando dentro de su método GetList(). Entonces su primera muestra sería el uso correcto.

Cuando se crea, su List<MyCustomClass> se almacena en el montón, y su listCustClass es simplemente una referencia a ese nuevo objeto. Cuando establece listCustClass en GetList(), el puntero de referencia de listCustClass se descarta y reemplaza con un puntero de referencia a lo que GetList() devuelve (podría ser nulo). Cuando esto sucede, su List<MyCustomClass> original todavía está en el montón, pero ningún objeto lo señala, por lo que solo desperdicia recursos hasta que el recolector de basura lo recupera y lo limpia.

Para resumir cada vez que creas un objeto nuevo y luego lo abandonas, como en el segundo ejemplo, esencialmente estás perdiendo memoria llenando el montón con información inútil.

18

Sólo el primer ejemplo tiene sentido en este caso, ya que en el segundo caso va a sustituir inmediatamente la lista creada con el devuelto por el método. Inicializar una lista en una nueva lista vacía tiene sentido en los casos en los que agrega a esa lista o cuando es posible que el método al que llama para completar la lista de alguna manera resulte en un valor nulo cuando de otra manera esperaría una lista vacía .

Ejemplos en los que podría utilizar la inicialización en una nueva lista vacía.

List<MyCustomClass> listCustClass = new List<MyCustomClass>(); 
listCustClass.AddRange(GetList()); 

o

List<MyCustomClass> listCustClass = new List<MyCustomClass>(); 
try 
{ 
    listCustClass = GetList(); 
} 
catch (SqlException) 
{ 
} 
return listCustClass; 
43

En el segundo caso, se crea un nuevo objeto en la primera línea sólo para tirarlo a la basura en la segunda línea. Completamente innecesario.

+1

No puedo creer que esta sea mi respuesta más votada. – erikkallen

2

Si puede alinearlo sin perder el significado y la claridad de lo que está logrando, por supuesto, en línea.

Editar: Y, como regularmente en línea, ni siquiera pensé en la referencia de objeto huérfano. Doh. =)

+0

Sería bueno saber * qué * era el downvote. =) –

+0

Fue por la respuesta de Daniel, simplemente haz clic en la entrada incorrecta ...: D –

+0

Ahaha. Mi colega siguió perdiendo con su mouse todo el día, también. Debe ser lunes. =) –

3

Utiliza la palabra clave new para construir una nueva instancia de un objeto. No está claro por su pregunta qué hace el método GetList, pero presumiblemente está creando una nueva lista (moviendo la palabra clave new en otro lugar) o devolviendo una lista existente (que alguien creó en un punto usando new).

+0

GetList debe usar new para crear una lista para que pueda devolverla a la persona que llama. ¿derecho? ¿Hay alguna otra forma de implementar GetList? –

+0

El punto es que alguien está creando la lista, ya sea GetList o algún método que GetList llame. –

0

No lo piense en términos de "debo usar nuevo cuando declaro".

Usa nuevo cuando está asignando (que puede ser parte de una declaración).

El primer ejemplo es correcto, el segundo es un desperdicio innecesario de recursos de tiempo de ejecución.

1

No hay una regla de oro, pero hay un sentido común que puede aplicar la mayor parte del tiempo.

Se necesita crear una instancia de un objeto cuando se está creando. Su función GetList() ostensiblemente devuelve un IList (creado), por lo tanto, el segundo fragmento de código es bastante innecesario (instancia un IList y lo descarta efectivamente en la línea siguiente).

Sin embargo, el primer fragmento es completamente apropiado.

0

En C#, todas las instancias de clases deben crearse con la palabra clave new. Si no está usando new en su contexto actual, tiene una referencia nula o está llamando a una función que usa new para instanciar la clase.

En este caso, parece que GetList() usa new para crear una nueva lista.

3

La nueva palabra clave se utiliza básicamente para asignar espacio en el montón. Si está creando un tipo de valor (estructuras, etc.), no tiene que usar la nueva palabra clave. Sin embargo, las variables de referencia deben ser nuevas antes de ser usadas.

En el ejemplo anterior, parece que GetList() devuelve una referencia de tipo Lista que se habría creado (new'd) en algún lugar dentro de la función. Por lo tanto, en este escenario, new'ing no tiene sentido.

Cuestiones relacionadas