はい、それらの方法はほとんど(*)同じです。唯一の違いは、最初のブレークポイントにブレークポイントを設定するのが簡単なことです。私が本当にそこにそしてそこにだけ壊す必要がない限り、私はいつも2番目に行きます(すぐにそのタイプの例外がスローされたのとは対照的に、それは簡単でしょう)。最初のフォームを使用したことがある場合でも、コードをコミットする前に2番目のフォームに戻します。
(*)JITがそれらを処理する方法に関しては、いくつかの違いがあるかもしれません。最初のものはより多くのILになり、インライン化などの機会に影響を与えます。
編集:私は少しのマイクロベンチマークに抵抗することはできません。try / catch / throwは、インライン化を無効にするだけでなく、パフォーマンスに厄介な影響を与えるようです。
using System;
using System.Diagnostics;
using System.Runtime.CompilerServices;
public class Test
{
const int Iterations = 1000000000;
static void Main()
{
Stopwatch sw;
sw = Stopwatch.StartNew();
for (int i=0; i < Iterations; i++)
{
SimpleMethod();
}
sw.Stop();
Console.WriteLine("Simple method: {0}", sw.ElapsedMilliseconds);
sw = Stopwatch.StartNew();
for (int i=0; i < Iterations; i++)
{
NoInlining();
}
sw.Stop();
Console.WriteLine("No inlining: {0}", sw.ElapsedMilliseconds);
sw = Stopwatch.StartNew();
for (int i=0; i < Iterations; i++)
{
TryCatchThrow();
}
sw.Stop();
Console.WriteLine("try/catch/throw: {0}", sw.ElapsedMilliseconds);
}
static void SimpleMethod()
{
Foo();
}
[MethodImpl(MethodImplOptions.NoInlining)]
static void NoInlining()
{
}
static void TryCatchThrow()
{
try
{
Foo();
}
catch (Exception)
{
throw;
}
}
static void Foo() {}
}
でコンパイル/o+ /debug-
結果(3回の実行):
簡単な方法: 504、495、489
インライン化なし:
2977、3060、3019試行/キャッチ/スロー:5274、4543、5145