2010-05-02 9 views
7

Estoy usando C# 4.0, ¿cómo puedo evitar el problema de escribir muchos métodos similares porque son únicos para cada parámetro (¿cómo pueden las nuevas características de parámetros evitar el infierno de sobrecarga?).Evitando el infierno de sobrecarga con C# 4.0

Gracias

Respuesta

13

lugar de esto:

void Method(string param1, string param2) { } 
void Method(string param1, string param2, string param3) { } 
void Method(string param1, string param2, string param3, string param4) { } 
void Method(string param1, string param2, string param3, int int4) { } 
//etc... 

Usted sólo puede tener un método con todos los parametros que desea, y lo llaman usando los parámetros nombrados así:

void Method(string param1, string param2 = "default2", 
      string param3 = "default3", int int4 = 12, int lastParam = 12) { } 

Y llámalo así:

Method(param1: "myString", int4: 23); 
//or... 
Method(param1: "myString", param4: "string2", int4: 23); 

Simplemente incluya lo que desea establecer, el resto serán los valores predeterminados que especificó en la firma del método.

+1

creo que la sintaxis no tiene apoyos. –

+1

@Martinho - Woops estaba respondiendo una pregunta sobre el objeto javascript al mismo tiempo :) solucionado –

+0

¿Qué sucede si el método utiliza todos los parámetros e intento pasar solo algunos de ellos? – dotnetdev

6

Supongamos que tiene un empleado de la clase como se menciona a continuación que tiene 3 constructores.

public class Employee 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Qualification { get; set; } 
    public string MiddleName { get; set; } 

    public Employee(string firstName, string lastName) 
    { 
     FirstName= firstName; 
     LastName= lastName; 
     Qualification= "N/A"; 
     MiddleName= string.Empty; 
    } 
    public Employee(string firstName, string lastName, string qualification) 
    { 
     FirstName= firstName; 
     LastName= lastName; 
     Qualification= qualification; 
     MiddleName= string.Empty; 

    } 
    public Employee(string firstName, string lastName, string qualification, 
     string middleName) 
    { 
     FirstName= firstName; 
     LastName= lastName; 
     Qualification= qualification; 
     MiddleName= middleName 
    } 
} 

Con C# 4.0, tendrá que crear un único constructor como el siguiente que reemplazará a los 3 constructores.

public class Employee 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Qualification { get; set; } 
    public string MiddleName { get; set; } 

    public Employee(string firstName, string lastName, 
      string qualification = "N/A", string middleName = "") 
    { 
     FirstName= firstName; 
     LastName= lastName; 
     Qualification= qualification; 
     MiddleName = middleName; 
    } 
} 

Este constructor puede ser llamado en siguientes maneras ..

Employee emp = new Employee("Adil", "Mughal"); 
Employee emp = new Employee("Adil", "Mughal", middleName: "Ahmed"); 
Employee emp = new Employee("Adil", qualification:"BS"); 
Employee emp = new Employee("ABC", lastName: "EFG", qualification: "BS"); 
Employee emp = new Employee("XYZ", middleName: "MNO"); 
+1

Es mejor mostrar esto con métodos que con constructores, ya que puede hacer algo como esto con la inicialización de propiedad en C# 3. –

+0

Para su primera versión habría tenido los constructores con menos argumentos llamar al constructor con más agudamientos pasando el valor predeterminado valores. Un punto inútil, ya que la segunda opción es más bonita, pero solo para elegir un domingo :) –

+0

En C# 3 podría haber considerado reescribir el método para aceptar un objeto de colección de parámetros. Al igual que Nick comenta, podría inicializar ese objeto cómodamente utilizando los inicializadores de propiedades. Pero para C# 4.0 simplemente usar argumentos opcionales directamente en el método parece mucho más sensato. – Joren