Какова цель invalidHandleValue в SafeHandle?

SafeHandle конструктор принимает invalidHandleValue, Для чего он используется, если вам нужно реализовать IsInvalid тем не мение потому что он понятия не имеет, какая переменная-член содержит указатель [Я не знал, что реализовал handle переменная-член для вас]?

2 ответа

Решение

Глядя на это в DotPeek, я вижу, что он используется только для инициализации protected IntPtr handle переменная-член.

protected SafeHandle(IntPtr invalidHandleValue, bool ownsHandle)
{
  this.handle = invalidHandleValue;
  ...
}

Я бы сказал, что логика для этого что-то вроде:

  • Они хотят гарантировать, что handle переменная-член инициализируется чем-то, поэтому они заставляют вас передавать недопустимое значение.
  • Там может быть дополнительная логика, которую вы хотите проверить в IsInvalid, поэтому они не удосужились предоставить реализацию по умолчанию (что потребовало бы сохранения переданного invalidHandleValue в ктор тоже.)

Это значение по умолчанию handle когда ты звонишь new SafeHandleDerivedClass() (производный класс может вызвать base.SetHandle(someValue) в конструкторе, но перед этим вызовом значение будет тем, что было передано в конструктор базового класса).

Другие вопросы по тегам