1. 程式人生 > >C# 泛型理解

C# 泛型理解

泛型是 2.0 版 C# 語言和公共語言執行庫 (CLR) 中的一個非常重要的新功能。在此之前進行資料轉化時候需要進行裝箱與拆箱操作。我們知道裝箱與拆箱需要消耗很大效能,泛型的引用主要優點是效能。

在學習泛型之前我們先了解一下值型別,引用型別以及裝箱,拆箱。

值型別儲存在棧上,引用型別儲存在堆上。C#的類是引用型別,結構是值型別。.NET很容易把值型別轉換成引用型別,例如int型別的值可以任意賦值給一個物件,反之,任意一個裝箱後的值型別可以進行轉換成引用型別,這個過程我們稱之為拆箱操作,拆箱時,需要進行型別的強制轉換。

下面我們拿ArrayList為例來說明一下拆箱與裝箱:

static void Main(string[] args)
        {
            ArrayList list = new ArrayList();
            //ArrayList.Add(object value)方法,可以看出傳入的引數為object型別
            list.Add(10);//這裡傳入int型別10,則進行裝箱操作
            //如果這時候我們想獲取這個int型別
            //int value = list[0];//如果這裡不做強轉則會報出異常:無法將型別“object”轉成“int”,需要進行強轉。這裡也可以看出int型別存入list後進行了裝箱操作
            int value = (int)list[0]; //如果需要讀取list儲存的原來的int值,則需要進行拆箱操作
        }

後來C#加入了泛型T,如下:

System.Collections.Generic名稱空間中的List<T>類不使用物件,而是在使用時定義型別。例項如下:

 class Program
    {
        static void Main(string[] args)
        {
            List<int> list1 = new List<int>();
            List<string> list2 = new List<string>();
            List<Student> list3 = new List<Student>();
            list1.Add(1);
            list1.Add(2);
            list1.Add(3);
            foreach(int i in list1)
            {
                Console.WriteLine(i);
            }
            list2.Add("Hello");
            list2.Add("Word");
            list2.Add("!");
            string str = string.Empty;
            foreach (string item in list2)
            {
                str += item + " ";
            }
            Console.WriteLine(str);

            Student std1=new Student();
            std1.Id=1;
            std1.Name="張三";
            list3.Add(std1);

            Student std2 = new Student();
            std2.Id = 2;
            std2.Name = "李四";
            list3.Add(std2);

            Student std3 = new Student();
            std3.Id = 3;
            std3.Name = "王五";
            list3.Add(std3);
            foreach (Student item in list3)
            {
                Console.WriteLine("學號:{0};姓名:{1}", item.Id,item.Name);
            }

            Console.ReadLine();
        }
       
    }
    public struct Student
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

泛型使用的時候指定型別即可避免了裝箱拆箱的操作,大大增加了效能。

相關推薦

C# 理解之大白話

泛型:泛就是多,許多,很多的意思;型:就是型別,比如:int、float、double等等的資料型別;連線起來就是許多不同的資料型別,包括內建資料型別:就是系統自帶,定義好的;自定義型別:就是自己定義的,比如說自己定義的類型別; 為什麼要用泛型? 其實在專案研發中,經常會出

C# 理解

泛型是 2.0 版 C# 語言和公共語言執行庫 (CLR) 中的一個非常重要的新功能。在此之前進行資料轉化時候需要進行裝箱與拆箱操作。我們知道裝箱與拆箱需要消耗很大效能,泛型的引用主要優點是效能。在學習泛型之前我們先了解一下值型別,引用型別以及裝箱,拆箱。值型別儲存在棧上,引

C#的初步理解

認識 templet 編寫代碼 編譯器 字符串類型 解釋 引用 根據 支持 一.先讓我們認識一下泛型。 1.1什麽是泛型? 1.1.1泛型是程序設計語言的一種特性。允許程序員在強類型程序設計語言中編寫代碼時定義一些可變部分,那些部分在使用前必須作出指

《深入理解計算機系統》讀書筆記(ch2)+ C

