【问题标题】:What does this declaration in C# .net mean?C# .net 中的这个声明是什么意思?
【发布时间】:2011-08-18 14:09:07
【问题描述】:

我在 .NET 中有以下声明。我想知道这个声明到底是什么意思(第二行),尤其是DoConsoleCancelEvent

delegate void InternalCancelHandler;

static readonly InternalCancelHandler cancel_handler = 
    new InternalCancelHandler (DoConsoleCancelEvent);

DoConsoleCancelEvent 声明为:

internal static void DoConsoleCancelEvent{...}

.NET 中使用的术语是什么?是.NET 反射吗?

【问题讨论】:

    标签: c# .net compiler-construction mono


    【解决方案1】:

    InternalCancelHandlerdelegate,这是 C# 保存对特定方法的引用的方式。第一行将委托定义为引用具有void 返回的方法,并且不接受任何参数(因为没有参数列表。)此定义:

    delegate int InternalCancelHandler(bool boolParam);
    

    定义一个委托,该委托将引用一个返回 int 并接受单个 bool 参数的方法。

    下一行是该委托类型的静态只读字段的声明,它被初始化为引用DoConsoleCancelEvent 方法的新实例。

    通过该声明,您现在可以通过调用委托来调用DoConsoleCancelEvent

    public static void CallDelegate()
    {
        // This line will actually call DoConsoleCancelEvent
        MyType.cancel_handler();
    }
    

    请注意,委托类型末尾的 Handler 表明它是一个事件处理程序,这意味着您更有可能希望使用它来订阅事件:

    public static void EventSub()
    {
        // This line makes it so that cancel_handler is called when
        // SomeEvent is fired.  Since cancel_handler actually refers
        // to DoConsoleCancelEvent, it is *that* method that will 
        // actually be run
        SomeType.SomeEvent += cancel_handler;
    }
    

    static 表示该字段与Type 相关联,而不是Type 的特定实例

    readonly 表示该字段只能在 Type 的构造过程中分配

    【讨论】:

    • 嗯,它可能是一个委托......它也可能是一个类,其构造函数接受委托
    • 感谢您的回答,我刚刚对问题进行了更详细的编辑以避免误解。
    • 这么好的答案。很详细。
    【解决方案2】:

    我相信您正在寻找的术语是Delegate

    在这种情况下,InternalCancelHandler 是代表。第一行代码创建一个指向您的DoConsoleCancelEvent 方法的委托。然后,委托将用于在稍后的时间点调用您的方法。

    【讨论】:

      【解决方案3】:

      InternalCancelHandler 是一个delegate

      根据Mono commit,这就是DoConsoleCancelEvent 所说的:

      为 Windows 添加对 Win32 函数 SetConsoleCtrlHandler 的调用, 它添加了 DoWindowsConsoleCancelEvent 包装器 DoConsoleCancelEvent 到 Ctrl-C 处理程序时,事件处理程序 添加,并在删除所有事件处理程序后删除处理程序。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-09-20
        • 2022-12-05
        • 1970-01-01
        • 1970-01-01
        • 2022-07-20
        • 1970-01-01
        相关资源
        最近更新 更多