Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 命名、声明和定义委托和事件约定 如何命名委托、事件和事件实例?_C#_.net_Coding Style - Fatal编程技术网

C# 命名、声明和定义委托和事件约定 如何命名委托、事件和事件实例?

C# 命名、声明和定义委托和事件约定 如何命名委托、事件和事件实例?,c#,.net,coding-style,C#,.net,Coding Style,我用这个: delegate void OnSomethingHandler(); event OnSomethingHandler onSomething; 这是公认的方式吗?注意小写和大写 您将代表和活动放置在何处? 我通常将委托放在一个名称空间中,以最好地反映它们: mynamespace.Def.SomethingLike { } mynamespace.Def.SomethingElseLike { } 你在哪里定义事件? 我通常把它们放在使用它们的班级里 我注意到很多人在

我用这个:

delegate void OnSomethingHandler();
event OnSomethingHandler onSomething;
这是公认的方式吗?注意小写和大写


您将代表和活动放置在何处? 我通常将委托放在一个名称空间中,以最好地反映它们:

mynamespace.Def.SomethingLike
{

}
mynamespace.Def.SomethingElseLike
{

}

你在哪里定义事件? 我通常把它们放在使用它们的班级里

我注意到很多人在同一个类中定义委托和事件。这有多普遍?

事件总是指一些动作,要么是正在发生的动作,要么是已经发生的动作。因此,与方法一样,事件用动词命名,动词时态用于指示事件发生的时间

DO用动词或动词短语命名事件

示例包括单击的
绘制的
下拉的
,等等

DO使用现在时态和过去时态,给事件命名时使用before和after的概念

例如,在窗口关闭之前引发的关闭事件将被称为
关闭
,而在窗口关闭之后引发的关闭事件将被称为
关闭

X不要使用“Before”或“After”前缀或后缀来表示事件前后。使用刚才描述的现在时态和过去时态

DO使用“EventHandler”后缀命名事件处理程序(用作事件类型的委托),如下例所示:

public delegate void ClickedEventHandler(object sender, ClickedEventArgs e);
DO在事件处理程序中使用两个名为sender和e的参数

sender参数表示引发事件的对象。发送方参数的类型通常为
object
,即使可以使用更具体的类型

DO使用“EventArgs”后缀命名事件参数类

因此,事件应该用动词或动词短语命名。使用
Something
,而不是
Something
,假设
Something
实际上是一个动词,比如
Close
单击
,或者
managedpipleline放弃
managedpipleline放弃

事件的委托应使用
EventHandler
后缀命名,并给出
CloseEventHandler
ClickEventHandler
managedpiplelineauditinghandler

对于与事件无关的委托,请使用名词,如
EventProcessor
ItemRetriever
,而该委托的实例是动词,如
processEvent
retrieveItem

代理引用的大小写应该是驼峰,除非引用不是私有的。不过,我想不出哪种情况会有非私有的委托字段

但是,由于建议使用传统的事件处理程序签名(即
对象发送方,EventArgs e)
),因此您应该使用它,而不是定义自己的签名。也就是说,您的事件定义如下:

event EventHandler<SomethingEventArgs> Something;
delegate void SomethingHandler();
event SomethingHandler Something;

protected void OnSomething()
{
    if (this.Something != null)
        this.Something();
}
事件事件处理程序;

您拥有的一切看起来都很标准-我唯一要更改的是,事件名称将是
某物
,而不是
某物
。按照微软的惯例,你最终会得到类似的结果:

event EventHandler<SomethingEventArgs> Something;
delegate void SomethingHandler();
event SomethingHandler Something;

protected void OnSomething()
{
    if (this.Something != null)
        this.Something();
}
作为一个很酷的技巧,您可以将一个空委托添加到
Something
事件中,这样您就不必在引发事件之前检查事件是否为null:

delegate void SomethingHandler();
event SomethingHandler Something = delegate {};

protected void OnSomething()
{
    this.Something();
}

在bdukes答案/总结的基础上展开,并使用我找到的一个示例,以下是我的尝试:

//from http://www.codeproject.com/Articles/11541/The-Simplest-C-Events-Example-Imaginable
using System;
namespace wildert
{
    public class TimeOfTickEventArgs : EventArgs //<- custom event args
    {
        private DateTime TimeNow;
        public DateTime Time
        {
            set { TimeNow = value; }
            get { return this.TimeNow; }
        }
    }
    public class Metronome
    {
        public delegate void TickEventHandler(object sender, TimeOfTickEventArgs e); //I put the delegate declaration before the events
        public event TickEventHandler Ticked; //Ticked(i.e. after something occurred), or possibly Ticking(i.e. before)

        public void Start()
        {
            while (true)
            {
                System.Threading.Thread.Sleep(3000);
                if (Ticked != null){
                    TimeOfTickEventArgs tot = new TimeOfTickEventArgs();
                    tot.Time = DateTime.Now;
                    Ticked(this, tot); //<- publish the event
                }
            }
        }
    }
    public class Listener
    {
        public void Subscribe(Metronome m){
            m.Ticked += new Metronome.TickEventHandler(HeardIt);  //<- subscribe to the event
        }
        private void HeardIt(object sender, TimeOfTickEventArgs e){ //<- this is the event handler (note signature 'object sender, xxx e')
            System.Console.WriteLine("HEARD IT AT {0}",e.Time);
        }
    }
    class Test
    {
        static void Main()
        {
            Metronome m = new Metronome();
            Listener l = new Listener();
            l.Subscribe(m);
            m.Start();
        }
    }
}
//来自http://www.codeproject.com/Articles/11541/The-Simplest-C-Events-Example-Imaginable
使用制度;
命名空间wildert
{

PrimeTimeTimeTimeEngsGs:EngestGs//我会考虑将一些事件EngAsgGS加入到您的样本中,因为这是公约的一部分。此外,EventHandler更常见于POST 2之后。