Методы расширения в 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# и различные варианты использования для него.

Источник: http://www.csharpstar.com/extension-methods-csharp/

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (1 оценок, среднее: 5,00 из 5)
Adblock
detector