default 关键字对值类型返回其字段初始化的零值(如 int 为 0,bool 为 false),对引用类型则返回 null。在 c# 2.0 及以上版本中,该关键字支持泛型,能根据类型参数 t 自动推断并生成正确的默认值,无需针对每种类型编写单独的初始化逻辑。

default 对具体值类型的实际表现是什么
对于非泛型的值类型,default 会创建一个实例并将所有字段设为其对应的默认值。例如 int 变为 0,double 变为 0.0,结构体中的所有字段也会递归地变为各自的默认值。这种行为与调用无参构造函数或 new() 的效果一致,但语法更简洁且适用于所有值类型。

using System;
class Program {
static void Main() {
int i = default(int);
double d = default(double);
bool b = default(bool);
Console.WriteLine($"Int: {i}, Double: {d}, Bool: {b}");
}
}
default 对引用类型的实际表现是什么
对于类、数组、委托等引用类型,default 始终返回 null。这意味着变量被声明但未赋值时,如果它是引用类型,其状态等同于显式赋值为 null。这在处理可能为空的集合或对象时非常有用,可以明确区分“未设置”和“空集合/空对象”的状态。

using System;
class MyClass { public string Name; }
class Program {
static void Main() {
MyClass obj = default(MyClass);
string str = default(string);
Console.WriteLine(obj == null); // True
Console.WriteLine(str == null); // True
}
}
泛型中 default(T) 的行为差异
在泛型代码中,default(T) 是最常用的场景。编译器会根据传入的类型参数 T 决定返回值。如果 T 是值类型,它返回零值;如果 T 是引用类型,它返回 null。这种机制允许编写通用的初始化逻辑,而无需在编译期知道具体的类型。需要注意的是,如果希望强制要求 T 为引用类型并初始化为 null,可以使用 where T : class 约束,此时 default(T) 依然有效,但语义上更明确。
using System;
class GenericHelper<t> {
public T GetDefault() {
return default(T);
}
}
class Program {
static void Main() {
var helperInt = new GenericHelper<int>();
var helperStr = new GenericHelper<string>();
Console.WriteLine(helperInt.GetDefault()); // 0
Console.WriteLine(helperStr.GetDefault() == null); // True
}
}</string></int></t>