tex byte 指向 get 讀書筆記 class its n) 支持 本章主要介紹各類型的機器表示,Stanford的CS107的lec2和lec3有精彩解釋,比看書快(當作書中只是的cache吧)。 lec4中介紹的C裏面如何使用泛型(沒有template, refe

C# 的簡單講解和應用

出現 ava 問題 this bsp div arc 但是 int 泛型 什麽是泛型   泛型是 2.0 版 C# 語言和公共語言運行庫 (CLR) 中的一個新功能。泛型將類型參數的概念引入 .NET Framework,類型參數使得設計如下類和方法成為可能:這些類和方

C#約束

bstr 部分 name 一個 參數 list 多個 哈哈 override 本文將對各類泛型約束做一個簡單的總結。 文章一開始,給出演示代碼底稿(在此基礎上修改,演示,說明。) class MyList<T> { List<T> list

C# 特化

但是 data load max fim not str wrap lock C# 泛型不是 C++ 的模板類,並不支持特化和偏特化,但是使用一些技巧可以在一定程度上達到相同的目的。 原文是 po 在 stackoverflow 上的一個回答:A: Generic inde

Java VS C# (偽 VS 真

功能 方法表 語法 一個 class msil 虛方法 strong 反射 一、泛型的本質 泛型是參數化類型的應用,操作的數據類型不限定於特定類型,可以根據實際需要設置不同的數據類型,以實現代碼復用。 二、Java泛型 Java 泛型是Java1.5新增的特性,JVM並

C++ 程序設計與STL模板庫(1)---程序設計簡介及STL簡介與結構

urn 向上 隊列 是把 鏈表 需要 input stack 特定 泛型程序設計的基本概念 編寫不依賴於具體數據類型的程序 將算法從特定的數據結構中抽象出來,成為通用的 C++的模板為泛型程序設計奠定了關鍵的基礎 術語:概念 用來界定具備一定功能的數據類型。例如:

C# 詳解

安全 c++ urn 操作 類型 增加 add 應用 定義 什麽是泛型 我們在編寫程序時,經常遇到兩個模塊的功能非常相似,只是一個是處理int數據,另一個是處理string數據,或者其他自定義的數據類型,但我們沒有辦法,只能分別寫多個方法處理每個數據類型,因為

C#基礎知識點總結

www. compile win 泛型 override amp 。。 target 類繼承   1.0 什麽是泛型 泛型是C#2.0和CLR(公共語言運行時)升級的一個新特性,泛型為.NET 框架引入了一個叫 type parameters(類型參數)的概念

c#——約束

函數 {} 構造 引用 where string c# 泛型 構造函數 例 public void Func<T>(string str)where T:class{} 將泛型T約束為類 T:class class約束,約束為引用類型 T:struct

C# 和委托

color program object turn cnblogs urn task pub cdd using System; using System.Collections.Generic; using System.Linq; using System.Text;

C#Dictionary的用法實例詳解

contains code medium 計算 aaa alt -i 硬件 ole 本文以實例形式講述了C#中的泛型Dictionary的用法。具有很好的實用價值。分享給大家供大家參考。具體如下: 泛型最常見的用途是泛型集合,命名空間System.Collections.

26.C++- 編程之類模板(詳解)

泛型編程 info vid 推導 成員函數 multi IT 操作符 com 在上章25.C++- 泛型編程之函數模板(詳解) 學習了後,本章繼續來學習類模板 類模板介紹 和函數模板一樣,將泛型思想應用於類. 編譯器對類模板處理方式和函數模板相同,都是進行2次編

Java理解

for pub 機制 xtend bject 進行 允許 數組元素 不能   Java泛型提供了編譯時類型安全檢測機制,該機制允許程序員在編譯時檢測到非法的類型。當需要使用某一種算法時,又無法具體算法的數據類型,或者想指定類型值的上限或下限,那麽這時就需要Java泛型來大顯

[C#],變體,事件,Lambda表達式

http 技術 有一個 分享圖片 至少 分組 AC oid 添加 定義泛型類型: (1)定義泛型類(在比較泛型的類型值是否為NULL時只能使用==和!=兩個運算符,兩個泛型類不能進行比較,因為不知道它們是否支持運算符),以及如果說要確定用於創建泛型實例的類型,需要了解它們是

C++編程之函數模板

默認參數 soft 需要 mys 信息 ... 數據類型 交互 實現 泛型語義   泛型(Generic Programming),即是指具有在多種數據類型上皆可操作的含意。泛型編程的代表作品 STL 是一種高效、泛型、可交互操作的軟件組件。  泛型編程最初誕生於 C++中

C++線性查找算法——find

除了 const 代碼 指向 筆記 正常 查找算法 文章 con C++泛型線性查找算法——find 《泛型編程和STL》筆記及思考。 線性查找可能是最為簡單的一類查找算法了。他所作用的數據結構為一維線性的空間。這篇文章主要介紹使用 C++ 實現泛型算法 find的過程。

C#中的抗變和協變

cep 就是 idt oid pre set 協變 nbsp 通過 在.net4之前,泛型接口是不變的。.net4通過協變和抗變為泛型接口和泛型委托添加了一個重要的拓展 1、抗變:如果泛型類型用out關鍵字標註,泛型接口就是協變的。這也意味著返回類型只能是T。 實例: