887 messaggi dal 21 marzo 2008
Ciao a tutti
guardando alcuni esempi di dichiarazione di classi, ho trovate alcune dichiarazioni che non mi sono chiare.

public static T Max<T>(IEnumerable<T> list) where T : IComparable
{
T res = default(T);

quì non mi è chiara la dichiarazione della classe e cos'è/cosa fa default(T).

public class SpeedComparer : IComparer<Vehicle>

Cosa succede quando dichiaro la classe in questo modo?

Negli esempi trovo spesso 'T', ma non è definito da nessuna parte. E' una parola chiave di c# o sono io che sono distratto e non trovo la sua dichiarazione :-) ?

Dato che vorrei approfondire l'uso e la dichiarazione delle classi e delle interfacce, potete suggerirmi qualche libro o tutorial ecc? Non voglio utilizzare msdn perchè non è lineare e alla fine non capisco nulla.
Grazie
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,
Max è il nome di un metodo e infatti puoi vedere che ha un tipo di ritorno T.
Si tratta della dichiarazione di un metodo generico, cioè che può funzionare con argomenti di vario tipo.
Tra parentesi tonde puoi appunto vedere che Max accetta un solo parametro di tipo IEnumerable<T>, dove T è un tipo qualsiasi che implementi l'interfaccia IComparable, come disposto dalla restrizione where T : IComparable

T non è una parola chiave, puoi rinonimarla come vuoi. Di solito si usa T e quando sono coinvolti più tipi si usa U, V, ecc.. ma nulla ti vieterebbe di usare nomi più significativi come TSource, TEntità, e così via.

Max è un metodo statico, il che mi fa pensare che sia un extension method, anche se non vedo la parolina this prima dell'argomento.

L'istruzione default(T) restituisce il valore di default per il tipo T.
Se T fosse un value type, come ad esempio int o bool, restituirebbe rispettivamente 0 e false.
Se fosse invece un reference type allora restituirebbe null.
E' un modo per inizializzare una variabile di cui non conosci esattamente il tipo.


public class SpeedComparer : IComparer<Vehicle>

Questa qui invece è una classe SpeedComparer che implementa l'interfaccia generica IComparer<T>. E' in questo punto che definisci che il tuo T deve essere Vehicle.
Tutti i membri definiti in IComparer<T> dovrai implementarli sostituendo Vehicle ad ogni occorrenza di T.

ciao

Enjoy learning and just keep making
193 messaggi dal 05 novembre 2009
Per essere un pò piu' puntuale parliamo di Generics.Nel tuo caso al metodo Max puoi passargli come parametro tranquillamente una lista di interi, una lista di stringhe, un array di stringhe..etc in quanto implementano l'interfaccia IComparable, è un vincolo che dai sul tipo generico T dicendogli che in questo caso e quindi in questo metodo non è possibile accettare qualsiasi tipo di parametro, ma bensi' solo parametri che implementino l'interfaccia IComparable.
Modificato da Govinda il 08 dicembre 2012 18.01 -
Modificato da Govinda il 08 dicembre 2012 18.02 -

ti posto un esempio, sul quale puoi testare ciò che ho appena scritto:
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;

namespace CollectionGenerics
{
  class Program
  {
    static void Main(string[] args)
    {
      var stringhe = new List<string>{"z","s","t"};

      var date = new List<DateTime> { new DateTime(2010, 12, 20), new DateTime(2010, 12, 21), new DateTime(2010, 12, 22) };

      Console.WriteLine("il massimo è {0}", Max(date));
      Console.WriteLine("il massimo è {0}", Max(stringhe));

    }


    public static T Max<T>(IEnumerable<T> list ) where T:IComparable
    {
      bool isFirst = true;
      T res = default(T);

      foreach (T item in list)
      {
        if (isFirst)
        {
          res = item;
          isFirst = false;
        }
        if (res.CompareTo(item) < 0) res = item;
        
      }

      return res;

    }

  
  }
}


Modificato da Govinda il 08 dicembre 2012 18.08 -
887 messaggi dal 21 marzo 2008
Tutto chiaro
Vado a studiare Generics
Grazie mille

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.