Что такое методы расширения?

Что такое методы расширения в .NET?

EDIT: я опубликовал следующий вопрос при использовании методов расширения

9 Solutions collect form web for “Что такое методы расширения?”

Методы расширения позволяют разработчикам добавлять новые методы к публичному контракту существующего типа CLR без необходимости подclassа или перекомпилировать исходный тип.

Методы расширения помогают сочетать гибкость поддержки «утиной печати», популярной сегодня в динамических языках, с проверкой работоспособности и компиляции строго типизированных языков.

Ссылка: http://weblogs.asp.net/scottgu/archive/2007/03/13/new-orcas-language-feature-extension-methods.aspx

Вот пример метода расширения (обратите внимание на this ключевое слово infront первого параметра):

 public static bool IsValidEmailAddress(this string s) { Regex regex = new Regex(@"^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$"); return regex.IsMatch(s); } 

Теперь вышеупомянутый метод можно вызывать непосредственно из любой строки, например:

 bool isValid = "so@mmas.com".IsValidEmailAddress(); 

Добавленные методы также появятся в IntelliSense:

alt text http://sofru.miximages.com/.net/step1.jpg

Что касается практического использования методов расширения, вы можете добавить новые методы в class без получения нового classа.

Взгляните на следующий пример:

 public class Extended { public int Sum() { return 7+3+2; } } public static class Extending { public static float Average(this Extended extnd) { return extnd.Sum() / 3; } } 

Как вы видите, class Extended добавляет метод с именем average в class Extended . Чтобы получить среднее значение, вы вызываете average метод, так как он относится к extended classу:

 Extended ex = new Extended(); Console.WriteLine(ex.average()); 

Ссылка: http://aspguy.wordpress.com/2008/07/03/a-practical-use-of-serialization-and-extension-methods-in-c-30/

Почему я пишу еще один ответ?

Вышеуказанные ответы слишком сложны. Я предполагаю, что если вам нужно спросить, что такое метод расширения, вы не будете знать, что подразумевается под: (i) публичными контрактами, (ii) CLR, (iii) типов, (iv) подclassом ( v) утиная печать и т. д.

Методы расширения – простое объяснение

Предположим, у меня есть собака. Все собаки – все животные типа собаки – делают определенные вещи:

  1. Есть
  2. WagsTail
  3. Кричит «Уоф!»
  4. Шейки лапы и т. Д.

То, что может сделать собака, все называют «методами».

Теперь давайте предположим, что Великий программист в OO Heaven забыл добавить метод к classу собак: FetchNewspaper.

Вы хотите иметь возможность сказать:

 rex.FetchNewspaper(); // or wolfie.FetchNewspaper(); // or beethoven.FetchNewspaper(); 

…… даже если у вас нет доступа к исходному коду.

Как вы делаете, чтобы заставить вашу собаку сделать это?

Единственное решение – создать «метод расширения».

Создание метода расширения

(Обратите внимание на ключевое слово «this» перед первым параметром ниже):

 public static void FetchNewsPaper(this Dog familyDog) { ConsoleWriteline(“Goes to get newspaper!”) } 

И если вы хотите, чтобы ваша собака получила газету, просто выполните это:

 Dog freddie_the_family_dog = new Dog(); freddie_the_family_dog.FetchNewspaper(); 

Если у вас все еще есть вопросы, отправьте комментарий, и я попробую объяснить еще раз.

Методы расширения – это способы для разработчиков «добавлять» методы к объектам, которые они не могут контролировать.

Например, если вы хотите добавить метод «DoSomething ()» к объекту System.Windows.Forms, так как у вас нет доступа к этому коду, вы просто создадите метод расширения для формы со следующим синтаксисом.

 Public Module MyExtensions  _ Public Sub DoSomething(ByVal source As System.Windows.Forms.Form) 'Do Something End Sub End Module 

Теперь в форме вы можете вызвать «Me.DoSomething ()».

Таким образом, это способ добавить функциональность к существующим объектам без наследования.

Метод расширения – это «трюк компилятора», который позволяет моделировать добавление методов в другой class, даже если у вас нет исходного кода для него.

Например:

 using System.Collections; public static class TypeExtensions { ///  /// Gets a value that indicates whether or not the collection is empty. ///  public static bool IsEmpty(this CollectionBase item) { return item.Count == 0; } } 

Теоретически все classы коллекций теперь include метод IsEmpty который возвращает true, если метод не имеет элементов (при условии, что вы включили пространство имен, которое определяет class выше).

Если я пропустил что-то важное, я уверен, что кто-то укажет на это. (Пожалуйста!)

Естественно, существуют правила об объявлении методов расширения (они должны быть статическими, первый параметр должен быть предиктором this ключевого слова и т. Д.).

Методы расширения фактически не изменяют classы, которые они, по-видимому, расширяют; вместо этого компилятор управляет вызовом функции для правильного вызова метода во время выполнения. Однако методы расширения должным образом отображаются в раскрывающихся списках intellisense с отличительным значком, и вы можете документировать их так же, как и обычный метод (как показано выше).

Примечание. Метод расширения никогда не заменяет метод, если метод уже существует с той же сигнатурой.

Вот пример в VB.Net; обратите внимание на атрибут Extension (). Поместите это в модуль в свой проект.

 Imports System.Runtime.CompilerServices  _ Public Function IsValidEmailAddress(ByVal s As String) As Boolean If String.IsNullOrEmpty(s) Then Return False Return Regex.IsMatch(email, _ "^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$") End Function 

На этот вопрос уже был дан ответ, но я хотел бы добавить, что это очень полезно, если у вас есть типы, которые находятся в другом проекте, и вы не хотите возвращаться к этому проекту, чтобы добавить некоторые функции. Мы используем NHibernate и имеем проект для нашего уровня сохранения данных, который ребята хотят сохранить в чистоте. Чтобы получить хорошие и доступные дополнительные методы на этом объекте, я смог использовать методы расширения, и это действительно осветил мой день.

Кроме того, поскольку никто другой не разместил его, вот хорошая статья об этом в MSDN – http://msdn.microsoft.com/en-us/library/bb383977.aspx

Я думал, что добавлю объяснение, более концептуальное и менее зависимое от кода.

Представьте, что Форд откатывается от строительной линии. У вас нет доступа к строительной линии, но вы хотите, чтобы все автомобили Ford могли иметь дополнительный спойлер, добавленный в заднюю часть автомобиля (выглядит более прохладно, когда на дисплее). Как ты собираешься это сделать? В мире компьютеров, если у вас нет доступа к исходной строительной линии внутри завода Ford, вы не можете просто болтать вещи с Ford. Теперь вы можете: ВВЕДИТЕ методы расширения.

Теперь вы можете делать такие вещи:

 Ford hilux = new Ford(); hilux.DisplayRearFoiler(); // you can now do this even though you don't have access to the Ford source code. 

Вам нужно будет создать метод расширения. Обратитесь к приведенным выше ответам.

Я хочу ответить на методы расширения в терминах classа Sealed .

Предположим, у вас есть герметичный class, который содержит жизненно важные методы. Теперь вы хотите добавить к нему новый метод. Предположим, что этот class входит во внешнюю DLL, поэтому вы не можете добавить к нему новый метод. Что ты будешь делать ?

Возьмем еще один пример. Предположим, что class встроен в ваше приложение вашим Менеджером проектов или Гуру безопасности. Вы можете редактировать этот class только с разрешения вашего Менеджера проектов или Гуру безопасности.

Вы можете удалить Sealed Keyword из этого classа и наследовать его в другом classе. Затем внутри подclassа (который наследует этот class) вы можете добавить свой новый метод.

Но Wait -> Вы не можете просто удалить Sealed Keyword, поскольку это может поставить под угрозу безопасность всего приложения. Могу поспорить, что ваш премьер-министр или Гуру безопасности никогда не дадут вам такого разрешения, ссылаясь на проблемы безопасности.

Так что можно сделать здесь?

Ответ – это методы расширения, которые можно добавить в статический class, и вам даже не нужно прикасаться к закрытому classу.

Пример:-

 sealed class MyData { private double D1, D2, D3; public MyData(double d1, double d2, double d3) { D1 = d1; D2 = d2; D3 = d3; } public double Sum() { return D1 + D2 + D3; } } static class ExtendMyData { public static double Average(this MyData md) { return md.Sum() / 3; } } 

Я добавил публичный статический метод с именем Average для нового статического classа. Этот метод имеет параметр основного classа с ключевым словом this this.

Теперь, чтобы вызвать метод Average, я использую объект родительского закрытого classа, а не подclass.

  MyData md = new MyData(3, 4, 5); double exAverage = md.Average(); 

Надеемся, что вы найдете полезные методы расширения.

Метод расширения в C #

Что такое метод расширения?

 Extension method means Class name and method name are having with Static Key word. 

Метод расширения с использованием ключевого слова «this» и должен быть первым сигналом, указывающим идентификатор адреса, этот тип должен быть таким же,

public static string Meth ( эта строка i, int j)

а также

string res = “ae” .Meth (num);

Жирным шрифтом является идентификационный адрес. Пространство имен должно быть одинаковым.

Почему нам нужно расширение?

Мы используем одну и ту же функцию во многих местах, после того, как не смогли найти, почему мы здесь используем. По этой причине используется идентификация адреса. Статический означает единичный экземпляр. Это может вызвать только статическую функцию-член. Даже как сделать доступ без статических методов classа в classе Static? Пример: см. «Ошибка выброса» в методе «Саль»,

static class Emp {public int Sal (int i, int j) {return i * j; }}

Доступ только к статическому члену. А также

введите описание изображения здесь

Следующий код, который мы не могли бы создать объект для нестатического classа в статическом classе. Затем, как получить доступ к нестационарному методу в статический class. По этой причине мы следуем методу расширения без наследования.

Например, функция добавления или равномерности с использованием метода расширения здесь,

используя Систему. Текст;

используя System.Threading.Tasks;

namespace Extension_Method {static class Program {

  public static string Meth (this string i,int j) { if (j % 2 == 0) { return "Even"; } else { return "ODD"; } } } class program2 { static void Main (string [] args) { Console. WriteLine ("Enter Integer"); int num = Convert.ToInt32(Console.ReadLine()); string res = "ae".Meth(num); Console. WriteLine(res); Console.ReadLine(); } } 

Результат:

введите описание изображения здесь

Interesting Posts

Ресурс Classpath не найден при работе в качестве банки

Как обрабатывать загрузку файлов Windows с помощью Selenium WebDriver?

Что происходит в BeginProcessRequest ()?

Как заставить панель задач Vista охватывать несколько мониторов?

Как включить медленный журнал запросов MySQL без перезагрузки MySQL?

Как установить и использовать ASP.NET AJAX Control Toolkit в моих веб-приложениях .NET 3.5?

Регулярное выражение позволяет вводить цифры и одну точку

Запустить скрипт VBA из R

Понимание оптимизации возвращаемого значения и возврата временных рядов – C ++

Монитор нетбука Asus Eee не подходит для разъема

Как включить автоматическое выключение Interactive ssh logins через один час

Как получить доступ к разделу восстановления Windows 8 и как восстановить его на заводской образ?

Установка таймаута базы данных в Entity Framework

Когда JPA устанавливает @GeneratedValue @Id

Внедрение iframe на страницу с ограничительной политикой безопасности контента

Давайте будем гением компьютера.