private static void Demo1() {
try {
Console.WriteLine("In try");
}
finally {
// Type1!ˉs static constructor is implicitly called in her
Type1.M();
}
}
private sealed class Type1 {
static Type1() {
// if this throws an exception, M won!ˉt get calle
Console.WriteLine("Type1's static ctor called");
}
public static void M() { }
}
When I run the code above, I get the following output:
In try
Type1's static ctor called
private static void Demo2() {
// Force the code in the finally to be eagerly prepared
RuntimeHelpers.PrepareConstrainedRegions(); // System.Runtime.CompilerServices namespace
try {
Console.WriteLine("In try");
}
finally {
// Type2!ˉs static constructor is implicitly called in her
Type2.M();
}
}
public class Type2 {
static Type2() {
Console.WriteLine("Type2's static ctor called");
}
// Use this attribute defined in the System.Runtime.ConstrainedExecution namespace
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
public static void M() { }
}
Now, when I run this version of the code, I get the following output:
Type2's static ctor called
In try
PrepareConstrainedRegions是一个特殊的方法,当编译器看到此方法在try模块前被调用,将优先执行try模块的catch和finally部分。