当前位置: 首页 > news >正文

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


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

相关文章:

C# 中 default 使用详解

总目录 前言 在C#中&#xff0c;default 关键字用于表示类型默认值。它可以根据上下文推断出适用的类型&#xff0c;并返回该类型的默认值。随着C#版本的发展&#xff0c;default 的用法也变得更加丰富和灵活。本文将详细介绍 default 在不同场景下的使用方法及其最佳实践。 一…...

Day21-【软考】短文,计算机网络开篇,OSI七层模型有哪些协议?

文章目录 OSI七层模型有哪些&#xff1f;有哪些协议簇&#xff1f;TCP/IP协议簇中的TCP协议三次握手是怎样的&#xff1f;基于UDP的DHCP协议是什么情况&#xff1f;基于UDP的DNS协议是什么情况&#xff1f; OSI七层模型有哪些&#xff1f; 题目会考广播域 有哪些协议簇&#x…...

电力晶体管(GTR)全控性器件

电力晶体管&#xff08;Giant Transistor&#xff0c;GTR&#xff09;是一种全控性器件&#xff0c;以下是关于它的详细介绍&#xff1a;&#xff08;模电普通晶体管三极管进行对比学习&#xff09; 基本概念 GTR是一种耐高电压、大电流的双极结型晶体管&#xff08;BJT&am…...

C语言------指针从入门到精通

第一部分: 前言: 本篇文章主要划分为两大部分: 第一部分适合零基础的同学,主要学习了解指针的概念&#xff0c;对指针大概有个概念。如果你已经有基础,即可跳过第一部分的内容。 第二部分主要是分解指针的实现逻辑,通过19个例子,再结合代码公式把不同类型的指针及指针的应用详细…...

网络安全大模型和人工智能场景及应用理解

本文通过通俗易懂的方式的进行阐述&#xff0c;大家读完觉得有帮助记得及时关注和点赞&#xff01;&#xff01;&#xff01; 一、网络安全大模型的概述 网络安全大模型是一种用于识别和应对各种网络安全威胁的模型。它通过分析网络数据包、网络行为等信息&#xff0c;识别潜在…...

大模型正确调用方式

1、ollama 安装 curl -fsSL https://ollama.com/install.sh | sh 如果是AutoDl服务器&#xff0c;可以开启学术加速。 source /etc/network_turbo 本次使用腾讯云Cloud Studio&#xff0c;所以已经安装好了 Ollama 2、启动 ollama run 模型的名字 ollama serve # 开启服务 olla…...

rocketmq原理源码分析之控制器模式- dledger

简介 RocketMQ 4.5 版本之前&#xff0c;RocketMQ 的broker是 Master/Slave部署架构&#xff0c;一组 broker 有一个 Master &#xff0c;有0到若干Slave&#xff0c;Slave复制Master消息存储&#xff0c;随时替代下线的Master。Master/Slave部署架构提供一定的高可用性&#x…...

Deployment 部署 Pod 流程

文章目录 k8s组件介绍部署文件示例部署 Pod 流程创建 Service 通过创建 Deployment 资源&#xff0c;来看看 k8s 部署 Pod 流程 k8s组件介绍 首先看看 k8s 各组件功能。 control plane 控制平面主要包含以下组件&#xff1a; kube-api-server: 顾名思义&#xff0c;负责处理所…...

塔罗牌(基础):大阿卡那牌

塔罗牌&#xff08;基础&#xff09; 大啊卡那牌魔术师女祭司皇后皇帝教皇恋人战车力量隐士命运之轮正义吊人死神节制恶魔高塔星星月亮太阳审判世界 大啊卡那牌 魔术师 作为一个起点&#xff0c;象征&#xff1a;意识行动和创造力。 一个【显化】的概念&#xff0c;即是想法变…...

TCP/IP 协议:互联网通信的基石

TCP/IP 协议:互联网通信的基石 引言 TCP/IP协议,全称为传输控制协议/互联网协议,是互联网上应用最为广泛的通信协议。它定义了数据如何在网络上传输,是构建现代互联网的基础。本文将深入探讨TCP/IP协议的原理、结构、应用以及其在互联网通信中的重要性。 TCP/IP 协议概述…...

Python 之 Excel 表格常用操作

