Методы расширения в C#
Содержание
C# поддерживает несколько способов расширения существующих типов без изменения существующего кода.
Существует два разных способа: методы расширения и переопределение.
Методы расширения:
Методы расширения позволяют добавлять новые возможности к существующему типу. Вам не нужно вносить какие-либо изменения в существующий тип, просто принесите метод расширения в область видимости, и вы можете называть его как обычный метод экземпляра.
Методы расширения должны быть объявлены в негенерированном, не вложенном, статическом классе.
Пример:
namespace ConsoleApplication11
{
//методы расширения должны быть определены в статическом классе
static class IntMethods
{
//методы расширения должны быть статическими
//это ключевое слово говорит C#, что это метод расширения
public static bool IsPrime(this int number)
{
//проверить равномерность
if (number % 2 == 0)
{
if (number == 2)
return true;
return false;
}
//вам не нужно проверять квадратный корень
int max = (int)Math.Sqrt(number);
for (int i = 3; i <= max; i += 2)
{
if ((number % i) == 0)
{
return false;
}
}
return true;
}
}
class Program
{
static void Main(string[] args)
{
for (int i = 0; i < 100; ++i)
{
if (i.IsPrime())
{
Console.WriteLine(i);
}
}
Console.ReadKey();
}
}
}
Заметка:
- Разница между регулярным статическим методом и методом расширения - это специальное ключевое слово для первого аргумента.
- Метод расширения не может быть объявлен в классе или структуре.
- Он также может быть объявлен на интерфейсе (например, IEnumerable <T>). Обычно интерфейс не будет иметь никакой реализации. Однако с помощью методов расширения вы можете добавлять методы, которые будут доступны для каждой конкретной реализации интерфейса
- Language Integrated Query (LINQ) - один из лучших примеров того, как вы можете использовать этот метод для улучшения существующего кода.
Примеры использования для методов расширения в C#
Давайте обсудим несколько вариантов использования для использования методов расширения.
1. Присоединить метаданные к перечислениям с помощью методов расширения
вы можете добавить метод к вашему перечислению, чтобы получить доступ к значениям, прикрепленным к атрибутам.
Давайте создадим атрибут для этого примера.
[AttributeUsage(AttributeTargets.All, AllowMultiple = true)]
class CultureAttribute : Attribute
{
string _culture;
public string Culture
{
get
{
return _culture;
}
}
public CultureAttribute(string culture)
{
_culture = culture;
}
}
Давайте создадим Enum:
enum BookLanguage
{
None = 0,
[Culture(“en-US”)]
[Culture(“en-UK”)]
English = 1,
[Culture(“es-MX”)]
[Culture(“es-ES”)]
Spanish = 2,
[Culture(“it-IT”)]
Italian = 3,
[Culture(“fr-FR”)]
[Culture(“fr-BE”)]
French = 4,
};
Наконец, нам нужно добавить метод расширения для доступа к этим атрибутам:
static class CultureExtensions
{
public static string[] GetCultures(this BookLanguage language)
{
//Примечание: это будет работать только для однозначных жанров
CultureAttribute[] attributes =
(CultureAttribute[])language.GetType().GetField(
language.ToString()).GetCustomAttributes(typeof(CultureAttribute),
string[] cultures = new string[attributes.Length];
for (int i = 0; i < attributes.Length; i++)
{
cultures[i] = attributes[i].Culture;
}
return cultures;
}
}
Теперь давайте проверим этот пример:
PrintCultures(BookLanguage.English);
PrintCultures(BookLanguage.Spanish);
static void PrintCultures(BookLanguage language)
{
Console.WriteLine(“Cultures for {0}:”, language);
foreach (string culture in language.GetCultures())
{
Console.WriteLine(“\t” + culture);
}
}
Выход будет:
Культуры для английского языка:
en-UK
en-US
Культуры для испанского языка:
es-MX
es-ES
2. Ускорение запросов с помощью PLINQ
Вы можете использовать метод расширения AsParallel () для ускорения запросов с помощью PLINQ
Если ваш первоначальный запрос
var query = from val in data
where (ComplexCriteria(val)==true)
select val;
foreach (var q in query)
{
//результат процесса
}
Где ComplexCriteria () является просто произвольной булевой функцией, которая анализирует значения в данных, то вы можете распараллелить это с помощью простого добавления:
var query = from val in data.AsParallel()
where (ComplexCriteria(val)==true)
select val;
foreach (var q in query)
{
//результат процесса
}
Визуальная студия поддерживает множество методов расширения. Visual Studio отмечает методы расширения в IntelliSense со стрелкой вниз, чтобы упростить их идентификацию.
В этой статье мы изучили метод расширения в C# и различные варианты использования для него.
