[英]How to refactor this decompiled C# code with invalid reference syntax?
反編譯一個程序集后,它生成的代碼產生了很多類似的方法:
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)
部分真的很適合我,因為我在按位運算方面不是很強大。
有人可以幫我重構最后三行並向我解釋它是如何工作的嗎? 這種模式在反編譯的代碼中幾乎逐字出現數百次,所以一旦我“理解”這個例子,我應該對它的 rest 沒有問題。
這是 dotPeek 失敗但 ILSpy 處理得很好的事情之一。 您看到的是+=
運算符的編譯器優化。 而不是計算字段位置兩次 - 一次獲取值並再次存儲它 - 編譯器生成計算字段偏移量的代碼,然后將其用於操作的兩個部分。
您遇到問題的位(未知的^
運算符)很可能是 dotPeek 嘗試顯示 ref 變量的取消引用。 當然,在 C# 中這不是必需的,我們只使用變量本身的名稱。
只需將其重寫為:
m_position += byteCount;
編譯器將決定是否要添加該特定優化。
long&
表示 long 的引用類型,應替換為ref long
。 然后將m_position
字段的地址分配給local
變量(使local
成為它的別名),然后在向其添加字節數時檢查算術溢出。 不完全確定插入符號,在托管 C++ 中,它是指導 object GC 的帽子,所以我想這就是它在做什么。 當算術檢查成功完成時,通過local
var 將m_position
字段設置為當前值加上byteCount
。
ref long local = ref this.m_position;
long num = checked(local + (long)byteCount);
local = num;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.