Во-первых, вы уже написали код в обе стороны .Если вы хотите узнать, какой путь имеет лучшую производительность , запустите обе программы и определите, какая из них имеет лучшую производительность .Это только способ точно ответить на вопрос о производительности, поэтому возьмите свой секундомер.
Если вы не можете измерить, какая из них имеет лучшую производительность, то, очевидно, не имеет значения, какая из них имеетлучшая производительность, потому что разница не может быть обнаружена.Невидимая разница не имеет значения.
Теперь давайте рассмотрим вашу конкретную проблему.Предположим, вы решили сохранить выделение памяти в общем случае успеха. Правильное решение - не придавать специальному значению ноль .Правильное решение - использовать шаблон нулевого объекта.То есть создает специальный экземпляр объекта, который всегда используется там, где в противном случае вы бы использовали null .
class ManagedError
{
public static readonly Success = new ManagedError(IntPtr.Zero);
private ManagedError(IntPtr hr) { ... }
public ManagedError FromNative(IntPtr hr)
{
if (hr == IntPtr.Zero) return Success;
return new ManagedError(hr);
}
}
...
IntPtr native = GetNativeError(/* parameters here */);
return ManagedError.FromNative(native);
Готово.Вы всегда получаете действительный объект, и вы не делаете никаких распределений в общем случае.
Кроме того, как упоминалось в другом ответе: почему это не структура? Почему вы вообще выделяете кучу памяти ссылочного типа ?Если это просто оболочка для intptr, то это должна быть структура;передать его будет так же дешево, как и intptr!
Если вы сделаете его структурой, это станет еще проще, потому что вы просто используете экземпляр структуры по умолчанию в качестве нулевого объекта!
struct ManagedError
{
public static readonly Success = default(ManagedError);
private readonly IntPtr hr;
public ManagedError(IntPtr hr) { this.hr = hr }
}
И все готово;нет выделения кучи вообще.Вы просто заверните инттр.