iT邦幫忙

2021 iThome 鐵人賽

DAY 6
0
自我挑戰組

C# 與 .Net Core 雜記系列 第 6

C# 泛型(generics)

泛型(generics)

C# 2.0 後開始支持型別參數概念, 指一些類別、結構、介面與方法, 其具有所儲存或使用之一個或多個類型的預留位置也就是所謂的型別參數, 使用泛型就不必擔心程式被呼叫時還要考慮傳入的資料型別, 只要專心開發功能即可, 藉由使用泛型型別參數可以撰寫可供其他用戶端程式碼使用的單一類別, 而可以避免進行型別轉換或裝箱(Boxing)操作的代價和風險. 泛型類別和泛型方法結合了具有重複使用性、型別安全、高效率, 不是非泛型類別所能及的, 泛型廣泛應用於集合(Collection)和對集合操作的方法中, System.Collections.Generic 命名空間包含數個以泛型為基礎的集合類別, System.Collections 定義了非泛型 集合(Collections) 類別, 不建議使用非泛型集合類別.

// 使用 array 一開始就必須固定元素個數
static string[] GenerateNames()
{
  string[] names = new string[3];
  names[0] = "May";
  names[1] = "John";
  names[2] = "Marlon";
  return names;
}

static void PrintNames(string[] names)
{
  foreach (string name in names)
  {
    Console.WriteLine(name);
  }
}

// 使用 ArrayList 型別不安全, 需要 Boxing, Unboxing 效率不高
static ArrayList GenerateNames()
{
  ArrayList names = new ArrayList();
  names.Add("May");
  names.Add("John");
  names.Add("Marlon");
  return names;
}

static void PrintNames(ArrayList names)
{
  foreach (string name in names)
  {
    Console.WriteLine(name);
  }
}

// 使用 StringCollection // 型別安全, 效率高, 但收集類型必須是框架或程式庫提供的
static StringCollection GenerateNames()
{
  StringCollection names = new StringCollection();
  names.Add("May");
  names.Add("John");
  names.Add("Marlon");
  return names;
}

static void PrintNames(StringCollection names)
{
  foreach (string name in names)
  {
    Console.WriteLine(name);
  }
}

// 使用 List<T> 型別安全, 效率高, 可以自訂收集的類別
static List<string> GenerateNames()
{
  List<string> names = new List<string>();
  names.Add("May");
  names.Add("John");
  names.Add("Marlon");
  return names;
}

static void PrintNames(List<string> names)
{
  foreach (string name in names)
  {
    Console.WriteLine(name);
  }
}

上一篇
C# 一些特性
下一篇
C# LINQ
系列文
C# 與 .Net Core 雜記14
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言