новый IntPtr (0) по сравнению с IntPtr. Нуль

24
задан Yuval Peled 18 February 2009 в 08:26
поделиться

5 ответов

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
}

, Поскольку в нескольких плакатах было уже сказано.

24
ответ дан Keith 28 November 2019 в 23:52
поделиться

Они функционально эквивалентны, таким образом, это не должно вызывать проблемы.

IntPtr.Zero представляет состояние по умолчанию структуры (это объявляется, но никакой конструктор не используется), таким образом, значение по умолчанию эти intptr (void*) было бы null. Однако как (void*)null и (void*)0 эквивалентны, IntPtr.Zero == new IntPtr(0)

Редактирование: , В то время как они эквивалентны, я действительно рекомендую использовать IntPtr.Zero для сравнений, так как просто легче читать.

7
ответ дан pushkin 28 November 2019 в 23:52
поделиться

Использование IntPtr.Zero позволит Вам избегать нового экземпляра IntPtr.

от msdn:

Использование это поле, чтобы эффективно определить, был ли экземпляр IntPtr установлен на значение кроме нуля

5
ответ дан bruno conde 28 November 2019 в 23:52
поделиться

Что происходит, если Вы передаете IntPtr.Zero касательно, и получатель пытается изменить ссылку? С того момента дальше, был бы IntPtr.Zero != new IntPtr(0), или получатель получит некоторое исключение после попытки внести изменение?

я не уверен в этом, но это походит на разумное объяснение.

1
ответ дан Drew Noakes 28 November 2019 в 23:52
поделиться

Это - главным образом инкапсуляция вопроса (и производительности, но до большой меньшей степени). В некоторый момент в будущей Microsoft может решить (хотя это очень маловероятно), которому unitialized значение указателя будет с этого времени равняться 0xDEADBEEF, таким образом представляя весь new IntPtr(0) недопустимый код.

Насколько производительность затронута, MSDN заявляет это:

, Например, предположите, что переменная, ip, является экземпляром IntPtr. Можно определить, было ли это установлено путем сравнения его со значением, возвращенным конструктором, например: "если IP! = новый IntPtr (0)...". Однако вызов конструктора для получения неинициализированного указателя неэффективен. Лучше кодировать или " if ip != IntPtr.Zero... ", или " if !IntPtr.Zero.Equals(ip)... ".

-2
ответ дан Anton Gogolev 28 November 2019 в 23:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: