C#泛型中的default关键字:为值类型与引用类型赋予默认值

在C#中,default关键字用于指定泛型类型参数的默认值。这个值通常是该类型的零值。

  • 值类型:对于值类型(如int、double等),default关键字会返回该类型的零值。例如,对于int类型,default(int)的值是0。
  • 引用类型:对于引用类型(如类、字符串等),default关键字会返回null。

结构体示例

下面是一个使用泛型方法的示例:

csharp 复制代码
using System;
public struct Point
{
    public int X { get; set; }
    public int Y { get; set; }

    public Point(int x, int y)
    {
        X = x;
        Y = y;
    }
    // 重写ToString方法以便于输出
    public override readonly string ToString()
    {
        return $"({X}, {Y})";
    }
}
class Program
{
	// 泛型方法,返回类型参数T的默认值
	public static T? GetDefault<T>() => default;
	static void Main()
	{
	    /// 获取int类型的默认值
        int defaultValueInt = GetDefault<int>();
        Console.WriteLine($"int的默认值: {defaultValueInt}");

        // 获取string类型的默认值
        string? defaultValueString = GetDefault<string>();
        Console.WriteLine($"string的默认值: {defaultValueString}");

        // 获取Point结构体的默认值
        Point defaultValuePoint = GetDefault<Point>();
        Console.WriteLine($"Point结构体的默认值: {defaultValuePoint}");
	}
}

运行结果:

上面的示例定义了一个简单的结构体Point,包含两个整数属性X和Y。

重写了ToString方法,以便于在控制台输出时能够显示点的坐标

还定义了一个泛型方法GetDefault,这个方法接受一个泛型类型参数T,并返回该类型的默认值

使用default(T)来获取类型T的默认值,示例中使用了语法糖简化代码。

调用GetDefault()获取int类型的默认值,并输出到控制台,结果是0

调用GetDefault()获取string类型的默认值,并输出到控制台,结果是null

调用GetDefault()获取Point结构体的默认值,并输出到控制台,结果是(0, 0),因为结构体的默认值是使用字段的默认值来初始化

对于引用类型,default的值通常是null。这是因为引用类型的变量在没有显式初始化时,默认指向null,表示没有引用任何对象。

引用示例

下面是一个示例,演示如何在引用类型中使用default关键字:

csharp 复制代码
using System;

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }

    public Person(string name, int age)
    {
        Name = name;
        Age = age;
    }

    public override string ToString()
    {
        return $"姓名: {Name}, 年龄: {Age}";
    }
}

public class Program
{
    // 泛型方法,返回类型参数T的默认值
    public static T? GetDefault<T>()
    {
        return default;
    }

    static void Main()
    {
        // 获取string类型的默认值
        string? defaultValueString = GetDefault<string>();
        Console.WriteLine($"string默认值: {defaultValueString}");

        // 获取Person类型的默认值
        Person? defaultValuePerson = GetDefault<Person>();
        Console.WriteLine($"Person默认值: {defaultValuePerson}");

        // 尝试输出Person的属性(会引发空引用异常)
        try
        {
#pragma warning disable CS8602 // 解引用可能出现空引用。
            Console.WriteLine($"姓名: {defaultValuePerson.Name}");
#pragma warning restore CS8602 // 解引用可能出现空引用。
        }
        catch (NullReferenceException ex)
        {
            Console.WriteLine($"抓到一个异常: {ex.Message}");
        }
    }
}

运行结果:

示例中定义了一个简单的Person类,包含NameAge属性,并重写了ToString方法,以便于在控制台输出时能够清晰地显示对象的信息

定义了泛型方法GetDefault<T> ,这个方法接受一个泛型类型参数T,并返回该类型的默认值,使用default(T)来获取类型T的默认值,用了语法糖,简化代码。

主程序中调用GetDefault<string>()获取string类型的默认值,并输出到控制台,结果是null,调用GetDefault<Person>()获取Person类型的默认值,并输出到控制台,结果是null,尝试输出Person对象的Name属性,由于对象是null,会引发NullReferenceException,并捕获异常输出错误信息.

相关推荐
FreeGo~2 分钟前
手撕C++】内存管理:感受C++的魅力吧
开发语言·c++
m0_640309302 分钟前
解决 Python 报错:ModuleNotFoundError: No module named ‘pkg_resources’
开发语言·python
编码浪子6 分钟前
Rust 1.95 稳定版解读与生态新动向
开发语言·后端·rust
asdzx678 分钟前
告别手动校对:使用 Python 对比两个 PDF 文档的差异
开发语言·python·pdf
Rust研习社10 分钟前
Rust 操作 Redis 从入门到生产级应用
开发语言·redis·后端·rust
xyq202418 分钟前
Memcached stats items 命令详解
开发语言
Evand J19 分钟前
【MATLAB例程】多传感器协同DOA目标跟踪与EKF滤波,输出动态目标轨迹、轨迹误差对比分析
开发语言·matlab·目标跟踪·滤波·定位·导航
csbysj202020 分钟前
《jEasyUI 自定义分页》
开发语言
puamac21 分钟前
UcTabWindow 布局多tab,加载编辑器和资源管理器等自定义控件
c#·编辑器·datagridview
初心未改HD22 分钟前
Go语言Context深度解析与工程实践
开发语言·golang