Что такое Дополнительные Методы?

Неустранимая ошибка: [TraitA] и [TraitB] определяют одно и то же свойство ([$ x]) в композиции [ClassC]

Происходит, когда класс пытается use несколько Черты , где две или более из этих признаков имеют , определяют свойство с тем же именем и с свойством, имеющим разные начальные значения.

Пример:

Проблемное: хотя можно разрешить конфликты между конкурирующими методами , в настоящее время нет синтаксиса, который бы разрешил конфликт между двумя конкурирующими свойствами. Единственное решение в это время - refactor ; т.е. избежать конфликта между именами свойств, которые приводят к фатальной ошибке.


Вопросы, относящиеся:

43
задан Community 23 May 2017 в 12:01
поделиться

4 ответа

Дополнительные методы позволяют разработчикам добавлять новые методы к государственному контракту существующего типа 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:

alt text
(источник: 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());

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

57
ответ дан Glorfindel 26 November 2019 в 22:53
поделиться

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

, Например, если Вы хотели добавить "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 ()".

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

6
ответ дан Tom Anderson 26 November 2019 в 22:53
поделиться

Дополнительный метод является "приемом компилятора", который позволяет Вам моделировать добавление методов к другому классу, даже если у Вас нет исходного кода для него.

, Например:

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, выпадает с отличительным значком, и можно зарегистрировать их точно так же, как Вы были бы нормальный метод (как показано выше).

Примечание: дополнительный метод никогда замены метод, если метод уже существует с той же подписью.

5
ответ дан Mike Hofer 26 November 2019 в 22:53
поделиться

Вот пример в 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
1
ответ дан Sisiutl 26 November 2019 в 22:53
поделиться