目录
[1.2.3空字符串 vs 空引用](#1.2.3空字符串 vs 空引用)
2.3泛型方法/接口中的"默认类型值"(default(T))
1.null关键字
1.1核心概念
-
简单说:
null就是"什么都没有"、"空"、"没有指向任何东西"在程序里,
null是一个特殊的字面值(就像数字5或文字"你好"一样),但它不代表任何实际存在的对象或数据 -
它主要用在引用类型的变量上(比如你创建的一个类的实例,或者字符串
string)
用个比喻:
-
想象你有一个遥控器 (这个遥控器代表一个变量)
-
这个遥控器可以控制一台电视 (这台电视代表一个对象 ,比如
MyClass的一个实例,或一个字符串) -
null就相当于这个遥控器没有对准任何一台电视它存在(你有遥控器),但它现在控制不了任何东西
-
如果你对着一个
null遥控器(变量)按按钮(调用方法.MyMethod()),什么也不会发生或者程序会报错(就像你对着空气按按钮)
1.2举例
1.2.1空引用异常

class Program
{
class MyClass
{
public void MyMethod()
{
Console.WriteLine("MyMethod is ok");
}
}
static void Main()
{
MyClass mc; // 声明了一个遥控器,但还没对准任何电视(未赋值)
mc = null; // 把遥控器设置为"空频道"(指向 null)
mc.MyMethod(); // 报错:NullReferenceException (空引用异常)
}
}
1.2.2正常赋值

static void Main()
{
MyClass mc; // 声明了一个遥控器,但还没对准任何电视(未赋值)
mc = new MyClass(); // 创建了一台新的 MyClass "电视",并把遥控器 mc 对准它
mc.MyMethod();
}
1.2.3空字符串 vs 空引用

class Program
{
static void Main()
{
//空字符串 vs 空引用 (null)
string s = null;
string t = string.Empty; // 字符串 t 指向一个真正的"空字符串"对象 (一台显示空白屏幕的电视)
// 重要区别:s 是"没有电视",t 是"有一台电视,但屏幕是黑的(里面没字符)"
//比较空字符串和 null
Console.WriteLine($"t.Equals(s) is {t.Equals(s)}"); // 值为 False
Console.WriteLine($"Empty string {(s == t ? "equals" : "does not equal")} null string"); // 值为 False
Console.WriteLine($"null == null is {null == null}"); // 值为 True
}
}
1.2.4值类型设置空
int i = null; // 错误!编译器不允许
若需要值类型也能表示"没有值"(比如数据库里一个"年龄"字段,用户可能没填,这时候年龄就是"未知",不是 0)。但普通值类型(如 int)不能设为 null(因为 null是"没有引用对象",而值类型本身就有值)。就可以使用**"可空值类型"**(Nullable Value Types)
使用:int? i = null;
- 普通
int像一个"只能装整数的盒子"(必须装一个数,默认装 0); int?像一个"升级版盒子",既可装整数(比如 5),也可什么都不装(用null表示"空盒")
|--------------|---------------------------|------------------------------------------|
| 特性 | 普通 int(不可空值类型) | int?(可空值类型,即 Nullable<int>) |
| 能否存储 null? | ❌ 不能 (int i = null编译报错) | ✅ 能(int? i = null合法) |
| 默认值 | 0(自动初始化为 0) | null(自动初始化为"没有值") |
| 本质 | 直接存整数 | 内部包含两个成员: HasValue(是否有值)和 Value(值本身) |
2.default关键字
2.1switch语句中的"默认分支"
作用 :当 switch的所有 case都不匹配时,执行 default分支(相当于"其他情况")。
比喻:设计一个"天气活动选择器":
-
晴天 → 去公园
-
雨天 → 在家看书
-
其他天气(阴天、雪天等)→ 用
default分支处理(比如"待定")

class Program
{
static void Main()
{
int weather = 3; // 假设 1=晴,2=雨,3=阴(其他情况)
switch (weather)
{
case 1:
Console.WriteLine("去公园玩");
break;
case 2:
Console.WriteLine("在家看书");
break;
default: // 所有 case 都不匹配时(这里 weather=3),执行这里
Console.WriteLine("天气待定,先宅家");
break;
}
// 输出:天气待定,先宅家
}
}
关键点:
-
default是switch的"保底选项",可以放在任何位置(但通常放最后)。 -
如果所有
case都匹配不到,且没有default,则什么都不执行。
2.2default运算符/文本
作用 :获取任意类型的"默认值"(就像给变量"归零"或"清空")。
先理解"类型的默认值":
-
值类型:默认值是"零值"(比如
int是 0,bool是false,DateTime是0001-01-01) -
引用类型:默认值是
null(空引用,不指向任何对象)
两种写法:
-
default 运算符(显式指定类型):
default(类型名)
例:default(int)→ 0,default(string)→ null -
default 文本(C# 7.1+ 简化写法):直接写
default
例:default等价于default(类型名)(编译器会根据上下文推断类型)// 用 default 运算符获取不同类型默认值
int numDefault = default(int); // 0(int 的默认值)
bool boolDefault = default(bool); // false(bool 的默认值)
string strDefault = default(string); // null(string 是引用类型,默认值 null)
MyClass objDefault = default(MyClass); // null(自定义类的默认值)// 用 default 文本(更简洁,编译器自动推断类型)
int num = default; // 0(推断为 int)
string s = default; // null(推断为 string)
int? nullableInt = default; // null(可空值类型 int? 的默认值也是 null)// 对比:不赋值 vs 用 default(效果一样,但 default 更明确)
int a; // 未赋值,编译器可能警告"未初始化"
int b = default; // 显式赋值为 0(安全,无警告)
关键点:
-
default是"类型安全的归零":不管什么类型,它都能给出正确的默认值(值类型给零值,引用类型给 null)。 -
常用于初始化变量、泛型中获取默认值
2.3泛型方法/接口中的"默认类型值"(default(T))
作用 :在泛型中,当不确定类型 T是值类型还是引用类型时,用 default(T)获取它的默认值(避免硬编码)。
背景 :泛型(如 List<T>)可以存任何类型,但你不知道 T是 int(值类型)还是 string(引用类型),直接写 0或 null可能出错。这时用 default(T)就安全了------它会自动根据 T的类型返回对应默认值。
// 定义一个泛型方法,返回 T 的默认值
public static T GetDefaultValue<T>()
{
return default(T); // 用 default(T) 获取 T 的默认值
}
// 测试:不同类型调用这个方法
int intVal = GetDefaultValue<int>(); // 0(int 的默认值)
MyClass objVal = GetDefaultValue<MyClass>(); // null(自定义类的默认值)
int? nullableVal = GetDefaultValue<int?>(); // null(可空值类型的默认值)
总结:
|-----------------------|-----------------------------|
| 用法场景 | 作用 |
| switch 语句的 default 分支 | 处理"所有 case 都不匹配"的其他情况 |
| default 运算符/文本 | 获取任意类型的默认值(值类型零值,引用类型 null) |
| 泛型中的 default(T) | 在泛型中安全获取类型 T 的默认值 |
学到了这里,咱俩真棒,记得按时吃饭(麻瓜打工,近期真的好忙碌~)
【本篇结束,新的知识会不定时补充】
感谢你的阅读!如果内容有帮助,欢迎 点赞❤️ + 收藏⭐ + 关注 支持! 😊