【问题标题】:Is there a difference between passing a function to a delegate by ref?通过 ref 将函数传递给委托有区别吗?
【发布时间】:2017-06-12 20:17:30
【问题描述】:

我遇到了这段使用委托并通过引用将函数传递给委托的 C# 代码...

        delegate bool MyDel(int x);
        static bool fun(int x) {
            return x < 0;
        }
        public static void Main() {
            var d1 = new MyDel(fun);       // what I usually write
            var d2 = new MyDel(ref fun);   
        }

编译器没有抱怨,并且很好地构建了项目。我在运行一些测试用例时没有发现任何区别,这种语法与通常的语法有什么区别吗?

更新

正如InBetween 所提到的,这个语法似乎也是有效的(而且它更没有意义)

var d3 = new MyDel(out fun);

【问题讨论】:

  • 我检查了生成的 IL 并没有发现任何差异。通常传递一个引用,将传递一个引用本身而不是一个指向该引用的指针的副本。
  • @yanyankelevich - 引用类型和引用是两个独立的概念
  • ReSharper 抱怨:无法分配给“有趣”,因为它是一个“方法组”
  • 这似乎更像是一个语言怪癖(错误)。 var d2 = new MyDel(ref fun); 没有多大意义,但var d2 = new MyDel(out fun); 的意义更小,而且也是允许的。
  • 这里的 C# 编译器有点过于宽松。它在其他方面与 C 和 C++ 语言中的行为相匹配,在这些语言中引用函数也是无操作的。您可以向 Roslyn 项目提交错误,但这个怪癖已经存在太久而且太天真了,无法产生太多修复它的灵感。如果您仍然想告诉他们,请点击New Issue button

标签: c# reference delegates ref


【解决方案1】:

看来,在这种情况下,通过 ref / out / normal-way 传递没有区别, 我试图查看 ILDASM 是否有任何区别,但没有区别...

 delegate void MyDel();
 static void Main(string[] args)
    {
        MyDel myDel = new MyDel(Mtd1);
        MyDel d3 = new MyDel(ref Mtd1);
        MyDel d1 = new MyDel(ref Mtd2);
        MyDel d2 = new MyDel(out Mtd3);
    }

【讨论】:

  • 我想这是真的,正如 Hans Passant 所提到的,编译器在这里似乎过于宽容
猜你喜欢
  • 1970-01-01
  • 2023-03-05
  • 2012-07-29
  • 1970-01-01
  • 2018-02-18
  • 2013-11-17
  • 1970-01-01
  • 2016-09-03
  • 2016-03-24
相关资源
最近更新 更多