Sí, esos métodos son prácticamente iguales (*). La única diferencia es que es fácil poner un punto de quiebre en el primero. Siempre iba con el segundo, a menos que realmente tuviera que romper allí y solo allí (en lugar de lanzar inmediatamente cualquier excepción de ese tipo, lo que sería fácil). Incluso si alguna vez utilicé el primero, lo volvería a poner en el segundo formulario antes de confirmar el código.
(*) Es posible que existan algunas diferencias en cuanto a la forma en que el JIT las maneja. El primero terminará con más IL, lo que afectará las oportunidades de alineación, etc.
EDITAR: No me puedo resistir a un poco de micro-benchmarking. Parece que try/catch/tiro tiene efectos más desagradables en el rendimiento que acaba de desactivación de procesos en línea:
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() {}
}
compilar con /o+ /debug-
resultados (tres carreras):
método simple: 504, 495, 489
n procesos en línea: 2977, 3060, 3019
try/catch/tirar: 5274, 4543, 5145
A menos que necesite el bloque finally para hacer algún trabajo de limpieza. –
@Fred: Eso sería 'try..finally' luego no' try..catch', ¿verdad? – AnthonyWJones