IntPtr
тип значения, таким образом, в отличие от этого String.Empty
существует относительно мало преимущества в наличии статического свойства IntPtr.Zero
, Как только Вы передаете IntPtr.Zero
куда угодно, Вы получите копию, таким образом, для переменной инициализации это не будет иметь никакого значения:
IntPtr myPtr = new IntPtr(0);
IntPtr myPtr2 = IntPtr.Zero;
//using myPtr or myPtr2 makes no difference
//you can pass myPtr2 by ref, it's now a copy
существует одно исключение, и это - сравнение:
if( myPtr != new IntPtr(0) ) {
//new pointer initialised to check
}
if( myPtr != IntPtr.Zero ) {
//no new pointer needed
}
, Поскольку в нескольких плакатах было уже сказано.
Они функционально эквивалентны, таким образом, это не должно вызывать проблемы.
IntPtr.Zero
представляет состояние по умолчанию структуры (это объявляется, но никакой конструктор не используется), таким образом, значение по умолчанию эти intptr (void*)
было бы null
. Однако как (void*)null
и (void*)0
эквивалентны, IntPtr.Zero == new IntPtr(0)
Редактирование: , В то время как они эквивалентны, я действительно рекомендую использовать IntPtr.Zero
для сравнений, так как просто легче читать.
Использование IntPtr.Zero
позволит Вам избегать нового экземпляра IntPtr
.
от msdn:
Использование это поле, чтобы эффективно определить, был ли экземпляр IntPtr установлен на значение кроме нуля
Что происходит, если Вы передаете IntPtr.Zero
касательно, и получатель пытается изменить ссылку? С того момента дальше, был бы IntPtr.Zero != new IntPtr(0)
, или получатель получит некоторое исключение после попытки внести изменение?
я не уверен в этом, но это походит на разумное объяснение.
Это - главным образом инкапсуляция вопроса (и производительности, но до большой меньшей степени). В некоторый момент в будущей Microsoft может решить (хотя это очень маловероятно), которому unitialized значение указателя будет с этого времени равняться 0xDEADBEEF
, таким образом представляя весь new IntPtr(0)
недопустимый код.
Насколько производительность затронута, MSDN заявляет это:
, Например, предположите, что переменная,
ip
, является экземпляромIntPtr
. Можно определить, было ли это установлено путем сравнения его со значением, возвращенным конструктором, например: "если IP! = новый IntPtr (0)...". Однако вызов конструктора для получения неинициализированного указателя неэффективен. Лучше кодировать или "if ip != IntPtr.Zero...
", или "if !IntPtr.Zero.Equals(ip)...
".