Происходит, когда класс пытается use
несколько Черты , где две или более из этих признаков имеют , определяют свойство с тем же именем и с свойством, имеющим разные начальные значения.
Пример:
Проблемное: хотя можно разрешить конфликты между конкурирующими методами , в настоящее время нет синтаксиса, который бы разрешил конфликт между двумя конкурирующими свойствами. Единственное решение в это время - refactor ; т.е. избежать конфликта между именами свойств, которые приводят к фатальной ошибке.
Вопросы, относящиеся:
Дополнительные методы позволяют разработчикам добавлять новые методы к государственному контракту существующего типа CLR, не имея необходимость разделить его на подклассы или перекомпилировать исходный тип.
Дополнительная справка Методов смешивают гибкость "утки, вводящей" поддержку, популярную в динамических языках сегодня с производительностью и проверкой времени компиляции языков со строгим контролем типов.
Ссылка: 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:
(источник: scottgu.com )
Что касается практического применения для Дополнительных Методов, Вы могли бы добавить новые методы к классу, не получая новый класс.
Смотрят на следующий пример:
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;
}
}
, Как Вы видите, класс Extending
добавляет метод, названный средним числом к классу Extended
. Для получения среднего числа Вы звоните average
метод, поскольку это принадлежит extended
класс:
Extended ex = new Extended();
Console.WriteLine(ex.average());
Дополнительные методы являются способами для разработчиков "прибавить" методы к объектам, которыми они не могут управлять.
, Например, если Вы хотели добавить "DoSomething ()" метод к Системе. Windows. Объект форм, так как у Вас нет доступа к тому коду, Вы просто создали бы дополнительный метод для формы со следующим синтаксисом.
Public Module MyExtensions
<System.Runtime.CompilerServices.Extension()> _
Public Sub DoSomething(ByVal source As System.Windows.Forms.Form)
'Do Something
End Sub
End Module
Теперь в форме можно позвонить "Мне. DoSomething ()".
, Таким образом, это - способ добавить функциональность к существующим объектам без наследования.
Дополнительный метод является "приемом компилятора", который позволяет Вам моделировать добавление методов к другому классу, даже если у Вас нет исходного кода для него.
, Например:
using System.Collections;
public static class TypeExtensions
{
/// <summary>
/// Gets a value that indicates whether or not the collection is empty.
/// </summary>
public static bool IsEmpty(this CollectionBase item)
{
return item.Count == 0;
}
}
В теории, все классы набора теперь включают IsEmpty
метод, который возвращает true, если метод не имеет никаких объектов (при условии, что Вы включали пространство имен, которое определяет класс выше).
, Если я пропустил что-либо важное, я уверен, что кто-то укажет на него. (!)
Естественно, существуют правила об объявлении дополнительных методов (они должны быть статичными, первому параметру нужно предшествовать this
ключевое слово, и так далее).
Дополнительные методы на самом деле не изменяют классы, которые они, кажется, расширяют; вместо этого, компилятор искажает вызов функции правильно вызвать метод во времени выполнения. Однако дополнительные методы правильно появляются в intellisense, выпадает с отличительным значком, и можно зарегистрировать их точно так же, как Вы были бы нормальный метод (как показано выше).
Примечание: дополнительный метод никогда замены метод, если метод уже существует с той же подписью.
Вот пример в VB.Net; заметьте Расширение () атрибут. Поместите это в Модуль в Вашем проекте.
Imports System.Runtime.CompilerServices
<Extension()> _
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