C# 事件如何比代理更健壮

C# 事件如何比代理更健壮,c#,.net,C#,.net,考虑下面的例子 Stock类每次都会触发其PriceChanged事件 股票价格变化的时间: public delegate void PriceChangedHandler (decimal oldPrice,decimal newPrice); public class Stock { string symbol; decimal price; public Stock (string symbol) { this.symbol = symbol; } pub

考虑下面的例子

Stock
类每次都会触发其
PriceChanged
事件 股票价格变化的时间:

public delegate void PriceChangedHandler (decimal oldPrice,decimal newPrice);
public class Stock
{
    string symbol;
    decimal price;
    public Stock (string symbol) { this.symbol = symbol; }
    public event PriceChangedHandler PriceChanged;
    public decimal Price
    {
        get { return price; }
        set
        {
            if (price == value) return; // Exit if nothing has changed
            if (PriceChanged != null) // If invocation list not empty,
            PriceChanged (price, value); // fire event.
            price = value;
        }
    }
}
如果我们从示例中删除event关键字,使
PriceChanged
成为 普通委托字段,我们的示例将给出相同的结果。但是,
股票
会变得不那么健壮

我的问题是,event关键字以何种方式使股票更加稳健

我的问题是,event关键字以何种方式使股票更加稳健

这完全是一个课外客户可以做什么的问题。如果这只是一个公共领域,那么任何人都可以:

  • 调用所有现有的处理程序本身
  • 删除/替换所有现有处理程序
相反,通过使用事件,其他代码只能订阅或取消订阅该事件。我不会用“健壮”这个词来描述这种差异——这是一个封装的问题,并表示其他代码应该能够对
股票的实例做什么

有关更多信息,请参阅我的

我的问题是,event关键字以何种方式使股票更加稳健

这完全是一个课外客户可以做什么的问题。如果这只是一个公共领域,那么任何人都可以:

  • 调用所有现有的处理程序本身
  • 删除/替换所有现有处理程序
相反,通过使用事件,其他代码只能订阅或取消订阅该事件。我不会用“健壮”这个词来描述这种差异——这是一个封装的问题,并表示其他代码应该能够对
股票的实例做什么


有关更多信息,请参见my。

此外,它还更改了一对多/一对一的含义。若它是唯一的委托,那个么一次只能将其设置为一个函数,而事件可以“触发”多个函数functions@ilansch:不,那不是真的。代理是多播的。因此您可以使用
stock.PriceChanged=firstHandler+secondHandler我不知道订户如何自己调用所有现有的处理程序。你能举个例子说明吗?@GauravAhuja:通过阅读字段!他们只需调用
stock.PriceChanged(10m,20m)
Hi John,订阅者要自己调用所有现有的处理程序,他需要一个现有的委托实例(即stock类的对象)。我认为每个订阅者都会有自己的委托实例,不管我们是否使用event,另外它会改变一对多/一对一的含义。若它是唯一的委托,那个么一次只能将其设置为一个函数,而事件可以“触发”多个函数functions@ilansch:不,那不是真的。代理是多播的。因此您可以使用
stock.PriceChanged=firstHandler+secondHandler我不知道订户如何自己调用所有现有的处理程序。你能举个例子说明吗?@GauravAhuja:通过阅读字段!他们只需调用
stock.PriceChanged(10m,20m)
Hi John,订阅者要自己调用所有现有的处理程序,他需要一个现有的委托实例(即stock类的对象)。我认为每个订阅者都有自己的委托实例,不管我们是否使用event?