TypedReference
struct在實際代碼中是否會有實際用途?TypedReference的實際用途
EDIT:.NET框架使用它們,其中建立來自__arglist
參數的數組,並將其傳遞到正常params
過載的Console.WriteLine
和String.Concat
重載。爲什麼這些重載存在?
TypedReference
struct在實際代碼中是否會有實際用途?TypedReference的實際用途
EDIT:.NET框架使用它們,其中建立來自__arglist
參數的數組,並將其傳遞到正常params
過載的Console.WriteLine
和String.Concat
重載。爲什麼這些重載存在?
在實際代碼中實際使用的TypedReference結構是否有任何實際用途?
是的。如果我需要與C風格的可變參數方法的互操作性,我會使用它們。
爲什麼這些重載存在?
它們存在與喜歡使用C風格可變參數方法的調用者的互操作性。
+1不會砰的一聲C型varidiac位:)這裏是希望你有5.0可變參數模板(不是泛型)。 –
這似乎是一個非常古老的問題,但我想再添加一個用例:當你有一個結構並想通過反射設置它的變量時,你總是會對盒裝值進行操作,並且永遠不會改變原來的。這是無用的:
TestFields fields = new TestFields { MaxValue = 1234 };
FieldInfo info = typeof(TestFields).GetField("MaxValue");
info.SetValue(fields, 4096);
// result: fields.MaxValue is still 1234!!
這可以通過暗示拳擊來彌補,但是那麼你就會失去類型安全性。相反,你可以用一個TypedParameter
來解決這個問題:
TestFields fields = new TestFields { MaxValue = 1234 };
FieldInfo info = fields.GetType().GetField("MaxValue");
TypedReference reference = __makeref(fields);
info.SetValueDirect(reference, 4096);
// result: fields.MaxValue is now indeed 4096!!
我不知道我是否會將此稱爲反射特定問題。 'SetValue'接受一個對象作爲輸入,所以任何值類型都會被裝箱以匹配方法的簽名。 –
@BrianRasmussen:afaik,這種特定於反射的行爲來源於反射,它會先於泛型,否則將不需要裝箱。在(預)盒裝值類型和引用上,不會出現此問題。 – Abel
我的觀點是,任何將'object'作爲輸入的方法(在你的例子中,第一個重載的'SetValue')會強制值被裝箱。這就是統一類型系統處理值的方式。這不是特定於反思。 –
爲什麼這不是建設性的? :o – nawfal
另請參閱http://stackoverflow.com/questions/4764573/why-is-typedreference-behind-the-scenes-its-so-fast-and-safe-almost-magical – nawfal
您也可以使用它來傳遞堆棧位置/變量引用「around」(例如,到其他線程或從方法返回)。它需要不安全的代碼並將TypedReference「複製」爲兩個IntPtr。 –