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,并捕获异常输出错误信息.

相关推荐
十五年专注C++开发17 分钟前
C++中各平台表示Debug的宏
开发语言·c++·debug
张小凡vip25 分钟前
Python异步编程实战:基于async/await的高并发实现
开发语言·python
玩c#的小杜同学41 分钟前
源代码保卫战:给C# 程序(混淆、加壳与反逆向实战)
开发语言·笔记·c#
阿猿收手吧!2 小时前
【C++】Ranges:彻底改变STL编程方式
开发语言·c++
云游云记2 小时前
php 随机红包数生成
开发语言·php·随机红包
程序员林北北2 小时前
【前端进阶之旅】JavaScript 一些常用的简写技巧
开发语言·前端·javascript
gAlAxy...3 小时前
MyBatis-Plus 核心 CRUD 操作全解析:BaseMapper 与通用 Service 实战
java·开发语言·mybatis
开开心心就好3 小时前
一键加密隐藏视频,专属格式播放工具
java·linux·开发语言·网络·人工智能·macos
CUC-MenG4 小时前
Codeforces Round 1079 (Div. 2)A,B,C,D,E1,E2,F个人题解
c语言·开发语言·数学·算法
阿里嘎多学长4 小时前
2026-02-07 GitHub 热点项目精选
开发语言·程序员·github·代码托管