【发布时间】:2020-02-17 19:37:34
【问题描述】:
在这种情况下,为什么 C# 编译器不创建缓存 Action(SomeMethod) 的委托实例的代码:
void MyMethod() {
Decorator(SomeMethod);
}
void Decorator(Action a) { a(); }
void SomeMethod() { }
仅当SomeMethod 为静态时才会这样做:
static void SomeMethod() { }
编辑:
为清楚起见,我们采用以下代码:
class A {
public void M1() {
var b = new B();
b.Decorate(M2);
}
public void M2() {
}
}
class B {
public void Decorate(Action a) {
Console.WriteLine("Calling");
a();
}
}
如果你想避免每次调用 M1 时分配委托,你可以很容易地做到,但它很丑:
using System;
class A {
Action _m2;
public A() {
_m2 = new Action(M2);
}
public void M1() {
var b = new B();
b.Decorate(_m2);
}
public void M2() {
}
}
class B {
public void Decorate(Action a) {
Console.WriteLine("Calling");
a();
}
}
所以我的问题是,编译器无法生成类似代码的原因是什么?我看不到任何副作用。
我并不是说没有理由,从事编译器工作的人可能比我永远聪明得多。我只是想了解哪些情况下这不起作用。
【问题讨论】:
-
你做了哪些测试?
-
@Çöđěxěŕ 你可以用任何反编译器看看