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

时间:2010-02-27 03:00:29

标签: .net delegates naming-conventions

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

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

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

一些想法:

delegate object ValueExtracting(object container);

delegate object ValueExtractor(object container);

delegate object ValueExtractionHandling(object container);

delegate object ValueExtractionHandler(object container);

8 个答案:

答案 0 :(得分:98)

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

[Task][State]Handler - UITaskFinishedHandler

[Event]Handler - ControlLoadedHandler

[Function Name]Delegate - DoSomeWorkDelegate - 当我需要创建一个委托来调用另一个/新线程上的函数时使用

[Task]Callback - ContainerLoadedCallback - 当控件A启动一个操作时使用,控件B执行大部分工作并且控件A已将依赖关系传递给控件B(即ControlA可能已通过一个UI容器,用于ControlB填充并需要通知以实际显示容器)

当你有一个使用大量多线程或异步WCF调用的项目时,最终会有很多代表浮动,所以采用一个至少对你有意义的标准是很重要的。

答案 1 :(得分:37)

Framework Design Guidelines - 我的命名年鉴,the following就此主题说:

  

√请添加后缀" EventHandler"到使用的代表的名称   在事件中。
  √请添加后缀" Callback"代表其他人的名字   而不是那些用作事件处理程序的人。
  X不要添加后缀"代表"给代表。

答案 2 :(得分:15)

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

答案 3 :(得分:6)

这取决于一些事情。

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

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

如果它不是一个事件,那么MS编码指南(我似乎永远无法在Google上找到正确的副本)明确建议反对,包括“委托”或“处理程序”等字样在EventHandler类型的特殊情况下,代理名称​​除了

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

Func<T1, T2, ..., TResult>委托语法也变得越来越普遍,但除非您有4个或更多参数,否则您根本不需要声明自己 - 只需使用现有的:

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

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

大多数代表用法都符合上述类别中的一个,因此请确定使用哪个类别进行适当选择。

答案 4 :(得分:3)

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

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

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

答案 5 :(得分:0)

我会选择ValueExtraction ..
我从来没有想过为什么,但我想因为你正在存储一个操作,它应该是一个名词.. 严格来说,这不是一项行动,我知道......

答案 6 :(得分:0)

根据Enumerable.Sum,我将代理作为Func<object, object>传递,并将参数命名为selector

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

如果你必须为自己制作代表,我会选择ValueExtractor,因为这是它最具描述性的名称。

答案 7 :(得分:0)

对于事件(带有委托),Windows窗体使用以下约定:

委托:

public delegate void MouseEventHandler(object sender, MouseEventArgs e);

事件:

public event MouseEventHandler MouseClick;

事件监听器:

this.MouseClick += new System.Windows.Forms.MouseEventHandler(this.Form1_MouseClick);