2009-11-10 89 views
22

TypedReference struct在實際代碼中是否會有實際用途?TypedReference的實際用途

EDIT:.NET框架使用它們,其中建立來自__arglist參數的數組,並將其傳遞到正常params過載的Console.WriteLineString.Concat重載。爲什麼這些重載存在?

+1

爲什麼這不是建設性的? :o – nawfal

+1

另請參閱http://stackoverflow.com/questions/4764573/why-is-typedreference-behind-the-scenes-its-so-fast-and-safe-almost-magical – nawfal

+0

您也可以使用它來傳遞堆棧位置/變量引用「around」(例如,到其他線程或從方法返回)。它需要不安全的代碼並將TypedReference「複製」爲兩個IntPtr。 –

回答

17

在實際代碼中實際使用的TypedReference結構是否有任何實際用途?

是的。如果我需要與C風格的可變參數方法的互操作性,我會使用它們。

爲什麼這些重載存在?

它們存在與喜歡使用C風格可變參數方法的調用者的互操作性。

+1

+1不會砰的一聲C型varidiac位:)這裏是希望你有5.0可變參數模板(不是泛型)。 –

10

這似乎是一個非常古老的問題,但我想再添加一個用例:當你有一個結構並想通過反射設置它的變量時,你總是會對盒裝值進行操作,並且永遠不會改變原來的。這是無用的:

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!! 
+0

我不知道我是否會將此稱爲反射特定問題。 'SetValue'接受一個對象作爲輸入,所以任何值類型都會被裝箱以匹配方法的簽名。 –

+0

@BrianRasmussen:afaik,這種特定於反射的行爲來源於反射,它會先於泛型,否則將不需要裝箱。在(預)盒裝值類型和引用上,不會出現此問題。 – Abel

+0

我的觀點是,任何將'object'作爲輸入的方法(在你的例子中,第一個重載的'SetValue')會強制值被裝箱。這就是統一類型系統處理值的方式。這不是特定於反思。 –

相關問題