C# 中 default 使用详解

总目录


前言

在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 = 0
            bool boolValue = default; // boolValue = false
            string stringValue = default; // stringValue = null
            Console.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}"); // 返回 0

        GenericExample<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: True

void 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 知识汇总
希望以上内容可以帮助到大家,如文中有不对之处,还请批评指正。


参考资料:
默认值表达式 - 生成默认值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鲤籽鲲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值