代表声明

时间:2010-12-09 12:07:23

标签: c#

您好 我在下面的代码片段中总结了我的问题。 在第一个代码中,我在同一个类中声明了一个委托和事件,而在代码2 中,我已在单独的类中声明了委托和事件。

代码1

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        delegate void Greeting(string s);
        event Greeting myEvent;
        void OnFire(string s)
        {
            if (myEvent != null)
                myEvent(s);

        }
        static void Main(string[] args)
        {
            Program obj = new Program();
            obj.myEvent += new Greeting(obj_myEvent);
            obj.OnFire("World");
        }

        static void obj_myEvent(string s)
        {
            Console.WriteLine("Hello " + s + "!");
        }
    }
}

代码2

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            DelegateDemo obj = new DelegateDemo();
            obj.myEvent+=new DelegateDemo.Greeting(obj_myEvent);
            obj.OnFire("World");
        }

        static void obj_myEvent(string s)
        {
            Console.WriteLine("Hello "+s +"!");
        }
    }
}

DelegateDemo.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    public class DelegateDemo
    {
       public delegate void Greeting(string s);
       public event Greeting myEvent;
       public void OnFire(string s)
        {
            if (myEvent != null)
                myEvent(s);

        }
    }
}

现在我有一个问题。这两个代码片段之间是否有任何差异(如线程安全,性能)?

2 个答案:

答案 0 :(得分:2)

唯一的区别似乎是使用单独的类。所以没有:只要方法和类型可以访问,就没有什么功能差异。

作为旁注,您可能需要考虑Action<string>代表string并返回void的代理,还要注意事件 >遵循(object sender, SomeEventArgsClass e)模式(其中SomeEventArgsClass:EventArgs,也许也使用EventHandler<T>

答案 1 :(得分:2)

实际上没有区别,但你应该在类之外定义委托,因为委托是一个类(派生自委托)。