我们可以创建一个非现场事件吗?

肖恩·卢汀(Shaun Luttin)

在C#中,Jon Skeet指出:

开发人员经常混淆事件和委托实例,或者用委托类型声明的事件和字段。

在阅读了他的解释之后,我了解了更多,尽管我仍然对事件的确切含义感到困惑。从下面的代码看来,一个事件所做的一切似乎是限制一个类必须委派另一个类中的字段的访问。

...您通常不希望类外的代码能够随意更改(或调用)事件的处理程序... [所以]编译器将声明转换为具有默认添加/删除实现的事件和相同类型的私有字段。

换句话说,由于访问控制,事件不同于委托。还是仅仅因为乔恩所说的“类似领域的事件”?

  • 类似现场的事件与事件不同吗?
  • C#中的事件是否总是像字段一样,还是我们也可以创建不像字段一样的事件?
  • 一个事件和一个类似字段的事件之间有什么区别(如果有)?

换句话说,C#是否同时支持事件和类似字段的事件,或者这两种说法是相同的?

此处的代码示例https://dotnetfiddle.net/7fOwvb

using System;
using System.Reflection;

public delegate void TheDelegate(string message);
public static class Program
{
    public static event TheDelegate TheEvent;
    public static TheDelegate DelInstance;
    public static void Main()
    {
        DelInstance = new TheDelegate(TheMethod);
        DelInstance += TheMethod;
        DelInstance.Invoke("Invoke the delegate.");
        PrintMemberInfo(DelInstance.GetType());

        TheEvent += TheMethod;
        TheEvent += TheMethod;
        TheEvent.Invoke("Invoke the event.");
        PrintMemberInfo(TheEvent.GetType());        

        new AnotherClass();
    }

    // Create a method for a delegate. 
    public static void TheMethod(string message)
    {
        Console.WriteLine(message);
    }

    public static void PrintMemberInfo(System.Type t)
    {
        foreach (MemberInfo m in t.GetMembers())
        {
            Console.Write(m.Name + ", ");
        }
        Console.WriteLine("\n");
    }
}

public class AnotherClass
{
    public AnotherClass()
    {
        Program.DelInstance += new TheDelegate(AnotherMethod);
        Program.DelInstance.Invoke("Another class");

        // Error... we can only call += or -+
        // Program.TheEvent.Invoke();
    }

    public void AnotherMethod(string message)
    {
        Console.WriteLine(message);
    }
}
乱码

类字段事件是等同于自动属性的事件,即具有编译器生成add/remove访问器的事件

类田间活动

在包含事件声明的类或结构的程序文本中,某些事件可以像字段一样使用。要以这种方式使用,事件不得为抽象事件或外部事件,并且不得显式包含event-accessor-declaration。这样的事件可以在允许字段的任何上下文中使用。该字段包含一个委托(§15),该委托引用已添加到事件的事件处理程序的列表。如果未添加事件处理程序,则该字段包含null。

