2013-01-21 13 views
6

Qual è la differenza tra questi due metodi?Versione generica vs versione di interfaccia di un metodo

primo:

public static int Foo<T>(T first, T second) where T:IComparable 
{ 
    return first.CompareTo(second) 
} 

secondo:

public static int Foo(IComparable first, IComparable second) 
{ 
    return first.CompareTo(second); 
} 
+1

non è il duplicato esatto di quel post, perché qui abbiamo due parametri e cambia alcuni criteri. guarda la prima risposta per vedere la differenza –

risposta

13

Per il primo metodo, i tipi dei due parametri devono essere uguali, ad esempio, int e int. Il tipo deve implementare l'interfaccia IComparable.

Per il secondo metodo, i due parametri possono avere tipi diversi. Entrambi i tipi devono implementare l'interfaccia IComparable, ma non devono essere uguali, ad esempio int e string.

Si noti che lo IComparable.CompareTo method genererà un'eccezione se i tipi non sono uguali. Quindi è meglio assicurarsi che i tipi siano in realtà lo stesso. Puoi farlo usando il tuo primo metodo, o ancora meglio usando il generico IComparable<T> interface.


La domanda di follow-up è, naturalmente: Qual è la differenza tra questi due metodi?

primo:

public static int Foo<T1, T2>(T1 first, T2 second) where T1 : IComparable<T2> 
{ 
    return first.CompareTo(second); 
} 

secondo:

public static int Foo<T>(IComparable<T> first, T second) 
{ 
    return first.CompareTo(second) 
} 

Risposta: Il primo metodo non scatola il primo argomento, mentre il secondo metodo fa.

1

Dal frammento di codice fornito la differenza che può dire che

versione

Generics:

  • per generici nuovo codice verrà generato per ogni tipo definito

Foo<Class1>, Foo<Class2>, Foo<Class3>.

  • è necessario definire un tipo in fase di compilazione che

versione di interfaccia:

  • beneficio dai concetti OOP, nascondendo i dettagli di implementazione del codice vero e proprio.

  • runtime tipo definitivo (maggiore flessibilità), ma meno "generico" in termini di pura sione di quella parola.

In generale: interfaccia versione è più flessibile ma meno generico (tutto, tra l'altro, dipende naturalmente implementaiton codice di calcestruzzo).

Problemi correlati