[解決済み】try { return x; } finally { x = null; }文の中で実際に何が起こっているのか?
2022-04-17 17:26:12
質問
他の質問でこのヒントを見たのですが、一体どのように機能するのか、どなたか教えていただけませんか?
try { return x; } finally { x = null; }
つまり
finally
節は、本当に
後
は
return
ステートメントを使用しますか?このコードはどの程度スレッドセーフでないのか?このコードに対して、何か追加でできることはありますか?
try-finally
ハックすることができますか?
どのように解決するのですか?
いいえ、ILレベルでは、例外処理されたブロックの中から戻ることはできません。基本的には変数に格納し、その後にリターンすることになります
すなわち、似ている。
int tmp;
try {
tmp = ...
} finally {
...
}
return tmp;
を例にとると(reflectorを使用)。
static int Test() {
try {
return SomeNumber();
} finally {
Foo();
}
}
にコンパイルします。
.method private hidebysig static int32 Test() cil managed
{
.maxstack 1
.locals init (
[0] int32 CS$1$0000)
L_0000: call int32 Program::SomeNumber()
L_0005: stloc.0
L_0006: leave.s L_000e
L_0008: call void Program::Foo()
L_000d: endfinally
L_000e: ldloc.0
L_000f: ret
.try L_0000 to L_0008 finally handler L_0008 to L_000e
}
これは基本的に、ローカル変数(
CS$1$0000
そして、ブロックを抜けた後、その変数をロードし、それを返します。Reflectorはこれを次のようにレンダリングします。
private static int Test()
{
int CS$1$0000;
try
{
CS$1$0000 = SomeNumber();
}
finally
{
Foo();
}
return CS$1$0000;
}
関連
-
[解決済み] lockステートメントは、ボンネットの中で何をするのでしょうか?
-
[解決済み] C#でジェネリックメソッドからNULLを返すにはどうしたらいいですか?
-
[解決済み] Nullable<T>.HasValueとNullable<T> != nullの違いは何ですか?
-
[解決済み] x is null」と「x == null」の違いは何ですか?
-
[解決済み】.NETにゾンビは存在するのか......?
-
[解決済み】HttpClientとHttpClientHandlerはリクエストの間にディスポされなければならないのでしょうか?
-
[解決済み】finallyブロックが例外をスローした場合はどうなりますか?
-
[解決済み】Tryブロックの中で値を返すとFinally文のコードは発火しますか?
-
[解決済み】空のtryブロックでtry {} finally {}を使用するのはなぜですか?
-
[解決済み】try {...} finally {...} は良くて、try {...} catch{} はダメなのはなぜ?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】コンパイルエラー「未割り当てのローカル変数を使用しています」が発生したのはなぜですか?
-
[解決済み】Unity3DでOnTriggerEnterが動作しない件
-
[解決済み] [Solved] アセンブリ System.Web.Extensions dll はどこにありますか?
-
[解決済み】Entity FrameworkからのSqlException - セッション内で他のスレッドが動作しているため、新しいトランザクションは許可されません。
-
[解決済み】5.7.57 SMTP - MAIL FROMエラー時に匿名メールを送信するためにクライアントが認証されない
-
[解決済み】2つ(またはそれ以上)のリストを1つに統合する(C# .NETで
-
[解決済み】aspNetCore 2.2.0 - AspNetCoreModuleV2 エラー
-
[解決済み】URLから画像をダウンロードする方法
-
[解決済み】インデックスが範囲外でした。コレクションパラメータname:indexのサイズより小さく、非負でなければなりません。
-
[解決済み] try catch finally ブロックの中から戻るのはバッドプラクティスですか?