Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将委托本身作为参数传递_C# - Fatal编程技术网

C# 将委托本身作为参数传递

C# 将委托本身作为参数传递,c#,C#,在C语言中,是否可以将委托或事件传递给方法,以便该方法可以使用+=将新的事件处理程序分配给该委托(而不是方法可以调用委托) 我们可以把C++和C语言混合起来。这就是我想要的: public class MyClass { public Action* actionPtr; public void Assign(Action* action) { actionPtr = action; (*action) += SomeMethod;

在C语言中,是否可以将委托或事件传递给方法,以便该方法可以使用
+=
将新的事件处理程序分配给该委托(而不是方法可以调用委托)

我们可以把C++和C语言混合起来。这就是我想要的:

public class MyClass
{
    public Action* actionPtr;

    public void Assign(Action* action)
    {
        actionPtr = action;
        (*action) += SomeMethod;
    }

    public void Unassign()
    {
        (*action) -= SomeMethod;
    }

    void SomeMethod()
    {
        // Do stuff
    }
}

希望它有意义。

事件:否(除非您所在的班级定义了事件)。这是由C#编译器强制执行的

普通旧代表:。将其作为
ref
参数传递

(这样想:如何向委托添加处理程序?您使用
+=
,对吗?这是一个赋值运算符,它是静态的:您将委托分配给一个新的委托实例,其中包括
+=
右侧指定的方法,就像
x+=1
x
赋值给
x+1
。唯一可以从方法中将外部变量指定给新值或对象的时间是将其作为
ref
out
参数传递时

例如,以下代码保持
list
不变:

List<int> list = null;

InitializeListImproperly(list);

static void InitializeListImproperly(List<int> x)
{
    // x is a local variable, so this does nothing to the list variable
    // outside this scope!
    x = new List<int> { 1, 2, 3 };
}
List=null;
正确初始化(列表);
静态无效初始值设置正确(列表x)
{
//x是一个局部变量,因此这对列表变量没有任何影响
//在这个范围之外!
x=新列表{1,2,3};
}
以下内容将其分配给新的
列表

List=null;
正确初始化(参考列表);
静态无效初始化正确(参考列表x)
{
x=新列表{1,2,3};
}

这是同样的原则。

最好退一步,解释一下你在这里试图解决的问题。你的问题现在有点棘手。没关系,我想出来了。我只需要把它作为参考来传递。无论如何,谢谢。我想好了把委托作为
ref
传递的方法,但还有什么办法保持一个cop吗是的,这样我以后可以用
-=
取消分配它?@jsoldi:保留一份什么的副本?好吧,如果我用
+=
为委托分配一个新的事件处理程序,我需要在完成正确的操作后取消分配它?那么如果我不想用作为
ref
参数接收它的相同方法取消分配它,以后有没有办法取消分配它如果我保留一个指向委托的指针(不是指向委托调用的方法)。只需编辑我的问题。希望它更有意义。
List<int> list = null;

InitializeListProperly(ref list);

static void InitializeListProperly(ref List<int> x)
{
    x = new List<int> { 1, 2, 3 };
}