考虑一下我们有这段代码:
static void Main(string[] args)
{
try
{
throw new Exception("Exception");
}
catch
{
throw;
}
finally
{
Console.WriteLine("------finally-----");
}
}
Run Code Online (Sandbox Code Playgroud)
我们有未处理的异常和finally阻止.
werfault启用后,当我Cancel尝试"自动解决问题"时按下,最后执行块.
但是,如果我没有按下Cancel并在下一个窗口中单击Close The Program finally块不执行.
最后当我禁用werfault并点击Close Program finally块执行时.
我没有在c#规范中找到描述这种情况的任何文档.我也发现了这个MSDN:
在未处理的错误之后执行finally块取决于如何触发异常展开操作.
但没有解释,任何人都可以描述为什么会这样?
更新1:我已在.Net Framework 4.5.1和4.5.2中测试过它.
这是一个代码示例:
public List(int capacity = defaultCapacity) {
items = new T[capacity];
}
Run Code Online (Sandbox Code Playgroud)
在C# 5 Language Specification Section 1.6.7写中:
实例构造函数可以重载.例如,List类声明了两个实例构造函数,一个没有参数,另一个接受int参数.
但IL为此代码编译不包含2个构造函数.它只包含此声明:
.method public hidebysig specialname rtspecialname
instance void .ctor([opt] int32 capacity) cil managed
Run Code Online (Sandbox Code Playgroud)
这意味着可选参数是CLRlevel并由其定义[opt].
后CLR没有运行时,可以表示与2个重载构造该对象.
例如,如果我创建2个单独的构造函数而没有可选参数,则编译IL将包含2 .ctor-s.
我想澄清一下,如果语言规范说这class declares two instance constructors并不意味着编译IL也会包含2- ctors.
我有类A,其存储REF到对象B中BObject的变量.
public class A
{
public B BObject;
}
Run Code Online (Sandbox Code Playgroud)
我想BObject在B类构造函数中获取(变量名称).
有没有办法做到这一点?
这样做的目的:我想创建ODBCFramework,我想根据变量名称获取表名.(就像在EntityFramework上下文中一样)
更新:我想在C#5中处理它.