2010-05-01 11 views
7

Tengo una función en C# que hace algún tipo de procesamiento y necesita volver cifras sobre lo que ha procesado, el éxito, el fracaso, etc..NET Resultados Clase

Puede alguien decirme si hay cualquier clase de marco estándar que se manejar esto (por ejemplo, número de registros procesados, número exitoso, fallido, etc.)?

Como alternativa, ¿alguien puede decir cómo suelen manejar esto? ¿Es la mejor forma de crear una clase o utilizar parámetros?

Respuesta

6

No creo que haya ninguna clase estándar para representar este tipo de información. La mejor manera de manejar esto es probablemente definir tu propia clase. En C# 3.0, puede utilizar las propiedades implementadas de forma automática, lo que reduce la cantidad de código que necesita para escribir:

class Results { 
    public double Sum { get; set; } 
    public double Count { get; set; } 
} 

creo out parámetros deben ser utilizados sólo en escenarios relativamente limitados, tales como la hora de definir métodos similares a Int32.TryParse y similar.

Alternativamente, si necesita usar esto solo localmente (por ejemplo, llame a la función desde un solo lugar, por lo que no vale la pena declarar una nueva clase para contener los resultados), podría usar la clase Tuple<..> en .NET 4.0. Le permite agrupar valores de varios tipos diferentes. Por ejemplo, Tuple<double, double, double> tendría propiedades Item1 ... Item3 de tipos double que puede usar para almacenar resultados individuales (esto hará que el código sea menos legible, por lo que es utilizable solo localmente).

+1

"no vale la pena declarar una nueva clase para mantener los resultados"? De Verdad? – pdr

+2

No utilizaría 'Tuple <..>' en los miembros públicos de la clase. En un miembro privado que solo se puede usar desde un número limitado de lugares, puede ser más fácil usarlo en lugar de construir una clase de propósito único. –

+0

Hmm, vale, cada uno por su cuenta. Para 6 líneas de código, crearía una clase privada para niños solo por claridad, pero eso no es para reclamar superioridad, solo tengo esta desagradable sensación de inquietud cuando utilizo una clase para algo distinto del propósito previsto. – pdr

2

No creo que haya ninguna clase incorporada para eso. Usualmente crearé mi propia clase para acomodar el tipo de resultado del que hablabas, y sí, prefiero una clase Result en lugar de parámetros simplemente porque siento que es más limpio y no estoy forzado a preparar variables y escribir afuera. parámetros cada vez que necesito llamar a esa función.

-1

No creo que haya nada estándar que haga esto por usted.

Un gran ejemplo del uso de los parámetros out, son las funciones TryParse.

+0

Creo que el TryParse está en la forma en que es simplemente compatible con versiones anteriores. Asumiendo que si Nullable ya estaba allí cuando crearon TryParse, preferirían (al menos lo harían) devolver Nullable para TryParse en lugar de usar el parámetro out para el valor y el retorno booleano para especificar si analizó correctamente la cadena de entrada o no. – Amry

-1

Si tiene dos valores para devolver, use uno como valor de retorno y uno como un parámetro out.

Si tiene más, cree su propia clase de valor devuelto y devuélvala.

+0

Estoy de acuerdo con esto si el escenario de uso, en cierto modo, se sintió bien, como el método TryParse. Pero se sentirá extraño si el valor de retorno es un int que representa la edad de la persona en la que se devuelve el nombre de la persona mediante un parámetro de cadena de salida. Es como si los valores estuvieran relacionados contextualmente, pero desconectados en la forma en que se devuelven a la persona que llama. – Amry

2

No sé si existe un marco conocido para hacer esto, pero es una práctica común en todos los proyectos nuevos en los que participo ahora.

Parece una buena práctica tener una clase de resultados personalizada para dar al ejecutor de métodos los resultados adecuados y/o el objeto resultante.

simple genérico clase resultado:

public partial class GenericResult 
{ 
    public IList<string> Errors { get; set; } 
    decimal Value { get; set; } 

    public GenericResult() 
    { 
     this.Errors = new List<string>(); 
    } 

    public bool Success 
    { 
     get { return (this.Errors.Count == 0); } 
    } 

    public void AddError(string error) 
    { 
     this.Errors.Add(error); 
    } 
} 

Un método que utiliza clase anterior como el tipo de retorno: ejemplo

public GenericResult CanDivideNumber(int a, int b) 
{ 
    GenericResult result = new GenericResult(); 

    try 
    { 
     result.Value = a/b; 
    } 
    catch (Exception ex) 
    { 
     result.AddError(ex.ToString()); 
    } 

    return result; 
} 

Uso:

var result = CanDivideNumber(1, 0); 

// Was the operation a success? 
// result.Success 

// Need to get error details? 
// result.Errors 

// The processing result? 
// result.Value 
Cuestiones relacionadas