簡體   English   中英

新的IntPtr(0)與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進行比較,因為它更容易閱讀。

IntPtr.Zero的使用將允許您避免使用IntPtr的新實例。

來自msdn

使用此字段可以有效地確定IntPtr的實例是否已設置為零以外的值

如果您通過ref傳遞IntPtr.Zero ,並且收件人嘗試修改引用會發生什么? 從那一刻開始, IntPtr.Zero != new IntPtr(0) ,還是收件人在嘗試進行更改時會收到某種異常?

我不確定這一點,但這似乎是一個合理的解釋。

JITter可以像內聯IntPtr.Size一樣內聯IntPtr.Zero。

這主要是一個問題封裝(和性能,但在很小程度上)。 在未來的某個時刻,微軟可能決定(盡管不太可能)從現在開始,單位化指針值將等於0xDEADBEEF ,從而使所有new IntPtr(0)代碼無效。

就性能而言,MSDN說:

例如,假設變量ipIntPtr一個實例。 您可以通過將其與構造函數返回的值進行比較來確定它是否已設置,例如:“if ip!= new IntPtr(0)...”。 但是,調用構造函數來獲取未初始化的指針效率很低。 最好編寫“ if ip != IntPtr.Zero... ”或“ if !IntPtr.Zero.Equals(ip)... ”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM