相关疑难解决方法(0)

关于事件的价值/参考类型的问题

在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)

c# events event-handling

11
推荐指数
1
解决办法
1099
查看次数

OOP设计:汽车 - 油箱和发动机之间的连接

我不确定我是不是疯狂地违反了OOP.

假设有一个Car" "a Engine和a的类Tank.

Engine它运行时,它会从油中取出油Tank(比如说每单位循环一个单位,虽然油是不可数的)

如何Engine从油中获取油Tank?(当两者都是Car?的领域?)

实际上Engine应该持续"供应"石油而不是"获得"石油.
应该"OilCirculatingSystem"从哪里获得石油Tank
和供应Engine.
如何在课程中对此系统进行建模?
有合适的设计模式吗? 在此输入图像描述

***编辑:简单地说,如何有一个从"油流" TankEngine?(是不是Oil有责任从流量TankEngine一个阀门打开时?

oop design-patterns software-design car-analogy

7
推荐指数
1
解决办法
1369
查看次数

如果事件在.NET中作为委托实现,那么.event IL部分的重点是什么?

我在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)

.net c# events delegates cil

5
推荐指数
1
解决办法
2547
查看次数

C#事件的内部设计

刚读完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?正如我其实明白它比较_myEventnull,但我不知道.

c#

3
推荐指数
1
解决办法
198
查看次数

C#事件参数有什么作用?

我不明白C#中的事件参数是做什么的.假设我们有一个名为CoffeeButton的按钮,点击它会将您带到另一个名为Coffee的页面,使用名为myFrame的Frame.这是我的代码:

private void CoffeButton_Click(object sender, RoutedEventArgs e)
{
     MyFrame.Navigate(typeof(Coffee));
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下做什么object senderRoutedEventArgs e做什么?

例子很棒!

c# uwp-xaml

1
推荐指数
1
解决办法
83
查看次数