.NET委托类型的正确命名约定?


82

按照惯例,类通常被命名为名词,方法被称为动词,接口则被称为形容词。

委托的通用命名约定是什么?或者,当在类型和其他事物中列出代表时,区分名称的好方法是什么?

我的直接假设是将一个委托命名为一个形容词,因为单个方法接口通常可以被委托替换。

一些想法:

delegate object ValueExtracting(object container);

delegate object ValueExtractor(object container);

delegate object ValueExtractionHandling(object container);

delegate object ValueExtractionHandler(object container);

Answers:


111

我个人使用几种不同的模式:

[Task][State]Handler - UITaskFinishedHandler

[Event]Handler - ControlLoadedHandler

[Function Name]Delegate - DoSomeWorkDelegate -当我需要创建一个委托调用不同的/新线程函数中使用

[Task]Callback - ContainerLoadedCallback -当控制A开始其控制B则大部分工作和控制的,以控制B已通过了依赖性的动作中使用(即ControlA可能已经过去了一个UI容器ControlB填补,需要通知实际显示容器)

当您有一个使用大量多线程或异步WCF调用的项目时,最终可能会有很多委托浮空,因此采用至少对您有意义的标准很重要。


+1这是一个很好的约定。我也同意下面的@Aaronaught答案,在该答案中,由事件类型使用的委托应具有'EventHandler'后缀,而不仅仅是'Handler'。
塞缪尔

1
不幸的是,“ [Function Name] Delegate”违反了CA1711。我喜欢使用“ [Function Name] Func”或“ [Function Name] Action”,具体取决于它是否具有返回类型。
Tinister

1
到目前为止,这可能是唯一最有用(也是最短)的约定。向我+1。感谢您分享@slugster
FullStackForger

代码规则告诉你不要后缀与委托任何委托docs.microsoft.com/en-us/visualstudio/code-quality/...
基督教芬德利

2
@MelbourneDeveloper告诉创建RequestDelegateasp.net-core的人;-]
t3chb0t

48

微软的框架设计指南-对我来说是命名历书,关于该主题的内容如下

√不要将后缀“ EventHandler”添加到事件中使用的委托的名称。
√不要将后缀“回调”添加到除用作事件处理程序的委托人之外的其他委托人的名称上。
X不要将后缀“ Delegate”添加到委托中。


16
有趣的是,MS表示“请勿将后缀“代表”添加到代表中”,但在此示例中,他们有一个代表被称为ProcessBookDelegate...
PadawanLondon

@PadawanLondon与RequestDelegateasp.net-core中的故事相同-一致性和编码约定非常重要。我想甚至都不看自己的文档。
t3chb0t

16

由于委托是执行某动作(动词)的事物,因此应该将该委托命名为执行该动作的事物。以Converter<TInput, TOutput>为例。动词是Convert。进行转换的东西称为转换器,因此就是委托的名称。


6

这取决于几件事。

如果将委托用作事件,则应始终将其称为EventHandler子类型,例如:

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

如果不是这样,则MS编码指南(我似乎永远无法在Google上找到它的正确副本)明确建议不要在委托人名称包含“ delegate”或“ handler”之类的词,除非特殊情况是:EventHandler类型。

通常,委托应该以action命名,这类似于ValueExtracting(如果委托发生在提取值之前)或ValueExtracted(提取之后)。

Func<T1, T2, ..., TResult>委托语法也变得越来越普遍,但除非你有4个或多个参数往里走,你并不需要在所有声明自己-只需使用现有的:

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

当委托被用作闭包时,这种语法是最好的。委托人本身没有一个非常有趣的名称,但是参数是代理名词(提取器,提供者,评估者,选择器等)。

大多数代表用途归入上述任何一类,所以哪一个它被用于选择适当的身影了。


3

我从来没有想过这个问题,主要是因为我只使用一个EventHandler<T>Func<T>Action<T>过载,从不打扰我定义自己。我可能会从您列出的那些中选择ValueExtractor。这使它听起来更像一个对象,当您调用它时,您将使用该对象执行操作。例如:

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

此外,大多数内置的委托也被命名为名词。如有疑问,请遵循.NET框架。


0

我会选择ValueExtraction ..
我从没想过为什么,但是我想是因为您存储的是运算符,它应该是一个名词..严格来说,这不是运算符,我知道...


0

基于Enumerable.Sum,我将委托作为传递,并将Func<object, object>参数命名为selector

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

如果您必须为此指定自己的代表,那么我将继续使用,ValueExtractor因为这是其功能的最具描述性的名称。


这些泛型委托(Action和Func)可以处理95%的案例。在某些情况下,它们仍然远远不够用-就是当委托人具有复杂的签名并且被大量传递时。基本上,每个参数的作用应该是显而易见的,如果不是这样的话,那么命名委托是一个好主意。
马捷Zábský
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.