← Back to list

.Net T(Generics) V.S. Object

在.net 中經常會用T(Generics) 來處理多型的情況,而泛型的優勢究竟有多大,是這篇探討的主旨,也讓大家能放心使用泛型。

Yang Chen · 2026-05-26 04:32 · 0 claps · 3.0 min read
#泛型 #objects #benchmarkdotnet
Open on Medium ↗
Wiki topics: EVAL · Evaluation & Benchmarks

.Net T(Generics) V.S. Object

在.net 中經常會用T(Generics) 來處理多型的情況,而泛型的優勢究竟有多大,是這篇探討的主旨,也讓大家能放心使用泛型。

泛型 (Generics):屬於Compile 時期,而Compile時期有什麼好處呢?可以確保在執行前,在編譯時期就能確保型態的安全,開發的IDE也能在開發時,確認物件的型態,並且因為知道確切形態,所以能在記憶體分配時,預設切分記憶體,來讓記憶體能被有效的運用。

物件型態(Object):屬於Run-time時期的物件,在執行上系統會在執行時期,才會動態知道該Object是處理什麼的事物,好處是在處理擴充需求時,可以很快的加入,但缺點是,在各別使用的情況,有可能會有該型別無法支援該功能,導致執行時才有報錯的狀況。

為了比較實際上的差異,使用了BenchmarkDotNet來記錄個別的狀態, 而使用的方式也非常容易,官網資訊為以下 https://benchmarkdotnet.org/articles/overview.html

//將這個服務加入dotnet專案中
dotnet add package BenchmarkDotNet 
//增加對應的Tag 
//HtmlExporter 將統計資料輸出到Html檔案格式
//MemoryDiagnoser 統計記憶體資訊
[HtmlExporter]
[MemoryDiagnoser] 
public class MemoryTest
{
    private const int Size = 1_000_000;

    [Benchmark]
    public object[] WithObject()
    {
        object[] arr = new object[Size];
        for (int i = 0; i < Size; i++) arr[i] = i; // Boxing
        return arr;
    }

    [Benchmark]
    public List<int> WithGeneric()
    {
        List<int> list = new List<int>(Size);
        for (int i = 0; i < Size; i++) list.Add(i); // No Boxing
        return list;
    }
}
//啟動
var summary = BenchmarkRunner.Run<MemoryTest>();

最後產出的結果, Mean 平均執行時間 / Error 測量的誤差 / StdDev 標準差 / Gen0 短期記憶體回收次數 / Gen1 中期記憶體回收次數 / Gen2 長期記憶體回收次數 / Allocated 記憶體的使用

可以比較明顯的看出平均執行時間,以及消耗的記憶體都是由使用泛型的WithGeneric()的Method佔有優勢,不論是執行時間或是記憶體的使用量, 而記憶體回收的次數會比較高,則比較算是BenchmarkDotNet的框架問題。

結論:整體而言,大致的使用情境都還是建議使用泛型,處理時間以及記憶體使用量都表現較好,但在某些情境下也還是會使用Object的動作,例如:接回Json時,用JsonNode或JsonObject的物件去操作使用,這類的物件底層還是繼承Object的使用。原因在於會使用JsonObject物件去接主要也是對接回來的Json不確定其中的規格,所以用這樣的方式去處理Json物件,但如果有確切的資料規格,就建議反序列化將資料轉為明確的物件來處理。


메타데이터
post_id
d5e07de0ffd0
slug
net-t-generics-v-s-object-d5e07de0ffd0
url
https://medium.com/@s97172634/net-t-generics-v-s-object-d5e07de0ffd0
canonical_url
https://medium.com/@s97172634/net-t-generics-v-s-object-d5e07de0ffd0
author_url
https://medium.com/@s97172634
status
ok
fetched_at
2026-08-09 12:03:29