![](/img/trans.png)
[英]CreateCompatibleDC(IntPtr.Zero) returns IntPtr.Zero
[英]new IntPtr(0) vs. IntPtr.Zero
這兩個陳述之間有什么區別:
IntPtr myPtr = new IntPtr(0);
IntPtr myPtr2 = IntPtr.Zero;
我已經看到許多使用PInvoke的示例,如果myPtr參數由ref發送到被調用函數,則它更喜歡第一種語法。 如果我在我的應用程序中用IntPtr.Zero替換所有新的IntPtr(0),它會造成任何損害嗎?
IntPtr
是一個值類型,因此與String.Empty
不同,擁有靜態屬性IntPtr.Zero
好處相對較少。
一旦你將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
。 但是,as (void*)null
和(void*)0
是等價的, IntPtr.Zero == new IntPtr(0)
編輯:雖然它們是等價的,但我建議使用IntPtr.Zero
進行比較,因為它更容易閱讀。
如果您通過ref傳遞IntPtr.Zero
,並且收件人嘗試修改引用會發生什么? 從那一刻開始, IntPtr.Zero != new IntPtr(0)
,還是收件人在嘗試進行更改時會收到某種異常?
我不確定這一點,但這似乎是一個合理的解釋。
JITter可以像內聯IntPtr.Size一樣內聯IntPtr.Zero。
這主要是一個問題封裝(和性能,但在很小程度上)。 在未來的某個時刻,微軟可能決定(盡管不太可能)從現在開始,單位化指針值將等於0xDEADBEEF
,從而使所有new IntPtr(0)
代碼無效。
就性能而言,MSDN說:
例如,假設變量
ip
是IntPtr
一個實例。 您可以通過將其與構造函數返回的值進行比較來確定它是否已設置,例如:“if ip!= new IntPtr(0)...”。 但是,調用構造函數來獲取未初始化的指針效率很低。 最好編寫“if ip != IntPtr.Zero...
”或“if !IntPtr.Zero.Equals(ip)...
”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.