Подтвердить что ты не робот

Правильное соглашение об именах для типа .NET Delegate?

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

Каково общее соглашение об именах для делегата? Или какой хороший способ отличить его имя, когда делегаты перечислены среди типов и других вещей?

Мое непосредственное предположение - скорее назвать делегата скорее прилагательным, потому что один интерфейс метода часто может быть заменен делегатом.

Некоторые мысли:

delegate object ValueExtracting(object container);

delegate object ValueExtractor(object container);

delegate object ValueExtractionHandling(object container);

delegate object ValueExtractionHandler(object container);
4b9b3361

Ответ 1

Лично я использую пару разных шаблонов:

[Task][State]Handler - UITaskFinishedHandler

[Event]Handler - ControlLoadedHandler

[Function Name]Delegate - DoSomeWorkDelegate - используется, когда мне нужно создать делегат для вызова функции в другом/новом потоке

[Task]Callback - ContainerLoadedCallback - используется, когда элемент управления A запускает действие, управление которым B выполняет большую часть работы, и элемент управления A прошел зависимость для управления B (то есть ControlA мог пройти интерфейс контейнер для ControlB для заполнения и требует уведомления для фактического отображения контейнера)

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

Ответ 2

Microsoft Framework Design Guidelines - именной альманах для меня, говорит следующее по теме:

√ добавляйте суффикс "EventHandler" к именам делегатов, которые используются в событиях.
√ добавляйте суффикс "обратный вызов" к именам делегатов, кроме тех, которые используются в качестве обработчиков событий.
X НЕ добавляйте суффикс "Делегат" к делегату.

Ответ 3

Поскольку делегат - это то, что выполняет действие (глагол), делегат должен быть назван тем, что вы бы назвали тем, что выполняет это действие. Возьмите Converter<TInput, TOutput>, например. Глагол Преобразовать. То, что делает преобразование, называется конвертер, поэтому имя делегата.

Ответ 4

Это зависит от нескольких вещей.

Если делегат будет использоваться как событие, его всегда следует называть подтипом EventHandler, например:

public delegate void ValueExtractingEventHandler(object sender,
    ValueExtractingEventArgs e);

Если это не событие, тогда руководство по кодированию MS (которое я никогда не могу найти правильную копию в Google) явно рекомендую не включать в имя делегата слова, такие как "делегат" или "обработчик", кроме специальный случай типов EventHandler.

Обычно делегаты должны быть названы после действий, которые будут похожи на ValueExtracting (если делегирование происходит до того, как значение будет извлечено) или ValueExtracted (после извлечения).

Синтаксис делегата Func<T1, T2, ..., TResult> также становится все более распространенным, но если у вас нет 4 или более параметров, которые вам нужны, вам не нужно вообще объявлять свои права - просто используйте существующий:

object ExtractObject(object source, Func<object, object> extractor);

Этот синтаксис лучше всего, когда делегат используется как закрытие. Сам делегат не имеет очень интересного имени, но аргумент является существительным агента (экстрактор, поставщик, оценщик, селектор и т.д.).

Большинство применений делегатов вписываются в одну из вышеуказанных категорий, поэтому выясните, какой из них он использует для выбора соответствующим образом.

Ответ 5

Я никогда не думал об этом, главным образом потому, что я просто использую одну из перегрузок EventHandler<T>, Func<T> или Action<T> и никогда не буду определять свои собственные. Вероятно, я бы выбрал ValueExtractor из тех, которые вы указали. Это делает звук более похожим на объект, и когда вы его вызываете, вы будете использовать этот объект для выполнения действия. Например:

ValueExtractor extractor += Blah;
var value = extractor(data);

Кроме того, большинство встроенных делегатов называются именами. Если вы сомневаетесь, следуйте платформе .NET.

Ответ 6

Я бы пошел с ValueExtraction..
Я никогда не думал, почему, но я думаю, потому что вы храните операцию, и она должна быть существительным. строго это не операция, я знаю...

Ответ 7

На основе Enumerable.Sum я передал делегат как Func<object, object> и назову параметр selector:

void Foo(Func<object, object> selector) ...

Если вам нужно сделать для этого свой собственный делегат, я бы пошел с ValueExtractor, так как это самое описательное имя для его создания.