Какое практическое применение есть для 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
Комментариев нет:
Отправить комментарий