让我们来看一个例子(请注意,成员为静态的原因纯粹是为了让它尽可能地简短并且可运行):
public class Program
{
private static readonly ReaderWriterLock Lock = new ReaderWriterLock();
public static void SafeRead(Action action)
{
Lock.AcquireReaderLock(1000);
try
{
action();
}
finally
{
Lock.ReleaseReaderLock();
}
}
public static void Main(string[] args)
{
SafeRead(() => Console.WriteLine(args));
}
}
在ILSpy中查看后,我发现一个名为“c__DisplayClass2_0”的内部类被创建用于lambda表达式。该类包含方法和对本地变量“args”的引用,存储在公共字段中,如下所示:
.class nested private auto ansi sealed beforefieldinit '<>c__DisplayClass2_0'
extends [mscorlib]System.Object
{
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
01 00 00 00
)
// Fields
.field public string[] args
// Methods
.method public hidebysig specialname rtspecialname
instance void .ctor () cil managed
{} // end of method '<>c__DisplayClass2_0'::.ctor
.method assembly hidebysig
instance void '<Main>b__0' () cil managed
{} // end of method '<>c__DisplayClass2_0'::'<Main>b__0'
} // end of class <>c__DisplayClass2_0
我知道在 args 局部变量和 Main 方法本身的生命周期之外使用 lambda 表达式时需要类和字段。但是如果我可以保证 lambda 在 Main 方法内同步调用,那么怎么办呢?也许只需在 Program 类中创建一个内部字段和方法即可,而不必再创建一个额外的类。我意识到这样会增加 Program 类的大小,但如果包含此类匿名委托的任何方法非常频繁地被调用,每个调用都会创建一个额外的类,如果我更注重性能而非内存消耗,则情况似乎更糟。在我的情况下,是否有一种方法可以指示编译器不创建内部类?或者我错过了什么重要的东西?
args
值,会发生什么? - Damien_The_Unbelieverforeach
,还是在大多数常见的使用场景中仍然使用它? - Damien_The_Unbeliever