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?