作者:依乐祝

首发自:DotNetCore实战 公众号

https://www.cnblogs.com/yilezhu/p/14177595.html

Null值检查应该算是开发中最常见且烦人的工作了吧,有人反对吗?反对的话请右上角关门不送。这篇文章就教大家一招来简化这个烦人又不可避免的工作。

罗嗦话不多说,先看下面一段简单的不能再简单的null值判断代码:

public void DoSomething(string message)
{
if(message == null)
throw new ArgumentNullException(); // ...
}

方法体的每个参数都将用if语句进行检查,并逐个抛出 ArgumentNullException 的异常。

关注我的朋友,应该看过我上篇《一个小技巧助您减少if语句的状态判断》的文章,它也是简化Null值判断的一种方式。简化后可以如下所示:


public void DoSomething(string message)
{
Assert.That<ArgumentNullException>(message == null, nameof(DoSomething));
// ...
}

但是还是很差强人意。



**

NotNullAttribute

这里你可能想到了 _System.Diagnostics.CodeAnalysis_ 命名空间下的这个 [NotNull] 特性。这不会在运行时检查任何内容。它只适用于CodeAnalysis,并在编译时而不是在运行时发出警告或错误!

public void DoSomething([NotNull]string message) // Does not affect anything at runtime.
{
} public void AnotherMethod()
{
DoSomething(null); // MsBuild doesn't allow to build.
string parameter = null;
DoSomething(parameter); // MsBuild allows build. But nothing happend at runtime.
}

自定义解决方案

这里我们将去掉用于Null检查的if语句。如何处理csharp中方法参数的赋值?答案是你不能!. 但你可以使用另一种方法来处理隐式运算符的赋值。让我们创建 NotNull<T> 类并定义一个隐式运算符,然后我们可以处理赋值。

public class NotNull<T>
{
public NotNull(T value)
{
this.Value = value;
} public T Value { get; set; } public static implicit operator NotNull<T>(T value)
{
if (value == null)
throw new ArgumentNullException();
return new NotNull<T>(value);
}
}

现在我们可以使用NotNull对象作为方法参数.

static void Main(string[] args)
{
DoSomething("Hello World!"); // Works perfectly DoSomething(null); // Throws ArgumentNullException at runtime. string parameter = null;
DoSomething(parameter); // Throws ArgumentNullException at runtime.
} public static void DoSomething(NotNull<string> message) // <--- NotNull is used here
{
Console.WriteLine(message.Value);
}

如您所见, DoSomething() 方法的代码比以前更简洁。也可以将NotNull类与任何类型一起使用,如下所示:

public void DoSomething(NotNull<string> message, NotNull<int> id, NotNull<Product> product)
{
// ...
}

感谢您的阅读,我们下篇文章见,我是依乐祝,我为合肥.NET技术社区“带盐”~

参考自:https://enisn.medium.com/never-null-check-again-in-c-bd5aae27a48e

