2011-03-21 9 views
14

¿Hay alguna forma de crear un objeto constante (es decir, no se puede editar y se crea en tiempo de compilación)?C# "Objetos constantes" para usar como parámetros predeterminados

Estoy jugando con el lenguaje C# y noté la característica de parámetro opcional y pensé que podría ser útil poder usar un objeto predeterminado como parámetro opcional. Considere lo siguiente:

//this class has default settings 
private const SettingsClass DefaultSettings = new SettingsClass(); 

public void doSomething(SettingsClass settings = DefaultSettings) 
{ 

} 

Esto obviamente no se compila, pero es un ejemplo de lo que me gustaría hacer. ¿Sería posible crear un objeto constante como este y usarlo como predeterminado para un parámetro opcional?

+1

Solo un aparte: evite usar funciones de idioma solo porque puede. Úselos porque son la herramienta adecuada para el trabajo. Los parámetros predeterminados no son la herramienta adecuada para lo que quiere hacer. ¡Aclamaciones! – Jon

+1

Si esto fuera Python, este sería un uso perfectamente aceptable de los parámetros predeterminados. No veo ninguna razón para que los parámetros predeterminados no sean la herramienta adecuada para el trabajo (aparte del hecho de que no es válido en C#). – Gabe

Respuesta

25

No, los valores predeterminados para los parámetros opcionales son constantes de tiempo de compilación.

En su caso, una solución sería:

public void doSomething(SettingsClass settings = null) 
{ 
    settings = settings ?? DefaultSettings; 
    ... 
} 
+0

A menos que quieras 'null' hacer algo que no sea el predeterminado. –

+0

Esa es una buena solución ... ¿nunca se ha visto? antes ... nulo coalescente lol ... cuando crees que sabes C# ... – user623879

+0

¡Bien hecho, gracias! –

4

Generalmente lo que quiere no es posible. Puede falsificarlo con un valor predeterminado "no válido" como muestra la respuesta de Ani, pero esto se rompe si no hay ningún valor que pueda considerar no válido. Esto no será un problema con los tipos de valor donde puede cambiar el parámetro a un tipo que admite nulos, pero luego incurrirá en el boxeo y también puede "diluir" la interfaz de la función solo para acomodar un detalle de implementación.

se puede lograr la funcionalidad deseada si se reemplaza el parámetro opcional con el pre-C# 4 paradigma de múltiples sobrecargas:

public void doSomething() 
{ 
    var settings = // get your settings here any way you like 
    this.doSomething(settings); 
} 

public void doSomething(SettingsClass settings) 
{ 
    // implementation 
} 

Esto funciona incluso si el parámetro es un tipo de valor.

+0

Estoy de acuerdo, pero estaba buscando un método de parámetro opcional. – user623879

+0

@ user623879: agregué un nuevo primer párrafo, que hace que la respuesta sea más completa. – Jon

+0

@Usuario: Realmente no importa; el parámetro es opcional en este caso también. El método IMHO Jons es innegablemente superior a Anis. –

0

Puede usar el atributo de solo lectura, en lugar de const. Por ejemplo:

//this class has default settings 
private readonly SettingsClass DefaultSettings = new SettingsClass(); 

public void doSomething(SettingsClass settings = DefaultSettings) 
{ 
} 
+2

Esto no parece compilar. –

+2

Esto no funciona –

+0

no funciona, ¡solo! = Const, const se evalúa en compilación mientras que readonly estará en tiempo de ejecución. const será inline y readonly no –

Cuestiones relacionadas