相关疑难解决方法(0)

分配给Delegate的通用方法

我对代表和通用方法感到有些困惑.

是否可以将委托分配给具有泛型类型参数的方法?

IE:

//This doesn't allow me to pass a generic parameter with the delegate.
public delegate void GenericDelegate<T>() 

someDelegate = GenericMethod;
public void GenericMethod<T>() where T : ISomeClass
{

}
Run Code Online (Sandbox Code Playgroud)

我正在尝试将此委托传递给函数,该函数具有该方法所期望的接口的泛型类型,具有如下函数:

void CheckDelegate(GenericDelegate<ISomeClass> mechanism);
Run Code Online (Sandbox Code Playgroud)

所以我可以像这样使用委托:

someDelegate<ImplementsSomeClass>();
Run Code Online (Sandbox Code Playgroud)

c# generics delegates types interface

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

C#代表,参考解析时间

我有一个关于.net委托的简单问题.说我有这样的事情:

    public void Invoke(Action<T> action)
    {
        Invoke(() => action(this.Value));
    }

    public void Invoke(Action action)
    {
        m_TaskQueue.Enqueue(action);
    }
Run Code Online (Sandbox Code Playgroud)

第一个函数包含对引用的引用this.Value.在运行时,当第一个带有泛型参数的方法被调用时,它会this.Value以某种方式提供给第二个,但是如何?我想到了这些:

  • 按值调用(struct) - this.Value传递的当前值,因此如果在m_TaskQueue5分钟后执行它,则该值将不会处于其最近状态,它将是第一次引用时的值.
  • 通过引用调用(引用类型) - 然后Value在执行操作期间将引用最新状态,但如果this.Value在执行操作之前我更改为另一个引用,它仍将指向旧引用
  • 按名称调用(两者) - this.Value调用操作时将在何处进行评估.我相信实际的实现将持有一个引用,this然后Value在实际执行委托期间对其进行评估,因为没有按名称调用.

我认为这将是名称样式的调用,但无法找到任何文档,所以想知道它是否是一个明确定义的行为.这个类类似于Scala或Erlang中的Actor,所以我需要它是线程安全的.我不希望Invoke函数Value立即取消引用,这将在this对象的安全线程中完成m_TaskQueue.

.net c# multithreading delegates naming-conventions

7
推荐指数
2
解决办法
3230
查看次数

事件处理程序提升方法约定

我只是在浏览并遇到了这个问题:

行动与委托事件

来自nobug的答案包括以下代码:

protected virtual void OnLeave(EmployeeEventArgs e) {
  var handler = Leave;
  if (handler != null)
    handler(this, e);
}
Run Code Online (Sandbox Code Playgroud)

使用"创建提升方法"快速修复时,Resharper也会生成类似的代码.

我的问题是,为什么这条线是必要的?:

var handler = Leave;
Run Code Online (Sandbox Code Playgroud)

为什么写这个更好?:

protected virtual void OnLeave(EmployeeEventArgs e) {
  if (Leave != null)
    Leave(this, e);
}
Run Code Online (Sandbox Code Playgroud)

c# delegates coding-style

6
推荐指数
2
解决办法
969
查看次数