C# 核心类型体系指南
<h2>一、C# 类型体系总览</h2><div> </div>
<div>C# 所有类型最终都属于两大分类:</div>
<div> </div>
<ol>
<li>值类型(Value Type)</li>
<li>引用类型(Reference Type)</li>
</ol>
<div> </div>
<div>所有类型都继承自 <code>object</code>(<code>System.Object</code>)。</div>
<div> </div>
<hr>
<div> </div>
<h2>二、值类型 vs 引用类型(核心区别)</h2>
<div> </div>
<h3>1. 定义</h3>
<div> </div>
<ul>
<li>值类型:数据直接存在栈上,变量本身就是数据。</li>
<li>引用类型:数据存在堆上,变量只是指向堆的地址(引用)。</li>
</ul>
<div> </div>
<h3>2. 典型类型</h3>
<div> </div>
<div>值类型</div>
<div> </div>
<ul>
<li>基本类型:<code>int, long, float, double, bool, char</code></li>
<li>枚举 <code>enum</code></li>
<li>结构体 <code>struct</code></li>
<li>可空值类型 <code>int?</code></li>
</ul>
<div> </div>
<div>引用类型</div>
<div> </div>
<ul>
<li>字符串 <code>string</code></li>
<li>数组 <code>int[]</code></li>
<li>类 <code>class</code></li>
<li>接口 <code>interface</code></li>
<li>委托 <code>delegate</code></li>
<li>集合 <code>List<T></code>, <code>Dictionary<T,K></code></li>
</ul>
<div> </div>
<h3>3. 赋值行为</h3>
<div> </div>
<ul>
<li>值类型赋值 → 复制一份数据,两个变量互不影响。</li>
<li>引用类型赋值 → 复制地址,两个变量指向同一份数据。</li>
</ul>
<div> </div>
<h3>4. 内存与空值</h3>
<div> </div>
<ul>
<li>值类型:不能为 null(除非用可空类型)</li>
<li>引用类型:默认是 null,不指向任何对象</li>
</ul>
<div> </div>
<hr>
<div> </div>
<h2>三、可空类型(Nullable Type)</h2>
<div> </div>
<h3>1. 作用</h3>
<div> </div>
<div>让值类型也能表示 <code>null</code>(比如数据库字段、前端传参可能为空)。</div>
<div> </div>
<h3>2. 语法</h3>
<div>
<div dir="ltr">
<div>
<div> </div>
</div>
<div>
<pre><code>int? a = null; // 简写
Nullable<int> b = null; // 完整写法
</code></pre>
</div>
<div> </div>
</div>
</div>
<h3>3. 常用操作</h3>
<div>
<div dir="ltr">
<div>
<div> </div>
</div>
<div>
<pre><code>int? num = null;
// 判断是否有值
if (num.HasValue) { ... }
// 获取值(空会报错)
int val = num.Value;
// 安全获取:空则给默认值
int safe = num ?? 0;
</code></pre>
</div>
<div> </div>
</div>
</div>
<h3>4. 空合并运算符 <code>??</code></h3>
<div>
<div dir="ltr">
<div> </div>
<div>
<pre><code>int result = num ?? 100;
// 如果 num 是 null → 用 100
</code></pre>
</div>
<div> </div>
</div>
</div>
<h3>5. 空条件运算符 <code>?.</code>(引用类型常用)</h3>
<div>
<div dir="ltr">
<div>
<pre><code>string s = null;
int len = s?.Length ?? 0;
// 不报错,直接返回 0
</code></pre>
</div>
<div> </div>
</div>
</div>
<hr>
<div> </div>
<h2>四、泛型(Generic)</h2>
<div> </div>
<h3>1. 什么是泛型?</h3>
<div> </div>
<div>让类 / 方法 / 接口可以不预先指定具体类型,而是在使用时才指定。</div>
<div> </div>
<h3>2. 优点</h3>
<div> </div>
<ul>
<li>代码复用</li>
<li>类型安全(不会乱传类型)</li>
<li>避免装箱拆箱(性能更高)</li>
</ul>
<div> </div>
<h3>3. 语法</h3>
<div>
<div dir="ltr">
<div> </div>
<div>
<pre><code>// 泛型类
public class MyList<T>
{
public void Add(T item) { }
}
// 使用
var list = new MyList<int>();
list.Add(10);
</code></pre>
</div>
<div> </div>
</div>
</div>
<h3>4. 泛型约束(限制 T 是什么类型)</h3>
<div>
<div dir="ltr">
<div> </div>
<div>
<pre><code>where T : class // 必须是引用类型
where T : struct // 必须是值类型
where T : new() // 必须有无参构造
where T : 基类/接口 // 必须继承/实现
</code></pre>
</div>
<div> </div>
</div>
</div>
<h3>5. 泛型方法</h3>
<div>
<div dir="ltr">
<div> </div>
<div>
<pre><code>T GetMax<T>(T a, T b) where T : IComparable<T>
{
return a.CompareTo(b) > 0 ? a : b;
}
</code></pre>
</div>
<div> </div>
</div>
</div>
<div> </div>
<hr>
<div> </div>
<h2>五、C# 常用集合(最实用清单)</h2>
<div> </div>
<div>集合就是存放多个数据的容器,C# 提供了非常完善的泛型集合。</div>
<div> </div>
<h3>1. <code>List<T></code> 动态数组</h3>
<div> </div>
<div>最常用、最万能的集合。</div>
<div>
<div dir="ltr">
<div>
<div>
<div>
<div> </div>
</div>
</div>
</div>
<div>
<pre><code>List<int> list = new List<int>();
list.Add(1);
list.AddRange(new[] {2,3});
list.RemoveAt(0);
int count = list.Count;
</code></pre>
</div>
<div> </div>
</div>
</div>
<h3>2. <code>Dictionary<TKey, TValue></code> 键值对</h3>
<div> </div>
<div>根据键快速查找值,O (1) 速度。</div>
<div>
<div dir="ltr">
<div> </div>
<div>
<pre><code>Dictionary<int, string> dict = new Dictionary<int, string>();
dict = "张三";
dict.Add(2, "李四");
string name = dict;
</code></pre>
</div>
<div> </div>
</div>
</div>
<h3>3. <code>HashSet<T></code> 不重复集合</h3>
<div> </div>
<div>自动去重,无索引、无顺序。</div>
<div>
<div dir="ltr">
<div> </div>
<div>
<pre><code>HashSet<int> set = new HashSet<int>();
set.Add(1);
set.Add(1); // 不会重复
</code></pre>
</div>
<div> </div>
</div>
</div>
<h3>4. <code>Queue<T></code> 队列</h3>
<div> </div>
<div>先进先出 FIFO。</div>
<div>
<div dir="ltr">
<div> </div>
<div>
<pre><code>Queue<int> q = new Queue<int>();
q.Enqueue(1);
int first = q.Dequeue();
</code></pre>
</div>
<div> </div>
</div>
</div>
<h3>5. <code>Stack<T></code> 栈</h3>
<div> </div>
<div>先进后出 LIFO。</div>
<div>
<div dir="ltr">
<div> </div>
<div>
<pre><code>Stack<int> stack = new Stack<int>();
stack.Push(1);
int top = stack.Pop();
</code></pre>
</div>
<div> </div>
</div>
</div>
<h3>6. 数组 <code>T[]</code></h3>
<div> </div>
<div>固定长度,性能最高。</div>
<div>
<div dir="ltr">
<div> </div>
<div>
<pre><code>int[] arr = new int;
</code></pre>
</div>
<div> </div>
</div>
</div>
<div> </div>
<hr>
<div> </div>
<h2>六、核心知识点速记表</h2>
<div> </div>
<div>
<div>
<div>表格</div>
<div> </div>
</div>
<div>
<div>
<div>
<table>
<thead>
<tr><th>特性</th><th>值类型</th><th>引用类型</th></tr>
</thead>
<tbody>
<tr>
<td>存储</td>
<td>栈(Stack)</td>
<td>堆(Heap)</td>
</tr>
<tr>
<td>赋值</td>
<td>复制数据</td>
<td>复制地址</td>
</tr>
<tr>
<td>null</td>
<td>不支持(除非可空)</td>
<td>默认为 null</td>
</tr>
<tr>
<td>典型类型</td>
<td>int、bool、struct</td>
<td>string、class、List、数组</td>
</tr>
<tr>
<td>方法传递</td>
<td>传值(副本)</td>
<td>传引用(原对象)</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
<div> </div>
<hr>
<div> </div>
<h3>总结</h3>
<div> </div>
<ol>
<li>值类型存数据,引用类型存地址,赋值行为完全不同。</li>
<li>可空类型 <code>?</code> 让值类型可以为 null,配合 <code>??</code> 做安全取值。</li>
<li>泛型 <code><T></code> 实现类型安全、代码复用、高性能。</li>
<li>日常开发优先用:<code>List<T></code>、<code>Dictionary<TKey,TValue></code>。</li>
</ol><br><br>
来源:https://www.cnblogs.com/chuansheng/p/19907996
頁:
[1]