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

Day21-【软考】短文,计算机网络开篇,OSI七层模型有哪些协议?
文章目录 OSI七层模型有哪些?有哪些协议簇?TCP/IP协议簇中的TCP协议三次握手是怎样的?基于UDP的DHCP协议是什么情况?基于UDP的DNS协议是什么情况? OSI七层模型有哪些? 题目会考广播域 有哪些协议簇&#x…...

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

C语言------指针从入门到精通
第一部分: 前言: 本篇文章主要划分为两大部分: 第一部分适合零基础的同学,主要学习了解指针的概念,对指针大概有个概念。如果你已经有基础,即可跳过第一部分的内容。 第二部分主要是分解指针的实现逻辑,通过19个例子,再结合代码公式把不同类型的指针及指针的应用详细…...
网络安全大模型和人工智能场景及应用理解
本文通过通俗易懂的方式的进行阐述,大家读完觉得有帮助记得及时关注和点赞!!! 一、网络安全大模型的概述 网络安全大模型是一种用于识别和应对各种网络安全威胁的模型。它通过分析网络数据包、网络行为等信息,识别潜在…...

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

rocketmq原理源码分析之控制器模式- dledger
简介 RocketMQ 4.5 版本之前,RocketMQ 的broker是 Master/Slave部署架构,一组 broker 有一个 Master ,有0到若干Slave,Slave复制Master消息存储,随时替代下线的Master。Master/Slave部署架构提供一定的高可用性&#x…...

Deployment 部署 Pod 流程
文章目录 k8s组件介绍部署文件示例部署 Pod 流程创建 Service 通过创建 Deployment 资源,来看看 k8s 部署 Pod 流程 k8s组件介绍 首先看看 k8s 各组件功能。 control plane 控制平面主要包含以下组件: kube-api-server: 顾名思义,负责处理所…...
塔罗牌(基础):大阿卡那牌
塔罗牌(基础) 大啊卡那牌魔术师女祭司皇后皇帝教皇恋人战车力量隐士命运之轮正义吊人死神节制恶魔高塔星星月亮太阳审判世界 大啊卡那牌 魔术师 作为一个起点,象征:意识行动和创造力。 一个【显化】的概念,即是想法变…...
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 面试题汇总
大家好,我是 V 哥。SpringCloud 在面试中属于重灾区,不仅是基础概念、组件细节,还有高级特性、性能优化,关键是项目实践经验的解决方案,都是需要掌握的内容,正所谓打有准备的仗,秒杀面试官&…...

jupyter版本所引起的扩展插件问题
文章目录 如何永久切换python安装源为https://mirrors.aliyun.com/pypi/simple方法一:通过配置文件永久设置(推荐)步骤 1:创建或修改 pip 配置文件步骤 2:验证配置是否生效 方法二:通过命令行直接配置效果验…...
01机器学习入门
机器学习入门可以分为以下几个阶段,逐步掌握核心概念和技能: 1. 基础准备 数学基础 线性代数:矩阵运算、向量空间(推荐《线性代数及其应用》)。概率与统计:概率分布、贝叶斯定理、假设检验(推…...
实现一个安全且高效的图片上传接口:使用ASP.NET Core和SHA256哈希
实现一个安全且高效的图片上传接口:使用ASP.NET Core和SHA256哈希 在现代Web应用程序中,图片上传功能是常见的需求之一。无论是用户头像、产品图片还是文档附件,确保文件上传的安全性和效率至关重要。本文将详细介绍如何使用ASP.NET Core构建…...
PyTorch中的movedim、transpose与permute
在PyTorch中,movedim、transpose 和 permute这三个操作都可以用来重新排列张量(tensor)的维度,它们功能相似却又有所不同。 movedim 🔗 torch.movedim 用途:将张量的一个或多个维度移动到新的位置。参数&…...

HTTP(1)
HTTP协议 HTTP是什么 HTTP(全称为"超文本传输协议")是一种应用非常广泛的基于TCP协议的应用层协议。 常见的应用场景: 浏览器与服务器之间的交互(访问网站)手机与服务器之间的通信多个服务器之间进行通信 …...
C#常考随笔2:函数中多次使用string的+=处理,为什么会产生大量内存垃圾(垃圾碎片),有什么好的方法可以解决?
在 C# 中,由于string类型是不可变的,当在函数中多次使用操作符来拼接字符串时,每次操作都会创建一个新的string对象,旧的对象则成为垃圾对象,这会导致大量的内存分配和垃圾回收,产生内存垃圾和碎片。 在需…...

leetcode刷题记录(一百)——121. 买卖股票的最佳时机
(一)问题描述 121. 买卖股票的最佳时机 - 力扣(LeetCode)121. 买卖股票的最佳时机 - 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票,并…...

MATLAB绘图时线段颜色、数据点形状与颜色等设置,介绍
MATLAB在绘图时,设置线段颜色和数据点的形状与颜色是提高图形可读性与美观性的重要手段。本文将详细介绍如何在 MATLAB 中设置这些属性。 文章目录 线段颜色设置单字母颜色表示法RGB 值表示法 数据点的形状与颜色设置设置数据点颜色和形状示例代码 运行结果小结 线段…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...

让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...

大模型——基于Docker+DeepSeek+Dify :搭建企业级本地私有化知识库超详细教程
基于Docker+DeepSeek+Dify :搭建企业级本地私有化知识库超详细教程 下载安装Docker Docker官网:https://www.docker.com/ 自定义Docker安装路径 Docker默认安装在C盘,大小大概2.9G,做这行最忌讳的就是安装软件全装C盘,所以我调整了下安装路径。 新建安装目录:E:\MyS…...

【Qt】控件 QWidget
控件 QWidget 一. 控件概述二. QWidget 的核心属性可用状态:enabled几何:geometrywindows frame 窗口框架的影响 窗口标题:windowTitle窗口图标:windowIconqrc 机制 窗口不透明度:windowOpacity光标:cursor…...

Heygem50系显卡合成的视频声音杂音模糊解决方案
如果你在使用50系显卡有杂音的情况,可能还是官方适配问题,可以使用以下方案进行解决: 方案一:剪映替换音色(简单适合普通玩家) 使用剪映换音色即可,口型还是对上的,没有剪映vip的&…...

分布式光纤声振传感技术原理与瑞利散射机制解析
分布式光纤传感技术(Distributed Fiber Optic Sensing,简称DFOS)作为近年来迅速发展的新型感知手段,已广泛应用于边界安防、油气管道监测、结构健康诊断、地震探测等领域。其子类技术——分布式光纤声振传感(Distribut…...