编程技术是改变世界的力量。
本站
当前位置:网站首页 > 后端语言 > 正文

C# 11加入检查参数是否为空语法糖

gowuye 2024-05-16 14:20 3 浏览 0 评论

起因

在C# 11中,加入了新的语法糖,在C#加入越来越多的语法,当编程语言加入太多的语法,会导致阅读代码时有些晦涩,不易读,刚开始不知道这个语法是要做什么,这个时候就要去官方文档,看看这个语法的功能是要做什么.

最早看到这个检查参数是否为空的语法是从这几个issue:

  1. Initial roll out of !! (#64720)
  2. Second round of changing null checks to !! (#65108)
  3. Add/use ArgumentException.ThrowIfNullOrEmpty (#64357)

目前新语法在检查参数为空,只能用在方法内的参数和构造方法的参数,对于方法内的参数使用ref和out修饰都是不可以的.

1. 在普通方法,使用新语法校验参数是否为空

public bool Test1(string name)
{
    if (name == null)
    {
        throw new ArgumentNullException(nameof(name));
    }

    //等同于上方 if(name == null) { throw new ArgumentNullException("name");)
    //这种方式可以用在检查属性是否为空
    ArgumentNullException.ThrowIfNull(nameof(name));

    return true;
}

public bool Test2(string name!!)  //新语法, 在参数名加!! 
{
    return true;
}

没有指定C#语言版本,会有提示信息(这里使用的是.Net 7 Preview1,VS版本为2022 17.1.0)

因为C# 11现在还没有发布正式版,所以要在项目工程文件指定语言版本为preview

在VS 2022正式版,没有版本在界面管理器中修改C#语言版本,这里修改项目工程文件(*.csproj)

<PropertyGroup>
	<OutputType>Exe</OutputType>
	<!--指定.Net版本-->
	<TargetFramework>net7.0</TargetFramework>
	<AllowUnsafeBlocks>True</AllowUnsafeBlocks>
	<!--指定c#语言版本为与蓝本(preview)-->
	<LangVersion>preview</LangVersion>
</PropertyGroup>

2.在构造方法中检查参数是否为空

public class CheckParameterNull
{
    public string Address { get; }
    public CheckParameterNull(string address!!) //在构造方法,使用新语法检查参数是否
    {
        Address = address;
    }

    public bool Test1(string name)
    {
        if (name == null)
        {
            throw new ArgumentNullException(nameof(name));
        }

        //等同于上方 if(name == null) { throw new ArgumentNullException("name");)
        //这种方式可以用在检查属性是否为空
        ArgumentNullException.ThrowIfNull(nameof(name));

        return true;
    }

    public bool Test2(string name!!)  //新语法, 在参数名加!! 
    {
        return true;
    }
}

3.使用反编译工具 ILSpy 查看编译后的代码:

public class CheckParameterNull
{
	public string Address { get; }

	public CheckParameterNull(string address)
	{
        //编译器在编译时,会在程序集生成一个隐藏类PrivateImplementationDetails
		<PrivateImplementationDetails>.ThrowIfNull(address, "address");
		base..ctor();
		Address = address;
	}

	public bool Test1(string name)
	{
		if (name == null)
		{
			throw new ArgumentNullException("name");
		}
		ArgumentNullException.ThrowIfNull("name", "nameof(name)");
		return true;
	}

	public bool Test2(string name)
	{
     //编译器在编译时,会在程序集生成一个隐藏类PrivateImplementationDetails
		<PrivateImplementationDetails>.ThrowIfNull(name, "name");
		return true;
	}
}

编译器在编译时,会在当前程序集生成一个隐藏类PrivateImplementationDetails

[CompilerGenerated]
internal sealed class <PrivateImplementationDetails>
{
	internal static void Throw(string paramName)
	{
        //最终还是调用创建一个ArgumentNullException
		throw new ArgumentNullException(paramName);
	}

	internal static void ThrowIfNull(object argument, string paramName)
	{
		if (argument == null)
		{
			Throw(paramName);
		}
	}
}

对于这个新的语法糖,我是支持的,因为这个语法糖是可以提高一些生产力(这一点不是很多),但可以减少代码量,让项目的代码量不至于越来越膨胀.

这个看#65108这个issue:

检查参数为空这个语法,已经在.Net底层核心库使用了

通体是减少代码行数


个人能力有限,如果您发现有什么不对,请私信我

如果您觉得对您有用的话,可以点个赞或者加个关注,欢迎大家一起进行技术交流

相关推荐

R语言数据挖掘实践——支持向量机的常用函数
R语言数据挖掘实践——支持向量机的常用函数

e1071包是R语言中用于支持向量机建模与分析的软件包,其主要用于支持向量机的模型构建,提供核心函数svm()来建立支持向量机的基础模型,并且可辅助使用pred...

2024-05-18 12:15 gowuye

R数据分析:如何做聚类分析,实操解析
R数据分析:如何做聚类分析,实操解析

Clusteringisabroadsetoftechniquesforfindingsubgroupsofobservationswi...

2024-05-18 12:14 gowuye

用R语言做数据分析——马赛克图
用R语言做数据分析——马赛克图

到目前为止,我们已经学习了许多可视化定量或连续型变量间关系的方法。但如果变量是类别型的呢?若只观察单个类别型变量,可以使用柱状图或者饼图;若存在两个类别型变量,...

2024-05-18 12:14 gowuye

用R语言做数据分析——方差分析基本概论
用R语言做数据分析——方差分析基本概论

在实际工作中,影响一件事的因素是很多的,我们总是希望通过各种试验来观察各种因素对试验结果的影响。例如,不同的生产厂家、不同的原材料、不同的操作规程,以及不同的技...

2024-05-18 12:14 gowuye

R语言数据分析实战:数据清洗与可视化
R语言数据分析实战:数据清洗与可视化

《R语言数据分析实战:数据清洗与可视化》是一本深入浅出的实践指南,专为对数据分析感兴趣的读者精心编撰。本书旨在帮助读者掌握R语言这一强大的统计分析工具,通过实例...

2024-05-18 12:13 gowuye

用R语言做数据分析——双因素方差分析
用R语言做数据分析——双因素方差分析

在双因素方差分析中,受试者被分配到两因子的交叉类别组中。以基础安装中的Tooth-Growth数据集为例,随机分配60只豚鼠,分别采用两种喂食方法(橙汁或维生素...

2024-05-18 12:13 gowuye

用R语言做数据分析——独立两样本和K样本检验
用R语言做数据分析——独立两样本和K样本检验

coin包简介对于独立性问题,coin包提供了一个进行置换检验的一般性框架,通过这个包,我们可以回答如下问题:响应值与组的分配独立吗?两个数值变量独立吗?两个类...

2024-05-18 12:13 gowuye

用R语言做数据分析——用回归做方差分析
用R语言做数据分析——用回归做方差分析

之前提到方差分析和回归都是广义线性模型的特例,之前文章的所有设计都可以用lm()函数来分析。为了更好地理解输出结果,需要弄明白在拟合模型时,R语言是如何处理类别...

2024-05-18 12:13 gowuye

数据分析R语言——数据结构
数据分析R语言——数据结构

数据分析R语言——数据结构数组数组(array)与矩阵类似,但是维度可以大于2.数组通过array()函数创建。形式如;myarray<-array(v...

2024-05-18 12:13 gowuye

R语言数据挖掘实践——关联分析的常用函数
R语言数据挖掘实践——关联分析的常用函数

arules和arulesViz是R语言中两个专用于关联分析的软件包。其中arules用于关联规则的数字化生成,提供Apriori和Eclat这两种快速挖掘频繁...

2024-05-18 12:12 gowuye

R语言数据挖掘实践——判别分析的常用函数
R语言数据挖掘实践——判别分析的常用函数

判别算法在R语言中实现主要涉及4个软件包中的相关函数,它们依次为MASS、klaR、class和kknn。其中MASS包含有大量实用而先进的统计计数函数及适用数...

2024-05-18 12:12 gowuye

用R语言读取Excel、PDF和JSON文件,终于有人讲明白了
用R语言读取Excel、PDF和JSON文件,终于有人讲明白了

导读:本文将讨论Excel、PDF等文件的读取,以及相应函数的参数设置。作者:刘健邬书豪如需转载请联系华章科技下图总结了主要程序包,希望读者在日常练习和工作中...

2024-05-18 12:12 gowuye

R语言数据挖掘实践——聚类分析的常用函数
R语言数据挖掘实践——聚类分析的常用函数

使用R语言可以轻松实现聚类分析,stats、cluster、fpc和mclust是常用的四个聚类分析软件包。stats主要包含一些基本的统计函数,如用于统计计算...

2024-05-18 12:12 gowuye

用R语言做数据分析——时间序列分类
用R语言做数据分析——时间序列分类

时间序列分类是根据已标注的时间序列建立一个分类模型,然后使用分类模型预测未标记时间序列的类别。从时间序列中抽取出新特征肯呢个有助于提高分类模型的性能。特征提取技...

2024-05-18 12:11 gowuye

一文看懂用R语言读取Excel、PDF和JSON文件(附代码)
一文看懂用R语言读取Excel、PDF和JSON文件(附代码)

导读:本文将讨论Excel、PDF等文件的读取,以及相应函数的参数设置。作者:刘健邬书豪如需转载请联系华章科技下图总结了主要程序包,希望读者在日常练习和工作中...

2024-05-18 12:11 gowuye

取消回复欢迎 发表评论: