反編譯一個程式集后,它生成的代碼產生了很多類似的方法:
internal long m_position;
internal void PutString(long RecordNumber, string s)
{
if (s == null)
s = "";
int byteCount = this.m_Encoding.GetByteCount(s);
this.SetRecord(RecordNumber);
this.LengthCheck(byteCount);
if (byteCount != 0)
this.m_sw.Write(s);
// ISSUE: variable of a reference type
long& local;
// ISSUE: explicit reference operation
long num = checked (^(local = ref this.m_position) (long) byteCount);
local = num;
}
只是從那開始的代碼// ISSUE有問題。如您所見,它包含無效的語法long& local;。我找到了這個答案,它很好地解釋了這是什么。在閱讀了 C# ref locals 之后,我嘗試重構這個方法以便它可以編譯,但我沒有成功。這^(local = ref this.m_position)部分真的很適合我,因為我在按位運算方面不是很強大。
有人可以幫我重構最后三行并向我解釋它是如何作業的嗎?這種模式在反編譯的代碼中幾乎逐字出現了數百次,所以一旦我“理解”了這個例子,我應該對它的其余部分沒有任何問題。
uj5u.com熱心網友回復:
這是 dotPeek 失敗但 ILSpy 處理得很好的事情之一。您看到的是 =運算子的編譯器優化。而不是兩次計算欄位位置 - 一次獲取值并再次存盤它 - 編譯器生成計算欄位偏移量的代碼,然后將其用于操作的兩個部分。
您遇到問題的位(未知^運算子)很可能是 dotPeek 嘗試顯示 ref 變數的取消參考。當然,在 C# 中這不是必需的,我們只使用變數本身的名稱。
只需將其重寫為:
m_position = byteCount;
編譯器將決定是否要添加該特定優化。
uj5u.com熱心網友回復:
long&表示 long 的參考型別,應替換為ref long. 然后將m_position欄位的地址分配給local變數(local為其創建別名),然后在向其添加位元組數時檢查算術溢位。不完全確定插入符號,在托管 C 中,它是指導物件 GC 的帽子,所以我想這就是它正在做的事情。當算術檢查成功完成時,m_position通過localvar 的欄位設定為當前值 plus byteCount。
ref long local = ref this.m_position;
long num = checked(local (long)byteCount);
local = num;
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/419191.html
標籤:
上一篇:看起來建構式沒有
