2009-12-01 20 views

Respuesta

10

Son lo mismo.

Prefiero usar 'nuevo', con pocas buenas razones aparte de que es lo que estoy acostumbrado en otros idiomas, y hace que sea más fácil encontrar/grep para llamadas de constructor (sin herramientas inteligentes para 'encontrar todas las referencias' en una solución).

+0

Parece la mejor opción, sí. – Stringer

18

Tengo ganas de omitir "nuevo" es un poco más funcional, así que esa es mi preferencia. Me gusta que pueda tratar a un constructor como cualquier otra función devolviendo una instancia de un tipo.

+0

Tendría sentido también ... Creo que lo importante es hacer una elección y luego ajustarse a ella. – Stringer

9

En segundo lugar lo que dice kvb. Además, omito new porque esto me permite invocar miembros directamente sobre el objeto construido, como en C#. Por ejemplo, el código de seguimiento funciona:

DateTime(2012, 12, 21).ToString() 

El código siguiente no se trabajo y los resultados en un error de compilación:

new DateTime(2012, 12, 21).ToString() 

Así que ahora tengo que poner entre paréntesis la expresión new con el fin de conseguir que se compile:

(new DateTime(2012, 12, 21)).ToString() 

no me gusta paréntesis adicionales, por lo que evitar el uso de new ahora.

La una caja donde aún la usaría es cuando estoy creando un objeto que implementa IDisposable. Esto es porque si omito la palabra clave new al crear un IDisposable el F # compilador da una advertencia:

let writeFile = 
    let writer = StreamWriter(@"hello.txt") 
    writer.WriteLine("hello") 

Los resultados de este:

warning FS0760: It is recommended that objects that support the IDisposable interface are created using 'new Type(args)' rather than 'Type(args)' to indicate that resources may be owned by the generated value

puedo librarme de la advertencia mediante la adición en el new palabra clave:

let writeFile = 
    let writer = new StreamWriter("hello.txt") 
    writer.WriteLine("hello") 

La advertencia también me hace darse cuenta de que realmente debería tener un use vinculante para mi IDisposable:

let writeFile = 
    use writer = new StreamWriter("hello.txt") 
    writer.WriteLine("hello") 

Pero si escribía mi código para utilizar newtodo el tiempo entonces nunca tendría la advertencia recordándome que estoy trabajando con un IDisposable !!!

También hace que haya menos tipeo. ;-)

+0

Razonamiento muy lógico de por qué no utilizar 'new', pero solo' use' cuando sea necesario. Reflexionar sobre los resultados de paréntesis en código limpio. – bugfoot

Cuestiones relacionadas