Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.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#,对不起,我没有描述真正的问题。我决定编辑我的问题。 如何简化示例以省去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
。如果获得许可,则从class
A
调用
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
功能。