Обложка канала

.NET Разработчик

Опытный разработчик не так давно зашёл в .Net и поставил цель получить сертификат Microsoft. Свой ежедневный прогресс он описывает на канале .Net Разработчик. Заметки об изученном материале, советы по повышению производительности и поддержке мотивации, ин

.NET Разработчик

4 года назад
Открыть в
День 1270. #Оффтоп А вы знали, что C# допускает out-параметры в конструкторе? То есть вы можете написать что-то вроде:
class MyClass
{
  public MyClass(out bool succeeded)
  {
    // что-то делаем        
    succeeded = true;
  }
}

Живите теперь с этим… На Stackoverflow есть даже попытка объяснения: «В некоторых случаях может быть необходимо при неудаче в конструкторе передать информацию о том, какие части операции были успешными, а какие нет. Рассмотрим, например, объект, конструктор которого принимает дескриптор неуправляемого объекта и должен его инкапсулировать. Если конструктор выдаёт исключение, может быть обязательно, чтобы вызывающий объект освобождал неуправляемый объект, если этого не сделал конструктор, и в равной степени обязательно, чтобы вызывающий объект не освобождал объект, если это сделал конструктор. Наличие в конструкторе параметра out или ref может быть наименее опасным способом для класса сообщить вызывающему объекту, что нужно будет очистить, если конструктор завершится ошибкой. Хотя передавать конструктору параметры ref или out некрасиво, существуют некоторые типы, в которых попытки создать пригодный для использования экземпляр будут иметь побочные эффекты и могут завершиться неудачей после того, как некоторые из этих побочных эффектов уже произошли. Если невозможно создать допустимый объект, вот способы передать информацию вызывающей стороне: - сохранение в поле ThreadStatic, - инкапсуляция в выброшенном исключении, - сохранение или передача в параметр в виде объекта или делегата, - запись в параметр ref/out. Из них только параметр ref/out делает очевидным наличие информации, с которой клиентский код должен что-то делать. Существование параметров ref или out часто является признаком того, что конструктор должен быть помечен как protected, и что внешний код должен проходить через фабричные методы, которые гарантируют, что в случае возникновения исключения переданный объект будет использоваться соответствующим образом. Однако, чтобы класс мог разумно поддерживать наследование, он должен предлагать по крайней мере один конструктор, видимый вне его.» Источник: https://stackoverflow.com/questions/19633251/constructor-with-output-parameter