Risipa de key_press | Programare

Programare .Net | Tehnici de programare | Tutoriale | Lectii si exemple

Risipa de key_press | Programare - Programare .Net | Tehnici de programare | Tutoriale | Lectii si exemple

Crearea unei metode generice

Presupunem ca avem nevoie de o metoda care sa fie apelata indiferent de tipul argumentelor.

using System;

namespace GenericMethod
{
    class Program
    {
        static void Main(string[] args)
        {
            int iFirst = 100;
            int iSecond = 200;

            string sFirst = "first";
            string sSecond = "second";

            Console.WriteLine("Before calling Swap:");
            Console.WriteLine("First {0}", iFirst);
            Console.WriteLine("Second {0}", iSecond);
            Console.WriteLine("First {0}", sFirst);
            Console.WriteLine("Second {0}", sSecond);

            Console.WriteLine("After calling Swap:");
            //apelul metodei cu parametri de tip int
            Swap(ref iFirst, ref iSecond);
            //apelul aceleasi metode cu parametri de tip string
            Swap(ref sFirst, ref sSecond);
            Console.WriteLine("First {0}", iFirst);
            Console.WriteLine("Second {0}", iSecond);
            Console.WriteLine("First {0}", sFirst);
            Console.WriteLine("Second {0}", sSecond);

            Console.ReadLine();
        }

        static void Swap<T>(ref T first, ref T second)
        {
            T aux = first;
            first = second;
            second = aux;
        }
    }
}

La apelarea unei metode generice, compilatorul C# ofera type inference (compilatorul va incerca sa determine in mod automat tipul folosit in apelul metodei generice). In exemplu de mai sus am declarat ambele variabile iFirst si iSecond de tipul int, astfel compilatorul a reusit sa determine tipul ca fiind un Int32. Daca am fi declarat variabilele de tipuri diferite si am fi apelat metoda, compilatorul nu ar fi reusit type inference-ul si ar fi generat o eroare la compilare:

 Swap(iFirst, sSecond);

The type arguments for method ‘GenericMethod.Program.Swap(ref T, ref T)’ cannot be inferred from the usage. Try specifying the type arguments explicitly.

Presupunem ca in interiorul aceleasi clase Program mai avem inca o metoda Swap declara astfel:

        static void Swap(ref int first, ref int second)
        {
            int aux = first;
            first = second;
            second = aux;
        }

Apelarea metodei Swap cu paremetri de tip int va determina compilatorul sa aleaga o varianta cat mai explicita a metodei, in cazul nostru, metoda Swap non-generica. Daca se doreste apelul metodei generice pentru cazul parametrilor de tip int se va specifica tipul acestora in apel:

            Swap<int>(ref iFirst, ref iSecond);

Cu ajutorul metodelor generice lizibilitatea si mentenabilitatea codului cresc.

Category: Uncategorized

Your email address will not be published. Required fields are marked *

*