(C#5.0规范)

您可以在C#中使用自定义访问器(addremove实现事件

event EventHandler IDrawingObject.OnDraw
{
    add
    {
        ...
    }
    remove
    {
        ...
    }
}

请参见如何:实现自定义事件访问器(《 C#编程指南》)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我们可以从SSRS订阅报告中创建一个只读文件吗

来自分类Dev

在C ++中,我们可以为每个整数创建一个类吗?

来自分类Dev

我们可以手动创建一个Android Studio项目吗?

来自分类Dev

我们可以创建一个没有括号的对象吗?

来自分类Dev

我们可以在 Flutter 中创建一个新的小部件吗?

来自分类Dev

我们可以创建一个不满足用于创建对象的类吗?

来自分类Dev

我们可以在另一个事件上调用为一个事件编写的JS函数吗?

来自分类Dev

我们可以使用一个RowMapper对象而不是每次创建对象来获取结果吗?

来自分类Dev

我们可以为两个协议http和https创建一个wcf服务吗

来自分类Dev

我们可以在分支上创建一个空的提交而不切换到它吗

来自分类Dev

Draw.io -- 我们可以通过导入 SVG 来创建一个新的形状库吗?

来自分类Dev

我们可以让一个vtable共享我的多个类吗

来自分类Dev

我们可以在一个查询中使用两个枢轴吗?

来自分类Dev

我们可以在C中与变量一起声明一个函数吗?

来自分类Dev

我们可以在Java中有一个AtomicEnum吗?

来自分类Dev

我们可以对group_concat(distinct somefield)做一个DISTINCT吗?

来自分类Dev

我们可以有一个由名称参数函数组成的数组吗?

来自分类Dev

我们可以在ocaml中定义一个参数为0的函数吗?

来自分类Dev

我们可以将IBOutlets放在一个类别中吗?

来自分类Dev

我们可以为一个zend \ form设置多个水化器吗?

来自分类Dev

我们可以两次提交一个jsp表格吗?

来自分类Dev

我们可以有一个空的基本路径吗?

来自分类Dev

我们可以有一个不在类型上但在操作上的模板吗

来自分类Dev

我们可以在NEXT JS中建立一个门户吗

来自分类Dev

我们可以使用Ember.js建立一个静态网站吗?

来自分类Dev

我们可以在WSO2ESB中设置一个数组吗?

来自分类Dev

我们可以打补丁一个已经打补丁的字体吗?

来自分类Dev

我们可以得到一个NODE的XPATH吗

来自分类Dev

我们可以在类声明中声明一个类类型的指针吗?

Related 相关文章

  1. 1

    我们可以从SSRS订阅报告中创建一个只读文件吗

  2. 2

    在C ++中,我们可以为每个整数创建一个类吗?

  3. 3

    我们可以手动创建一个Android Studio项目吗?

  4. 4

    我们可以创建一个没有括号的对象吗?

  5. 5

    我们可以在 Flutter 中创建一个新的小部件吗?

  6. 6

    我们可以创建一个不满足用于创建对象的类吗?

  7. 7

    我们可以在另一个事件上调用为一个事件编写的JS函数吗?

  8. 8

    我们可以使用一个RowMapper对象而不是每次创建对象来获取结果吗?

  9. 9

    我们可以为两个协议http和https创建一个wcf服务吗

  10. 10

    我们可以在分支上创建一个空的提交而不切换到它吗

  11. 11

    Draw.io -- 我们可以通过导入 SVG 来创建一个新的形状库吗?

  12. 12

    我们可以让一个vtable共享我的多个类吗

  13. 13

    我们可以在一个查询中使用两个枢轴吗?

  14. 14

    我们可以在C中与变量一起声明一个函数吗?

  15. 15

    我们可以在Java中有一个AtomicEnum吗?

  16. 16

    我们可以对group_concat(distinct somefield)做一个DISTINCT吗?

  17. 17

    我们可以有一个由名称参数函数组成的数组吗?

  18. 18

    我们可以在ocaml中定义一个参数为0的函数吗?

  19. 19

    我们可以将IBOutlets放在一个类别中吗?

  20. 20

    我们可以为一个zend \ form设置多个水化器吗?

  21. 21

    我们可以两次提交一个jsp表格吗?

  22. 22

    我们可以有一个空的基本路径吗?

  23. 23

    我们可以有一个不在类型上但在操作上的模板吗

  24. 24

    我们可以在NEXT JS中建立一个门户吗

  25. 25

    我们可以使用Ember.js建立一个静态网站吗?

  26. 26

    我们可以在WSO2ESB中设置一个数组吗?

  27. 27

    我们可以打补丁一个已经打补丁的字体吗?

  28. 28

    我们可以得到一个NODE的XPATH吗

  29. 29

    我们可以在类声明中声明一个类类型的指针吗?

热门标签

归档