---
# System prepended metadata

title: 泛型
tags: [open, 泛型, C#]

---

---
title: 泛型
tags: 泛型,C#,open
description: LOG
---
> [name=Jiesen] [time=Sun, 20210927 ] [color=#907bf7]


[TOC]
# 程式範例+說明
```C#
//表示T必须是class。 就不能是int,float(基本型態),但可以是string
where T : class

/*
表示类型T必须具有無參數建構子函数。可以T field = new T();的操作，否则将无法执行。
*/
where T : class, new()
```
# 學習心得
曾經想寫像下面這樣的程式但那時候寫不出來,後來研究一下現在弄出來了,特別在此筆記一下
當時我先定義回傳型別List<T>然後方法名稱GetListData沒給  泛型所以程式一直出錯
```C#
 /*
 泛型規則
 傳型別的地方(泛型)
 從類別名稱那定義<T>
 或
 方法稱那定義<T>
 
 方法名稱要先定義泛型(算是泛型的溝通管道),方法型別的泛型與方法內容的泛型都是參考方法名稱傳進來的泛型型別
 */
 public List<T> GetListData<T>(string strSql)
        {
            using (SqlConnection conn = new SqlConnection(strConnection))
            {      
                return conn.Query<T>(strSql).ToList();
            }
        }
```
# 類別泛型
## 方式一 
```c#
 class DataStore<T>
{
    public T Data { get; set; }
}
//呼叫
DataStore<string> store = new DataStore<string>();
store.Data = "Hello World!"; 
```
## 方式二 
可以定義多個類型參數，以逗號分隔。
```c#
class KeyValuePair<TKey, TValue>
{
    public TKey Key { get; set; }
    public TValue Value { get; set; }
}
//乎叫
KeyValuePair<int, string> kvp1 = new KeyValuePair<int, string>();
kvp1.Key = 100;
kvp1.Value = "Hundred";
```
    
# 方法泛型
在方法名稱的後面以<>括住待定義的型別參數
待定義的型別參數名稱習慣以T開頭(Ex: TResult)
泛型可用在傳入參數及回傳值
==可以以where定義型別參數的條件，以此例來說，where T : new()定義T有建構子，如此一來我們才可以在new T()==
```C#
public List<T> test3<T>(string s) 
{
    return new List<T>();
}
    
public T Generic<T>(T b) where T : new()
{
    return new T();
}
    
```
[泛型介紹](https://ithelp.ithome.com.tw/articles/10194019)
# 參考網站
[c＃：“ where T：class，new()”是什么意思？](https://www.codenong.com/4737970/)
    
[tutorialsteacher](https://www.tutorialsteacher.com/csharp)

[型別參數的條件約束](https://docs.microsoft.com/zh-tw/dotnet/csharp/programming-guide/generics/constraints-on-type-parameters)







