簡體   English   中英

屬性/方法內聯和對反射的影響

[英]Property / Method inlining and impact on Reflection

Valentin Kuzub 評論了我對 SO 問題之一的回答,他認為 JIT 編譯器內聯屬性將導致反射停止工作。

案例如下:

class Foo
{
    public string Bar { get; set; }

    public void Fuzz<T>(Expression<Func<T>> lambda)
    {
    }
}

Fuzz(x => x.Bar);

Fuzz function 接受 lambda 表達式並使用反射來查找屬性。 這是 MVC 在HtmlHelper擴展中的常見做法。

我認為即使Bar屬性被內聯,反射也不會停止工作,因為它是對Bar的調用,它將被內聯並且typeof(Foo).GetProperty("Bar")仍將返回有效的PropertyInfo

您能否確認一下,或者我對方法內聯的理解是錯誤的?

JIT 編譯器在運行時運行,它不能重寫存儲在程序集中的元數據信息。 反射讀取程序集以訪問此元數據。 所以 JIT 編譯器對反射沒有影響。

編輯:實際上有幾個地方 C# 編譯器本身在編譯期間“內聯”了一些信息。 例如,常量、枚舉和默認 arguments 是“內聯”的,因此您無法在反射期間訪問它們。 但這絕對與您的特定情況無關。

是的,當我更多地考慮它時,我想只有內聯屬性可能會失敗的方法 INotifyPropertyChanged 接口正確的工作是如果您使用基於反射的方法,例如

public Count
{
get {return m_Count;}
 set { m_Count=value;
      GetCurrentPropertyNameUsingReflectionAndNotifyItChanged();}
}

如果像您建議的那樣使用,則程序集中確實存在元數據,並且將從那里成功獲取屬性名稱。

讓我們倆都在思考。

我個人同意@Sergey:

考慮到內聯發生在 JIT 編譯器端,但之前生成的元數據,它不應該以任何方式影響反射。 順便說一句,好問題,喜歡它+1

表達式樹無論如何都不能內聯,因為它們是表達式(抽象語法樹)的表示,而不是表達式本身。

委托,即使它們可以內聯,仍將在其屬性中攜帶有關被調用的方法和目標的數據。

暫無
暫無

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

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