Да, эти методы в значительной степени (*) одинаковы. Разница лишь в том, что в первом легко поставить точку останова. Я всегда соглашался со вторым, если только мне действительно не нужно было прорваться туда и только туда (в отличие от немедленного исключения любых исключений этого типа, что было бы легко). Даже если бы я использовал первое, я бы вернул его во вторую форму, прежде чем фиксировать код.
(*) Могут быть некоторые различия в том, как 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-
Результаты (три запуска):
Простой метод: 504, 495, 489
Нет вставки: 2977, 3060, 3019
попробуй / поймай / брось: 5274, 4543, 5145