gpt4 book ai didi

c# - 将 System.Object 作为类型过滤器发出的一般 catch 子句在现实世界中有何影响?

转载 作者:可可西里 更新时间:2023-11-01 08:48:55 26 4
gpt4 key购买 nike

我记得有一次听说抛出 System.Exception(或扩展它的对象)以外的某种类型的对象在技术上是合法的 CIL,尽管 C# 没有支持它的功能。所以我有兴趣看到以下 C# 代码:

try {
throw new Exception();
} catch(Exception x) {
try {
throw;
} catch {
Console.Write("yes");
}
}

编译为以下 CIL:

  .try
{
IL_0000: newobj instance void [mscorlib]System.Exception::.ctor()
IL_0005: throw
} // end .try
catch [mscorlib]System.Exception
{
IL_0006: pop
.try
{
IL_0007: rethrow
} // end .try
catch [mscorlib]System.Object
{
IL_0009: pop
IL_000a: ldstr "yes"
IL_000f: call void [mscorlib]System.Console::Write(string)
IL_0014: leave.s IL_0016
} // end handler
IL_0016: leave.s IL_0018
} // end handler

我们看到嵌套的通用 catch 子句编译为:

catch [mscorlib]System.Object 

在 C# 中,将 System.Object 作为类型过滤器而不是 System.Exception 的一般 catch 子句是否有任何现实意义?

最佳答案

.NET-2.0 之前有区别。我在 .NET 1.1 时代读到过它。

It is explained here (I won't copy it) .请注意,第一个答案是错误的,第二个是正确的。

至于它是否实用:不。我想这对于晦涩的互操作场景很重要。

关于c# - 将 System.Object 作为类型过滤器发出的一般 catch 子句在现实世界中有何影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14100102/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com