您好 我在下面的代码片段中总结了我的问题。 在第一个代码中,我在同一个类中声明了一个委托和事件,而在代码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);
}
}
}
现在我有一个问题。这两个代码片段之间是否有任何差异(如线程安全,性能)?
答案 0 :(得分:2)
唯一的区别似乎是使用单独的类。所以没有:只要方法和类型可以访问,就没有什么功能差异。
作为旁注,您可能需要考虑Action<string>
代表string
并返回void
的代理,还要注意事件 >遵循(object sender, SomeEventArgsClass e)
模式(其中SomeEventArgsClass:EventArgs
,也许也使用EventHandler<T>
)
答案 1 :(得分:2)
实际上没有区别,但你应该在类之外定义委托,因为委托是一个类(派生自委托)。