C# 双重参考代表
对不起,我没有描述真正的问题。我决定编辑我的问题。 如何简化示例以省去C# 双重参考代表,c#,C#,对不起,我没有描述真正的问题。我决定编辑我的问题。 如何简化示例以省去GetDelegate统计函数? 有许多类的C,对于特定事件E,需要执行操作Cd。但是在执行Cd的操作之前,您需要检查权限。权限检查的结果,我在类A的主流中得到,方法回调。根据检查结果,我已经决定是否启动操作Cd。 也就是说,对于事件E,在类C中,需要为类A中声明的代理设置Cd。如果获得许可,则从classA调用Cd。 在实际应用程序中,存在多线程 public delegate void D(); public de
GetDelegate
统计函数?
有许多类的C
,对于特定事件E
,需要执行操作Cd
。但是在执行Cd
的操作之前,您需要检查权限。权限检查的结果,我在类A
的主流中得到,方法回调。根据检查结果,我已经决定是否启动操作Cd
。
也就是说,对于事件E
,在类C
中,需要为类A
中声明的代理设置Cd
。如果获得许可,则从classA
调用Cd
。
在实际应用程序中,存在多线程
public delegate void D();
public delegate ref D GetD();
class A//This is Thread 1
{
static D d;
static void Main(string[] args)
{
C c1 = new C(GetDelegate, "NAME1");
C c2 = new C(GetDelegate, "NAME2");
Console.ReadLine();
}
static ref D GetDelegate()
{
return ref d;
}
void OnPermissionsResult(bool result)//This is a permission check callback method.
{
if (result)
{
d();
}
else
{
Console.WriteLine("You do not have permission.\r");
}
}
}
class C//This is Thread 2
{
string name;
GetD getd;
public C(GetD getd, string name)
{
this.name = name;
this.getd = getd;
}
void M()
{
//This is example of event 'E'
button.Click += () =>
{
getd() = () =>//This is Ation 'Cd'
{
Console.WriteLine($"Action: {name}\r");
};
CheckPermissions();//Begin check permission.
};
}
}
正如评论中提到的,这是一件奇怪的事情,因此听起来你好像在问一个“XY问题”。XY问题是“我提出了一个奇怪的问题解决方案,这个奇怪的解决方案并不完全正确,现在我要问一个没有多大意义的问题,因为它是关于我的奇怪解决方案,而不是关于我真正的问题”。问一个关于真正问题的问题 也就是说,如果我们想要表示“我可以读写另一个类的属性”,通常我们会做的不是使用ref返回委托,而是使用一个属性接口。我会编写您的代码——假设我编写它是为了解决您真正的问题——如下所示:
public delegate void D();
internal interface I
{
D D { get; set; }
}
class P : I
{
public D D { get; set; }
static void Main()
{
(new P()).M();
}
private void M()
{
C c1 = new C(this, "NAME1");
C c2 = new C(this, "NAME2");
c1.SetD();
this.D();
c2.SetD();
this.D();
}
}
class C
{
private I i;
private string name;
public C(I i, string name)
{
this.name = name;
this.i = i;
}
public void SetD()
{
this.i.D = () => { whatever };
}
}
无需与静态字段或ref返回委托混淆。这可能是XY问题。你想用这个来解决的根本问题是什么?也许还有另一种方法可以做得很好。你可以去掉delegate1,用Action替换它,但是你不能,AFAIK,去掉GetDelegate1,因为返回类型上有ref修饰符。我同意Sami;首先,这是一件奇怪的事情。你这么做大概是因为你有一些问题要解决,但问题是什么,还不清楚。如果你想改变一个类的属性,通常你不会传递变量的地址;通常,该类将实现一个带有属性的接口,您将传递对该接口的引用。使用静态属性执行此操作的事实更令人怀疑,这里发生了一些根本奇怪的事情。是否对不同的操作有不同的权限检查,或者它们都是相同的?如果它们可能不同,那么在多线程程序中就有一个更大的问题,因为最终可能会对一个控制另一个操作执行的操作进行权限检查,这显然是一个安全漏洞。在类
C
中,通过引用直接分配委托值d,无需求助于GetDelegate
功能。