什么是罗斯林的活动“加注”访问者?

时间:2015-01-20 15:14:15

标签: c# .net events roslyn

Roslyn的IEventSymbol可以方便地访问事件声明的所有相关部分。虽然AddMethodRemoveMethod很容易理解,但我不确定RaiseMethod应该是什么。文档也有点解析。

C#规范仅提及添加和删除事件的访问者。这可能是其他CLR语言允许指定的内容吗?

1 个答案:

答案 0 :(得分:4)

我在Roslyn来源中找到了this

internal abstract partial class EventSymbol : Symbol, IEventSymbol
{
    ...

    IMethodSymbol IEventSymbol.RaiseMethod
    {
        get
        {
            // C# doesn't have raise methods for events.
            return null;
        }
    }

    ...
}

看起来它实际上适用于Visual Basic

  

事件就像是宣布发生重要事件的消息。广播该消息的行为称为提升该事件。在Visual Basic中,使用RaiseEvent语句引发事件,如以下示例所示:

     

RaiseEvent AnEvent(EventNumber)

     

必须在声明它们的类,模块或结构的范围内引发事件。例如,派生类不能引发从基类继承的事件。

查看Roslyn source for VB,有一个很多对该RaiseMethod属性的更多引用。

VB规范在第9.4.1节自定义事件中明确提到RaiseEvent访问者:

  

自定义事件的声明方式与指定事件的事件相同   声明委托类型,但关键字Custom除外   必须位于Event关键字之前。自定义事件声明包含   三个声明:AddHandler声明,RemoveHandler   声明RaiseEvent声明。没有一个声明可以   有任何修饰符,虽然它们可以有属性。例如:

     
Class Test
    Private Handlers As EventHandler

    Public Custom Event TestEvent As EventHandler
        AddHandler(value As EventHandler)
            Handlers = CType([Delegate].Combine(Handlers, value), _
                EventHandler)
        End AddHandler

        RemoveHandler(value as EventHandler)
            Handlers = CType([Delegate].Remove(Handlers, value), _
                EventHandler)
        End RemoveHandler

        RaiseEvent(sender As Object, e As EventArgs)
            Dim TempHandlers As EventHandler = Handlers

            If TempHandlers IsNot Nothing Then
                TempHandlers(sender, e)
            End If
        End RaiseEvent
    End Event
End Class