День сто девяносто восьмой. #ЗаметкиНаПолях

Частичные методы

В C# 3 добавлена дополнительный функционал для частичных классов - частичные методы. Это методы, объявленные без тела в одной части, а затем опционально реализованные в другой части. Частичные методы неявно являются private, должны возвращать void и не иметь out параметров (можно использовать параметры ref). Во время компиляции сохраняются только частичные методы, имеющие реализации; если частичный метод не был реализован, он и все его вызовы удаляются. Это звучит странно, но позволяет автоматически сгенерированному коду предоставлять точки перехвата (hooks) для добавления дополнительной логики в коде, написанном вручную. Это может быть реально полезно. В примере ниже объявлены два частичных метода:

partial class PartialMethodsDemo

{

public PartialMethodsDemo()

{

OnConstruction();

}

public override string ToString()

{

string ret = "Original return value";

CustomizeToString(ref ret);

return ret;

}

partial void OnConstruction();

partial void CustomizeToString(ref string text);

}

Во втором файле частичного класса один из методов реализован, а другой – нет:

partial class PartialMethodsDemo

{

partial void CustomizeToString(ref string text)

{

text += " - customized!";

}

}

В листинге первая часть кода, скорее всего, будет сгенерирована автоматически, объявляет два метода, позволяющие обеспечить дополнительное поведение в конструкторе и при получении строкового представления объекта. Вторая часть соответствует написанному вручную коду, который не требует дополнительной логики в конструкторе, но хочет изменить строковое представление, возвращаемое ToString(). Несмотря на то, что метод CustomizeToString не может возвращать значение напрямую, он может передавать информацию вызывающему его методу через ref параметр. Поскольку OnConstruction не реализован, он и вызовы его удаляются компилятором.



Источник: Jon Skeet “C# In Depth”. 4th ed – Manning Publications Co, 2019. Глава 2.