C#中烦人的Null值判断竟然这样就被消灭了的更多相关文章

  1. .NET Core 处理 WebAPI JSON 返回烦人的null为空

    前言 项目开发中不管是前台还是后台都会遇到烦人的null,数据库表中字段允许空值,则代码实体类中对应的字段类型为可空类型Nullable<>,如int?,DateTime?,null值字段 ...

  2. 【转】【Stackoverflow好问题】去掉烦人的“!=null"(判空语句)

    [Stackoverflow好问题]去掉烦人的“!=null"(判空语句) 问题 为了避免空指针调用,我们经常会看到这样的语句   ...if (someobject != null) { ...

  3. 使用call、apply和bind解决js中烦人的this,事件绑定时的this和传参问题

    1.什么是this 在JavaScript中this可以是全局对象.当前对象或者任意对象,这完全取决于函数的调用方式,this 绑定的对象即函数执行的上下文环境(context). 为了帮助理解,让我 ...

  4. coalesce函数-返回参数中第一个非null值

    coalesce函数-返回参数中第一个非null值 学习了:http://www.cnblogs.com/zc_0101/archive/2009/08/11/1543650.html 这个要复杂一些 ...

  5. SpringBoot中使用Jackson将null值转化为""或者不返回的配置

    第一种方式:SpringBoot中使用Jackson将null值转化为"" 前言:在实际项目中难免会遇到null值的出现,但是我们转json时并不希望出现NULL值,而是将NULL ...

  6. mysql 允许在唯一索引的字段中出现多个null值

    线上问题:org.springframework.dao.DuplicateKeyException: PreparedStatementCallback; SQL [update fl_table ...

  7. MySQL中的case when 中对于NULL值判断的坑

    sql中的case when 有点类似于Java中的switch语句,比较灵活,但是在Mysql中对于Null的处理有点特殊 Mysql中case when语法: 语法1: CASE case_val ...

  8. 烦人的Null,你可以走开点了

    1. Null 的问题 假设现在有一个需要三个参数的方法.其中第一个参数是必须的,后两个参数是可有可无的. 第一种情况,在我们调用这个方法的时候,我们只能传入两个参数,对第三个参数,我们在上下文里是没 ...

  9. 【hive】null值判断

    hive用作null值的判断是不能用 = , != 来判断的 只能用is [not] null来完成 不支持ifnull()函数(mysql支持) 适用于所有数据类型 (1)条件中判断是否为空 whe ...

随机推荐

  1. NameServer路由删除

    NameServer会每隔10s扫描brokerLiveTable状态表,如果BrokerLive的lastUpdateTimestamp的时间戳距当前时间超过120s,则认为Broker失效,移除改 ...

  2. 机场&代理商-关系图

    机场&代理商-关系图 思路 ①首先统计机场活跃度Top10的机场名称,以下是我的表结构,以及查询语句 表结构: 查询语句:SELECT * from 2020csale ORDER BY cn ...

  3. Java 在Excel中添加分离型饼图、环形图

    一.概述 Excel中可支持多种不同类型的图表,本文介绍如何绘制分离型饼图和环形图.其中,分离型饼图的绘制可分为整体分离型(即设置饼图分离程度)和局部分离(即设置点爆炸型值)两种情况.下面将以Java ...

  4. 浅尝 Elastic Stack (二) Logstash

    一.安装与启动 Logstash 依赖 Java 8 或者 Java 11,需要先安装 JDK 1.1 下载 curl -L -O https://artifacts.elastic.co/downl ...

  5. 单次期望 O(1) 的RMQ

    膜万弘,太强了!!! 刚刚变态的zjjws想要将一个需要 \(RMQ\) 问题的时间和空间都卡成 \(O(n)\) ,就在可怜的蒟蒻 Point_King 一筹莫展之时万弘他出现了,给予了本蒟蒻光明和 ...

  6. 题解-CF348E Pilgrims

    题面 CF348E Pilgrims 有一棵 \(n\) 个点的 带权 树和 \(m\) 个关键点,要求杀了一个不关键的点,满足最多的关键点到离它最远的所有关键点的路径都被打断.求可以满足的最多关键点 ...

  7. hashmap为什么是二倍扩容?

    这个很简单,首先我们考虑一个问题,为什么hashmap的容量为2的幂次方,查看源码即可发现在计算存储位置时,计算式为: (n-1)&hash(key) 容量n为2的幂次方,n-1的二进制会全为 ...

  8. 云服务器 ECS Linux 安装 VNC Server 实现图形化访问配置说明

    阿里云官方公共 Linux 系统镜像,基于性能及通用性等因素考虑,默认没有安装 VNC 服务组件.本文对常见操作系统下的 VNC Server 安装配置进行简要说明. 本文中仅讨论VNC的安装,关于图 ...

  9. rsync 参数说明及使用参数笔记

    第1章 rsync 命令简介 rsync 是一款开源的.快速的.多功能的.可实现全量及增量的本地或远程数据镜像同步备份的优秀工具. 1.1.1 语法格式 三种模式: 1)本地模式 rsync [选项] ...

  10. Struts2 S2-061(CVE-2020-17530)漏洞复现

    0x00 漏洞简介 Apache Struts2框架是一个用于开发Java EE网络应用程序的Web框架.Apache Struts于2020年12月08日披露 S2-061 Struts 远程代码执 ...