[英]When should `Object` be used in C# 2.0 and newer? Do Generics replace all occurrences of Object?
我的同事聲稱在.NET 2.0及更新版本中聲明變量,返回參數等時從不需要使用Object
。
他進一步說,在所有這些情況下,應該使用Generic作為替代方案。
這種說法是否有效? 在我的腦海中,我使用Object
來鎖定並發線程......
泛型在很多情況下確實勝過object
,但只在知道類型的地方。
有些時候你還不知道類型 - object
,或者其他一些相關的基類型就是這些情況下的答案。
例如:
object o = Activator.CreateInstance("Some type in an unreferenced assembly");
您將無法轉換該結果,甚至無法在編譯時知道該類型是什么,因此object
是有效的用途。
你的同事過於泛化 - 或許指出他在這個問題上。 泛型是偉大的,給他那么多,但他們不“替換” object
。
object
非常適合鎖定。 泛型允許您保持適當的輸入。 您甚至可以將其約束到接口或基類。 你無法用object
做到這一點。
考慮一下:
void DoSomething(object foo)
{
foo.DoFoo();
}
沒有任何演員,這將無法奏效。 但是用泛型......
void DoSomething<T>(T foo) where T : IHasDoFoo
{
foo.DoFoo();
}
使用C#4.0和dynamic
,您可以將其設置為運行時,但我真的沒有看到需要。
void DoSomething(dynamic foo)
{
foo.DoFoo();
}
當使用與COM的互操作時,你並不總是有選擇...通用不能真正滿足互操作的問題。
Object
也是lock
最輕量級的選項,正如@Daniel A. White在他的回答中提到的那樣。
是的,有效性。 這里已經有了很好的細分。
但是,我無法確認是否沒有您永遠不會使用對象的實例,但我個人並不使用它們,甚至在仿制葯之前我避免裝箱/拆箱。
有許多反例,包括你提到的那個,使用對象進行同步。
另一個示例是DataSource
綁定中使用的DataSource
屬性,可以將其設置為各種不同對象類型之一。
廣泛的反例:System.Collections命名空間在.NET 4中運行良好,沒有棄用或警告其在MSDN上使用的跡象。 你在那里找到的方法采取和返回對象。
問題中固有的實際上是兩個問題:
類型為Object
存儲位置顯然必須用於需要保存對該類型實例的引用的任何情況(因為對此類實例的引用不能以任何其他類型保存)。 除此之外,它們應該用於它們將保持對沒有單一有用的公共基類型的對象的引用的情況。 在使用Reflection(其中對象的類型可能取決於在運行時計算的字符串)的許多場景中,這顯然是正確的,但也可以應用於某些種類的集合,這些集合填充了在編譯時已知類型的事物。 作為一個簡單的例子,可以表示由int
序列索引的string
的分層集合,使每個節點的類型為Object
,並使其包含String
或Object[]
。 從這樣的集合中讀出項目會有點笨重,因為必須檢查每個項目並確定它是Object[]
還是String
的實例,但是這樣的存儲方法將非常節省內存,因為只有對象實例將是那些持有字符串或數組的實例。 一個可以定義一個Node
類型與類型字段String
和類型的一個Node[]
或者甚至定義一個抽象Node
與派生類型類型StringNode
(包括類型字段String
)和ArrayNode
(具有類型的字段Node[]
但是這樣的方法會增加用於保存給定數據集的堆對象的數量。
請注意,通常最好設計集合,以便要檢索的對象的類型不依賴於被塞入集合的內容(可能使用不同類型的“並行集合”),但並非所有內容都以語義方式運行。
關於Object
類型的實例,我不確定它們是否可以填充任何角色,這些角色不會被稱為類似TokenObject
的密封類型(從Object
繼承)。 在許多情況下,擁有一個唯一目的是作為唯一令牌的對象實例是有用的。 從概念上講,它可能更好:
TokenObject myLock = new TokenObject;
而不是說
Object myLock = new Object;
因為前一個聲明會清楚地表明聲明的變量永遠不會用於保存除令牌對象之外的任何東西。 盡管如此,通常的做法是使用Object
類型的實例,在這種情況下, Object
唯一重要的是它的引用在程序的整個生命周期中都是唯一的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.