总目录
前言
在C#中,default 关键字用于表示类型默认值。它可以根据上下文推断出适用的类型,并返回该类型的默认值。随着C#版本的发展,default 的用法也变得更加丰富和灵活。本文将详细介绍 default 在不同场景下的使用方法及其最佳实践。
一、default 获取类型的默认值
1. 语法与作用
可以使用 default 关键字来获取任意类型的默认值。
值类型(如 int, double, struct 等):返回 类型的零值或空值。
- int 默认为 0
- bool 默认为 false
- 结构体的所有字段都被初始化为其默认值
引用类型(如 string, class, interface 等):默认为 null
这在初始化变量或者为方法参数提供默认值时非常有用。
2. 示例代码
internal class Program{public static void Main(){// 获取 int 类型的默认值int intDefault = default(int);Console.WriteLine($"int 默认值: {intDefault}"); //int 默认值: 0// 获取 bool 类型的默认值bool boolDefault = default(bool);Console.WriteLine($"bool 默认值: {boolDefault}"); //bool 默认值: False// 获取自定义类的默认值MyClass classDefault = default(MyClass);Console.WriteLine($"MyClass 默认值: {classDefault}"); // MyClass 默认值:// C# 7.1 及以后版本可省略类型int intValue = default; // intValue = 0bool boolValue = default; // boolValue = falsestring stringValue = default; // stringValue = nullConsole.WriteLine($"string 默认值: {stringValue}"); //string 默认值:}}class MyClass { }
代码解释
- default(int) 返回 int 类型的默认值 0。
- default(bool) 返回 bool 类型的默认值 false。
- default(MyClass) 返回自定义类 MyClass 的默认值 null。
- 在 C# 7.1 及以后版本中,可以省略类型直接使用 default 来初始化变量,如
string stringValue = default;
。
二、default 在泛型中的应用
1. 语法与作用
在泛型方法或类中,当需要给泛型类型的变量赋默认值时,default 关键字非常有用。因为在泛型代码中,无法提前知道具体的类型,使用 default 可以确保无论泛型类型是值类型还是引用类型,都能正确地赋予默认值。
2. 示例代码
using System;class GenericExample<T>
{public T GetDefaultValue(){return default(T);}
}class Program
{static void Main(){GenericExample<int> intExample = new GenericExample<int>();int intResult = intExample.GetDefaultValue();Console.WriteLine($"int 泛型默认值: {intResult}"); // 返回 0GenericExample<string> stringExample = new GenericExample<string>();string stringResult = stringExample.GetDefaultValue();Console.WriteLine($"string 泛型默认值: {stringResult}"); // 返回 null}
}
从 C# 7.1 开始,可以直接使用 default 而不带括号来简化语法:
class GenericExample<T>
{public T GetDefaultValue(){return default;}
}
三、default 在 switch 语句中的使用
1. 语法与作用
在 switch 语句中,default 标签用于处理所有未被其他 case 标签匹配的情况。它类似于 if-else 语句中的 else 分支,确保 switch 语句能够处理所有可能的输入。
2. 示例代码
using System;class Program
{static void Main(){int number = 3;switch (number){case 1:Console.WriteLine("数字是 1");break;case 2:Console.WriteLine("数字是 2");break;default:Console.WriteLine("数字不是 1 也不是 2");break;}}
}
四、default 其他应用
1. 可空类型
对于可空类型(例如 int?),default 返回的是 null 而不是基础类型的默认值。
int? nullableInt = default; // nullableInt = null
DateTime? nullableDate = default; // nullableDate = null
2. 初始化集合
在初始化集合(如数组、列表等)时,default 可以用来填充元素的默认值。
int[] numbers = new int[5] { default, default, default, default, default }; // 全部元素为 0
List<string> strings = new List<string>(new string[3] { default, default, default }); // 全部元素为 null
3. 异步编程
在异步方法中,default 可以用来处理任务完成前的状态。例如,你可以用它来表示尚未开始的任务或取消的任务。
Task<int> task = default(Task<int>);
//Task<int> task = default;
if (task == null)
{Console.WriteLine("Task has not been initialized.");
}
五、default 运算符与 default 文本
1. default 运算符
default 运算符的实参必须是类型或类型形参的名称,如以下示例所示:
Console.WriteLine(default(int)); // output: 0
Console.WriteLine(default(object) is null); // output: Truevoid DisplayDefaultOf<T>()
{var val = default(T);Console.WriteLine($"Default value of {typeof(T)} is {(val == null ? "null" : val.ToString())}.");
}DisplayDefaultOf<int?>();
DisplayDefaultOf<System.Numerics.Complex>();
DisplayDefaultOf<System.Collections.Generic.List<int>>();
// Output:
// Default value of System.Nullable`1[System.Int32] is null.
// Default value of System.Numerics.Complex is (0, 0).
// Default value of System.Collections.Generic.List`1[System.Int32] is null.
2. default 文本
当编译器可以推断表达式类型时,可以使用 default 文本生成类型的默认值。 default 文本表达式生成与 default(T) 表达式(其中,T 是推断的类型)相同的值。 可以在以下任一情况下使用 default 文本:
- 对变量进行赋值或初始化时。
- 在声明可选方法参数的默认值时。
- 在方法调用中提供参数值时。
- 在 return 语句中或作为表达式主体成员中的表达式时。
T[] InitializeArray<T>(int length, T initialValue = default)
{if (length < 0){throw new ArgumentOutOfRangeException(nameof(length), "Array length must be nonnegative.");}var array = new T[length];for (var i = 0; i < length; i++){array[i] = initialValue;}return array;
}void Display<T>(T[] values) => Console.WriteLine($"[ {string.Join(", ", values)} ]");Display(InitializeArray<int>(3)); // output: [ 0, 0, 0 ]
Display(InitializeArray<bool>(4, default)); // output: [ False, False, False, False ]System.Numerics.Complex fillValue = default;
Display(InitializeArray(3, fillValue)); // output: [ (0, 0), (0, 0), (0, 0) ]
结语
回到目录页:C#/.NET 知识汇总
希望以上内容可以帮助到大家,如文中有不对之处,还请批评指正。
参考资料:
默认值表达式 - 生成默认值