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);
  }
}

<<:  发起通往天堂的号角

>>:  Day 20-state inspection-更改 state 有其风险,State manipulation 有赚有赔,更改前应详阅官方文件说明书之二

Day04 测试写起乃 - 撰写Rspec

在上一篇我们已经安装好 rspec 也产出了 User model 接下来就开始尝试写测试搂! 我在...

Day 15 - UML x Interface — Notifier

UML Notifier 的 UML 主要是根据 Ant Design 的设计画出来的,而在 Ma...

【DAY 5】主管签名好难追怎麽办? Power Automate - 核准

哈罗 ~ 大家好 ~ 欢迎回来 ~ 相信征战职场的大家,一定会有个苦恼的问题,那就是每次老板签公文都...

谈谈TDD

Google i/o 2017 提到了Android TDD 的参考(https://develop...

Day 16 - Array Methods

map() 和 forEach 很像,不同处在於 forEach 没有回传值,使用 map 时会 r...