在MSDN上,我发现以下内容:
public event EventHandler<MyEventArgs> SampleEvent;
public void DemoEvent(string val)
{
// Copy to a temporary variable to be thread-safe.
EventHandler<MyEventArgs> temp = SampleEvent;
Run Code Online (Sandbox Code Playgroud)
它是参考吗?
如果是这样,我不理解其含义,因为当SampleEvent变为null时,temp也是如此
if (temp != null)
temp(this, new MyEventArgs(val));
}
Run Code Online (Sandbox Code Playgroud) 我不确定我是不是疯狂地违反了OOP.
假设有一个Car" 有 "a Engine和a的类Tank.
当Engine它运行时,它会从油中取出油Tank(比如说每单位循环一个单位,虽然油是不可数的)
如何Engine从油中获取油Tank?(当两者都是Car?的领域?)
实际上Engine应该持续"供应"石油而不是"获得"石油.
应该"OilCirculatingSystem"从哪里获得石油Tank
和供应Engine.
如何在课程中对此系统进行建模?
有合适的设计模式吗?
***编辑:简单地说,如何有一个从"油流" Tank来Engine?(是不是Oil有责任从流量Tank到Engine一个阀门打开时?
我在Stack Overflow上看到了一些关于委托,事件和这两个特性的.NET实现的非常好的问题.特别是一个问题," C#Events如何在幕后工作? ",产生了一个很好的答案,很好地解释了一些微妙的观点.
上述问题的答案提出了这一点:
当您声明类似字段的事件时......编译器会生成方法和私有字段(与委托类型相同).在类中,当您引用ElementAddedEvent时,您指的是该字段.在课外,你指的是这个领域
从同一问题("类字段事件 ")链接的MSDN文章添加:
引发事件的概念恰好等同于调用事件所代表的委托 - 因此,没有用于引发事件的特殊语言结构.
为了进一步检查,我构建了一个测试项目,以便查看IL被编译为一个事件和一个委托:
public class TestClass
{
public EventHandler handler;
public event EventHandler FooEvent;
public TestClass()
{ }
}
Run Code Online (Sandbox Code Playgroud)
我希望委托字段handler和事件FooEvent编译成大致相同的IL代码,并使用一些其他方法来封装对编译器生成的FooEvent字段的访问.但是IL产生的不是我预期的:
.class public auto ansi beforefieldinit TestClass
extends [mscorlib]System.Object
{
.event [mscorlib]System.EventHandler FooEvent
{
.addon instance void TestClass::add_FooEvent(class [mscorlib]System.EventHandler)
.removeon instance void TestClass::remove_FooEvent(class [mscorlib]System.EventHandler)
}
.method public hidebysig specialname rtspecialname instance void .ctor() cil managed
{
// Constructor IL hidden
}
.field private class [mscorlib]System.EventHandler …Run Code Online (Sandbox Code Playgroud) 刚读完Jon Skeet 关于事件和代表的文章并得到了一个问题.
让我们首先在代码中声明一个事件
public event EventHandler MyEvent
Run Code Online (Sandbox Code Playgroud)
然后我想以某种方式在代码中提出它
if (MyEvent != null)
Myevent(this,EvtArgs.Empty);
Run Code Online (Sandbox Code Playgroud)
Jon说,实际上MyEvent看起来像这样:
private EventHandler _myEvent;
public event EventHandler MyEvent
{
add
{
lock (this)
{
_myEvent += value;
}
}
remove
{
lock (this)
{
_myEvent -= value;
}
}
}
Run Code Online (Sandbox Code Playgroud)
问题是我比较时会发生什么MyEvent != null?正如我其实明白它比较_myEvent到null,但我不知道.
我不明白C#中的事件参数是做什么的.假设我们有一个名为CoffeeButton的按钮,点击它会将您带到另一个名为Coffee的页面,使用名为myFrame的Frame.这是我的代码:
private void CoffeButton_Click(object sender, RoutedEventArgs e)
{
MyFrame.Navigate(typeof(Coffee));
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下做什么object sender和RoutedEventArgs e做什么?
例子很棒!