C#内部代表和公共事件

C#内部代表和公共事件,c#,events,delegates,C#,Events,Delegates,我目前正在开发一个独立于任何应用程序的微型技术框架。业务代码只是指这个框架 根据本文:(例2),我们需要为定制事件提供一个委托 问题是,任何人都可以调用我的处理程序(然后引发事件),即使在我的业务代码中也是如此,这对我来说是不符合逻辑的,那么,使用仅为“内部”而非“公共”的委托引发自定义事件的最佳方法是什么呢 谢谢你的帮助。我不确定我是否做对了。我认为,如果您为自定义事件提供公共委托类型,任何人都可以引发该事件 嗯,那不是真的。只有定义该自定义事件的类才能引发它。如果这是您的问题,不要担心。委托

我目前正在开发一个独立于任何应用程序的微型技术框架。业务代码只是指这个框架

根据本文:(例2),我们需要为定制事件提供一个委托

问题是,任何人都可以调用我的处理程序(然后引发事件),即使在我的业务代码中也是如此,这对我来说是不符合逻辑的,那么,使用仅为“内部”而非“公共”的委托引发自定义事件的最佳方法是什么呢


谢谢你的帮助。

我不确定我是否做对了。我认为,如果您为自定义事件提供公共
委托
类型,任何人都可以引发该事件


嗯,那不是真的。只有定义该自定义事件的类才能引发它。如果这是您的问题,不要担心。

委托只是描述事件“签名”的类型声明。这必须公开。要实际调用事件,通常需要实现一个名为
OnEvent
的方法(用
Click
Closed
或任何描述事件的方法替换
event
)。此方法在类中应该是私有的(或受保护的)


您不能使用不如事件“可见”的委托声明事件。

不正确。不允许在事件所属的类之外调用事件。其他人只能对您的事件使用
+=
-=
运算符。只有在类中,才能调用事件。这是事件和普通委托之间的区别。即:

public Data
{
   public event EventHandler OnSave
   public EventHandler OnLoad;

   private void Load()
   {
       if (OnLoad!=null) OnLoad();  
       //other operations
   }
   private void Save()
   {
       if (OnSave!=null) OnSave();  
       //other operations
   }
}
在课堂之外:

Data data = new Data();
data.OnLoad += (s,e) => {}; 
data.OnSave += (s,e) => {};
data.OnLoad = (s,e)=>{}; 
//data.OnSave = (s,e)=>{};  //invalid
data.OnLoad();
//data.OnSave();  //invalid
一种方法是:

创建一个方法来代替公共事件,该方法将手动订阅所需的委托,并将它们存储在“private List\u delegates”字段中

然后,从“内部”,在你想要的时候给每个人打电话

public class Framework 
{
    public delegate void Method();
    public void AttachEvent(Method M)
    {
         _methods.Add(M);
    }
    private List<Method> _methods;
    private FireMethods() 
    {
         _methods.Foreach(x=>x.Invoke());
    }
}
公共类框架
{
公共委托无效方法();
公共无效附件(方法M)
{
_方法:添加(M);
}
私有列表方法;
私人消防方法()
{
_methods.Foreach(x=>x.Invoke());
}
}
或者,您可以采用事件的“按设计”功能,而这些事件不是公开的
Invoke()
-able

:)

问题是,任何人都可以调用我的处理程序(然后引发事件),即使是在我的业务代码中

那不是真的。您可以按如下方式声明一个事件:

public event FooEventHandler Foo;
外部代码可以对事件执行的唯一操作是订阅事件(
+=
),或取消订阅事件(
-=
)。它无法访问编译器作为私有字段生成的实际委托。换句话说,此代码将无效:

SomeClass x = new SomeClass();
x.Foo(x, new FooEventArgs()); // compilation error here
不要忘记,事件实际上是一对方法(add和remove)。编译器将事件声明重写为以下内容:

private FooEventHandler _foo;

public event FooEventHandler Foo
{
    add { _foo += value; }
    remove { _foo -= value; }
}
(生成的代码实际上有点复杂,带有一些锁定以确保线程安全)


如您所见,
\u foo
字段是私有的,因此客户端代码无法访问它。只有事件的
add
remove
访问器是可访问的。

是的,我看到了其他帖子-好吧,有时候你不得不徒劳,如果没有其他人会:)是的,就是这样,你明白了。我很困惑…:-(当您在类a中将委托声明为public时,那么创建类a对象的任何其他类都可以访问该委托。不是吗?那么为什么不将该委托声明为private for safetyTiens,tu es le Arnaud F.de Developpez.com?我正在查看具有“internal event SaveDelegate Save=null;”的代码这是否意味着不会发生任何事件,我看不出它的意义。@AriesOnly:
内部
公共
类似,只是它仅限于同一个程序集。即使事件是
私有
也可能发生,但只有具有该事件的类才能处理它。由于这也是现代C#开发工具可以向您展示在代码中引发事件的位置和处理事件的位置。