Algemene methoden (C#-programmeerhandleiding)
Een algemene methode is een methode die als volgt wordt gedeclareerd met typeparameters:
static void Swap<T>(ref T lhs, ref T rhs)
{
T temp;
temp = lhs;
lhs = rhs;
rhs = temp;
}
In het volgende codevoorbeeld ziet u een manier om de methode aan te roepen met behulp van int
het typeargument:
public static void TestSwap()
{
int a = 1;
int b = 2;
Swap<int>(ref a, ref b);
System.Console.WriteLine(a + " " + b);
}
U kunt ook het typeargument weglaten en de compiler leidt dit af. De volgende aanroep is Swap
gelijk aan de vorige aanroep:
Swap(ref a, ref b);
Dezelfde regels voor typedeductie zijn van toepassing op statische methoden en exemplaarmethoden. De compiler kan de typeparameters afleiden op basis van de methodeargumenten die u doorgeeft; de typeparameters kunnen niet alleen worden afgeleid van een beperking of retourwaarde. Daarom werkt typedeductie niet met methoden die geen parameters hebben. Typedeductie vindt plaats tijdens het compileren voordat de compiler overbelaste methodehandtekeningen probeert op te lossen. De compiler past typedeductielogica toe op alle algemene methoden die dezelfde naam delen. In de stap voor overbelastingsresolutie bevat de compiler alleen de algemene methoden waarop typedeductie is geslaagd.
In een algemene klasse hebben niet-algemene methoden als volgt toegang tot de typeparameters op klasseniveau:
class SampleClass<T>
{
void Swap(ref T lhs, ref T rhs) { }
}
Als u een algemene methode definieert die dezelfde typeparameters gebruikt als de betreffende klasse, genereert de compiler waarschuwing CS0693 , omdat het argument dat is opgegeven voor de binnenste T
, het argument dat voor het buitenste T
is opgegeven, verborgen. Als u de flexibiliteit nodig hebt om een algemene klassemethode aan te roepen met andere typeargumenten dan de argumenten die zijn opgegeven toen de klasse werd geïnstantieerd, kunt u een andere id opgeven voor de typeparameter van de methode, zoals wordt weergegeven in GenericList2<T>
het volgende voorbeeld.
class GenericList<T>
{
// CS0693.
void SampleMethod<T>() { }
}
class GenericList2<T>
{
// No warning.
void SampleMethod<U>() { }
}
Gebruik beperkingen om meer gespecialiseerde bewerkingen in te schakelen voor typeparameters in methoden. Deze versie van Swap<T>
, nu benoemd SwapIfGreater<T>
, kan alleen worden gebruikt met typeargumenten die worden geïmplementeerd IComparable<T>.
void SwapIfGreater<T>(ref T lhs, ref T rhs) where T : System.IComparable<T>
{
T temp;
if (lhs.CompareTo(rhs) > 0)
{
temp = lhs;
lhs = rhs;
rhs = temp;
}
}
Algemene methoden kunnen worden overbelast op verschillende typeparameters. De volgende methoden kunnen zich bijvoorbeeld allemaal in dezelfde klasse bevinden:
void DoWork() { }
void DoWork<T>() { }
void DoWork<T, U>() { }
U kunt de typeparameter ook gebruiken als het retourtype van een methode. In het volgende codevoorbeeld ziet u een methode die een matrix van het type T
retourneert:
T[] Swap<T>(T a, T b)
{
return [b, a];
}
C#-taalspecificatie
Zie de C#-taalspecificatie voor meer informatie.