示例文件 test.xlsx 将各个表单拆分成单独的 Excel 文件 import os.pathimport openpyxl import pandasdef handle_excel(file_path):dirname os.path.dirname(file_path)basename os.path.basename(file_path).split(".")[0]wb openpyxl.load_workbook(file_pat…...

2025春招 SpringCloud 面试题汇总

大家好&#xff0c;我是 V 哥。SpringCloud 在面试中属于重灾区&#xff0c;不仅是基础概念、组件细节&#xff0c;还有高级特性、性能优化&#xff0c;关键是项目实践经验的解决方案&#xff0c;都是需要掌握的内容&#xff0c;正所谓打有准备的仗&#xff0c;秒杀面试官&…...

jupyter版本所引起的扩展插件问题

文章目录 如何永久切换python安装源为https://mirrors.aliyun.com/pypi/simple方法一&#xff1a;通过配置文件永久设置&#xff08;推荐&#xff09;步骤 1&#xff1a;创建或修改 pip 配置文件步骤 2&#xff1a;验证配置是否生效 方法二&#xff1a;通过命令行直接配置效果验…...

01机器学习入门

机器学习入门可以分为以下几个阶段&#xff0c;逐步掌握核心概念和技能&#xff1a; 1. 基础准备 数学基础 线性代数&#xff1a;矩阵运算、向量空间&#xff08;推荐《线性代数及其应用》&#xff09;。概率与统计&#xff1a;概率分布、贝叶斯定理、假设检验&#xff08;推…...

实现一个安全且高效的图片上传接口:使用ASP.NET Core和SHA256哈希

实现一个安全且高效的图片上传接口&#xff1a;使用ASP.NET Core和SHA256哈希 在现代Web应用程序中&#xff0c;图片上传功能是常见的需求之一。无论是用户头像、产品图片还是文档附件&#xff0c;确保文件上传的安全性和效率至关重要。本文将详细介绍如何使用ASP.NET Core构建…...

PyTorch中的movedim、transpose与permute

在PyTorch中&#xff0c;movedim、transpose 和 permute这三个操作都可以用来重新排列张量&#xff08;tensor&#xff09;的维度&#xff0c;它们功能相似却又有所不同。 movedim &#x1f517; torch.movedim 用途&#xff1a;将张量的一个或多个维度移动到新的位置。参数&…...

HTTP(1)

HTTP协议 HTTP是什么 HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的基于TCP协议的应用层协议。 常见的应用场景&#xff1a; 浏览器与服务器之间的交互&#xff08;访问网站&#xff09;手机与服务器之间的通信多个服务器之间进行通信 …...

C#常考随笔2:函数中多次使用string的+=处理,为什么会产生大量内存垃圾(垃圾碎片),有什么好的方法可以解决?

在 C# 中&#xff0c;由于string类型是不可变的&#xff0c;当在函数中多次使用操作符来拼接字符串时&#xff0c;每次操作都会创建一个新的string对象&#xff0c;旧的对象则成为垃圾对象&#xff0c;这会导致大量的内存分配和垃圾回收&#xff0c;产生内存垃圾和碎片。 在需…...

leetcode刷题记录(一百)——121. 买卖股票的最佳时机

&#xff08;一&#xff09;问题描述 121. 买卖股票的最佳时机 - 力扣&#xff08;LeetCode&#xff09;121. 买卖股票的最佳时机 - 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票&#xff0c;并…...

MATLAB绘图时线段颜色、数据点形状与颜色等设置,介绍

MATLAB在绘图时&#xff0c;设置线段颜色和数据点的形状与颜色是提高图形可读性与美观性的重要手段。本文将详细介绍如何在 MATLAB 中设置这些属性。 文章目录 线段颜色设置单字母颜色表示法RGB 值表示法 数据点的形状与颜色设置设置数据点颜色和形状示例代码 运行结果小结 线段…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

自然语言处理——循环神经网络

自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元&#xff08;GRU&#xff09;长短期记忆神经网络&#xff08;LSTM&#xff09…...

SpringTask-03.入门案例

一.入门案例 启动类&#xff1a; package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程&#xff1a;如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket&#xff08;服务端和客户端都要&#xff09;2. 绑定本地地址和端口&#x…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)

推荐 github 项目:GeminiImageApp(图片生成方向&#xff0c;可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

上位机开发过程中的设计模式体会(1):工厂方法模式、单例模式和生成器模式

简介 在我的 QT/C 开发工作中&#xff0c;合理运用设计模式极大地提高了代码的可维护性和可扩展性。本文将分享我在实际项目中应用的三种创造型模式&#xff1a;工厂方法模式、单例模式和生成器模式。 1. 工厂模式 (Factory Pattern) 应用场景 在我的 QT 项目中曾经有一个需…...