委托声明

3

你好,以下是我总结的问题代码片段。

在第一段代码中,我在同一个类中声明了委托和事件,在代码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 + "!");
        }
    }
}

code 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);

        }
    }
}

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

@Andreas:像线程安全和性能这样的问题。 - santosh singh
2
除了一些定义在不同类中的东西之外? - Marc Gravell
2
到目前为止,两者似乎都是一样的。你具体的问题是什么? - sunside
好的,这段代码根本没有明确涉及线程安全性,所以我认为它们在这方面并没有区别。 - Tim Barrass
据我所见,它们完全相同,都为“无”。 - sunside
显示剩余2条评论
2个回答

2
唯一的区别似乎是使用了一个单独的类。因此,只要方法和类型可访问,功能上几乎没有什么区别。
顺便说一下,您可能想考虑使用 Action<string> 作为接受 string 并返回 void 的委托,但请注意,事件应该通常遵循 (object sender, SomeEventArgsClass e) 模式(其中 SomeEventArgsClass:EventArgs,也可以使用 EventHandler<T>)。

2
实际上没有区别,但是你应该在类外部定义委托,因为委托是一个类(从Delegate派生而来)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接