Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
In dit artikel wordt beschreven hoe u uw eigen extensiemethoden implementeert voor elk .NET-type. Clientcode kan uw extensiemethoden gebruiken. Clientprojecten moeten verwijzen naar de assembly die deze bevat. Clientprojecten moeten een using-instructie toevoegen waarmee de naamruimte wordt opgegeven waarin de extensiemethoden worden gedefinieerd.
Vanaf C# 14 zijn er twee syntaxis die u kunt gebruiken om extensiemethoden te definiëren. C# 14 voegt extensieblokken toe, waarbij u extensieleden definieert voor een type. Voor C# 14 voegt u deze wijzigingsfunctie toe aan de eerste parameter van een statische methode om aan te geven dat de methode wordt weergegeven als lid van een exemplaar van het parametertype.
Extensieblokken (C# 14 en hoger)
Vanaf C# 14 kunt u extensiemethoden declareren met behulp van extensieblokken. Een extensieblok is een blok in een niet-geneste, niet-algemene, statische klasse die extensieleden voor een type of een exemplaar van dat type bevat.
Een extensiemethode definiëren en aanroepen met behulp van extensieblokken:
- Definieer een statische klasse die de extensiemethode bevat. De klasse kan niet worden genest binnen een ander type en moet zichtbaar zijn voor clientcode. Zie Access Modifiers voor meer informatie over toegankelijkheidsregels.
- Gebruik een extensieblok om extensieleden voor een type te declareren.
- Voeg in de aanroepende code een
usinginstructie toe om de naamruimte op te geven die de klasse extensiemethode bevat. - Roep de methoden aan als exemplaarmethoden voor het type.
In het volgende voorbeeld wordt een extensiemethode met de naam geïmplementeerd WordCount met behulp van de C# 14-extensiebloksyntaxis. De methode werkt op de String klasse. De CustomExtensions naamruimte wordt geïmporteerd in de naamruimte van de toepassing en de methode wordt aangeroepen alsof deze een instantiemethode in de tekenreeks is.
using CustomExtensions;
string s = "The quick brown fox jumped over the lazy dog.";
// Call the method as if it were an
// instance method on the type. Note that the first
// parameter is not specified by the calling code.
int i = s.WordCount();
System.Console.WriteLine($"Word count of s is {i}");
namespace CustomExtensions
{
// Extension methods must be defined in a static class.
public static class StringExtension
{
extension(string str)
{
// This is the extension member.
// The `str` parameter is declared on the extension declaration.
public int WordCount()
{
return str.Split(new char[] { ' ', '.', '?' }, StringSplitOptions.RemoveEmptyEntries).Length;
}
}
}
}
Extensiemethoden (eerdere versies)
Voor C# 14 declareert u een extensiemethode door deze modifier toe te voegen aan de eerste parameter van een statische methode.
Een extensiemethode definiëren en aanroepen met behulp van de klassieke syntaxis:
- Definieer een statische klasse die de extensiemethode bevat. De klasse kan niet worden genest binnen een ander type en moet zichtbaar zijn voor clientcode. Zie Access Modifiers voor meer informatie over toegankelijkheidsregels.
- Implementeer de extensiemethode als een statische methode met ten minste dezelfde zichtbaarheid als de bijbehorende klasse.
- De eerste parameter van de methode specificeert het type waarop de methode werkt; deze moet worden voorafgegaan door de modifier this.
- Voeg in de aanroepende code een
usinginstructie toe om de naamruimte op te geven die de klasse extensiemethode bevat. - Roep de methoden aan als exemplaarmethoden voor het type.
In het volgende voorbeeld wordt een extensiemethode met gebruik van de klassieke syntaxis geïmplementeerd, genaamd WordCount. De methode werkt op de String klasse, die is opgegeven als de eerste methodeparameter met de this modifier. De CustomExtensions naamruimte wordt geïmporteerd in de naamruimte van de toepassing en de methode wordt aangeroepen alsof deze een instantiemethode in de tekenreeks is.
using CustomExtensions;
string s = "The quick brown fox jumped over the lazy dog.";
// Call the method as if it were an
// instance method on the type. Note that the first
// parameter is not specified by the calling code.
int i = s.WordCount();
System.Console.WriteLine($"Word count of s is {i}");
namespace CustomExtensions
{
// Extension methods must be defined in a static class.
public static class StringExtension
{
// This is the extension method.
// The first parameter takes the "this" modifier
// and specifies the type to be extended.
public static int WordCount(this string str)
{
return str.Split(new char[] { ' ', '.', '?' }, StringSplitOptions.RemoveEmptyEntries).Length;
}
}
}
Notitie
De eerste parameter wordt niet opgegeven door code aan te roepen, omdat deze het type aangeeft waarop de methode wordt toegepast en de compiler al het type van uw object kent. Je hoeft alleen argumenten op te geven voor parameters 2 tot n.
Algemene informatie
Overbelastingsoplossing geeft de voorkeur aan statische of exemplaar methoden die door het type zelf zijn gedefinieerd boven extensiemethoden. Extensiemethoden hebben geen toegang tot persoonlijke gegevens in de uitgebreide klasse.