Страницы

Поиск по вопросам

понедельник, 8 апреля 2019 г.

Partial методы в C#

Какое практическое применение есть для partial методов?
Например,
partial class A { partial void OnSomethingHappened(string s); }
partial class A { partial void OnSomethingHappened(String s) { Console.WriteLine("Something happened: {0}", s); } }

Partial Method C#


Ответ

Если вопрос именно про про практическое применение - то оно достаточно ограничено тем, что partial методы могут возвращать только void. Т.е. систему "архитектор объявляет методы, разработчик реализует" на partial не построишь.
Есть два основных применения:
Упрощение подключения обработчиков, Например, в global.asax в ASP.NET, достаточно объявить метод с нужным именем:
protected void Application_Start(object sender, EventArgs e)
и его автоматически прицепит к обработчику события Start.
Если вы попытаетесь сделать похожий механизм в своем кодогенераторе - то будет достаточно объявить все возможные "обработчики" как partial методы, и вызвать их в соответствующих местах. Если компилятор найдет реализацию обработчика - он оставит вызов. Если нет - просто вырежет. Отладочные вызовы для написания юнит-тестов, особенно для случаев бросания исключений. Например, вам нужно написать тест на обработку ошибки подключения к Redis, причем именно на ошибки сокета. Инкапсулировть всю работу с сокетами в класс-обертку только ради тестового бросания исключений - дорого и долго. Можно сделать точечную отладочную вставку в живом коде:
internal sealed partial class PhysicalConnection : IDisposable, ISocketCallback { partial void OnDebugAbort(); //...
SocketMode ISocketCallback.Connected(Stream stream, TextWriter log) { //... // disallow connection in some cases OnDebugAbort(); //... } }
И написать реализацию, которая будет существовать только в отладочном варианте
#if DEBUG internal partial class PhysicalConnection { partial void OnDebugAbort() { if (!Multiplexer.AllowConnect) { throw new RedisConnectionException(ConnectionFailureType.InternalFailure, "debugging"); } } #endif

Комментариев нет:

Отправить комментарий