首页
学习
活动
专区
圈层
工具
发布

NullReferenceException,就不应该存在!

---- NullReferenceException 的可恨之处 你说 NullReferenceException 可以告诉你程序中某个字段为 null,告诉你程序发生了 BUG。...那么 DoSomething 被调用的时候,直接就会抛出 NullReferenceException。这个方法比较简单,我们猜 _value 为 null 基本不会有问题了,方法复杂一点儿就难猜了。...所以,为了解决这些困惑,我建议在开发中以如下方式对待我们的 null: 对任何可被外部模块调用的方法的参数进行 null 判断,并在参数为 null 时抛出 ArgumentNullException。...如果你无法根据现有状态完成方法承诺的任务,请抛出具体的异常并给出真实的原因。 如果确实要用 null 在程序中代表某种状态,请确定这能够代表某种唯一确定的状态,并强制要求使用方判空。...对于第 3 点,JetBrains 为我们提供了 JetBrains.Annotations,这是一组 100+ 个的 Attribute,以 NuGet 包的形式提供。

1.5K10

C# 可为空引用类型

导致可为空引用类型不尽理想的一些原因在于: 对空值调用成员会导致 System.NullReferenceException 异常抛出,导致生产代码抛出 System.NullReferenceException...不过,遗憾的是,对于可为空引用类型,我们“失败了”,将精力放在了错误的事情上,而不是正确的事情上。“失败”操作是指未检查是否为空就调用了引用类型。...对于像我们这样长期使用 C# 编程的人来说,这很“正常”。不过,如果我们能够将一切推到重来,还是希望引用类型默认不可为空,并通过添加“?”显式允许为空。...减少 NullReferenceException 抛出:降低 NullReferenceException 异常抛出的可能性,具体是通过改进静态流分析,标记出可能存在问题的情况,即调用值成员之一前未显式检查值是否为空...流分析其实只检查局部变量和参数的方法主体的为空性,并利用方法和运算符签名来确定有效性。

1.5K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    dotnet 6 已知问题 ManualResetEventSlim 的 Set 方法抛出空异常

    当前这个问题在 .NET 7 修复 这是从我的埋点上报遥测收集到的异常信息,在线程池里面的调用堆栈,调用到 ManualResetEventSlim 的 Set 方法,抛出了 System.NullReferenceException...,而且进一步阅读 dotnet 仓库的源代码,我也没有找到任何可能在 Set 方法里面抛出的空异常 大佬回复我说这个问题预计是被在 .NET 7 的清理旧代码时,顺手修掉了,修复的代码请看 https:...= null) 判断非空时通过,然而在 m_eventObj.Reset(); 使用就被赋值为空 更新代码使用新语法加上问号即可修复此问题。...加上问号之后,将会先捕获 m_eventObj 对象作为一个变量,接着判断变量是否为空,不空才执行 Reset 方法,等同于以下代码 var eventObj = m_eventObj; if (eventObj...= null) { eventObj.Reset(); } 由于捕获了局部变量,从而规避了多线程赋空值安全问题 由于我阅读 dotnet 代码的时候看的是 main 分支的代码,这部分和 dotnet

    45120

    Nullable Reference Types 可空引用类型

    在写C#代码的时候,你可能经常会遇到这个错误: ? 但如果想避免NullReferenceException的发生,确实需要做很多麻烦的工作。...可空引用类型 Null Reference Type 所以,C# 8的可空引用类型就出现了。...这个叹号的作用仅仅是去掉了警告,它没有改变任何运行时的状况,如果Address为null,那么这句话仍然会抛出NullReferenceException。...而回到方法里,我把叹号和问号都去掉之后,也不会出现警告了,因为它认为所有的成员都不会是null了: ? 但是还要记住,这个只是在编译时进行的检查,如果成员为null,还是会抛出异常的。...这种操作对于运行时来说没有任何改变。 解决成员上出现的警告 使用构造函数对成员初始化,可以去掉这些警告: ? 另外一种办法就是直接对属性进行初始化: ?

    1.1K30

    c#值类型与引用类型区别

    值类型对象的两种表示方式:未装箱和已装箱,引用类型总是处于已装箱 值类型从System.ValueType派生。...由于这个默认实现存在性能问题,所以定义自己的值类型时应重写Equals和GetHashCode方法,并提供它们的显式实现。...引用类型的变量创建时默认初始化为null,表明当前不指向有效对象。试图使用null引用类型变量会抛出NullReferenceException异常。...相反,值类型的变量总是包含其基础类型的一个值,而且值类型的所有成员都初始化为0。值类型变量不是指针,访问值类型不可能抛出NullReferenceException异常。...CLR确实允许为值类型添加“可空”(nullability)标志。 将值类型变量赋给另一个值类型变量,会执行逐字段的复制。将引用类型的变量赋给另一个引用类型的变量只复制内存地址。

    1K20

    3分钟短文 | PHP位运算和逻辑运算,一个符号写两遍这么简单?

    本文就从几个小栗子,说一说逻辑运算符,和位运算符那些恩爱纠缠。 学习时间 正好比PHP内的 & 和 && 的关系一样,双符号表示“短路”操作。...所以说,不使用“短路”操作符,程序上下文是有一定风险的。比如下面的例子,检查某个对象是否为空,且检查其某个属性值满足某个条件: if($class !...= null && $class->someVar < 20) 上面的写法,如果 class 本身就是 null,那么直接熔断;只有 class 不为空,才会执行接下来的属性检查条件。...如果 $class = null,直接抛出 NullReferenceException 异常; 如果 $class !...深入学习 其实对于 | 或 &,在PHP中是作为位操作符使用。下图是PHP位操作符的意义: ?

    97910

    成员可能是null的

    在写C#代码的时候,你可能经常会遇到这个错误: image.png 但如果想避免NullReferenceException的发生,确实需要做很多麻烦的工作。...可空引用类型 Null Reference Type 所以,C# 8的可空引用类型就出现了。...“,表示Address肯定不是null: image.png 这个叹号的作用仅仅是去掉了警告,它没有改变任何运行时的状况,如果Address为null,那么这句话仍然会抛出NullReferenceException...而回到方法里,我把叹号和问号都去掉之后,也不会出现警告了,因为它认为所有的成员都不会是null了: image.png 但是还要记住,这个只是在编译时进行的检查,如果成员为null,还是会抛出异常的...这种操作对于运行时来说没有任何改变。

    84531

    基础:C# try catch finally异常处理(Exception)

    C# 中try块可以捕获测试代码块中的错误。catch块可以处理错误。finally块无论是否try和catch块出现异常都可以执行代码。...try和catch关键字成对出现: 语法 try { // 要尝试的代码块 } catch(Exception e) { // 处理错误的代码块 } 考虑以下示例: 这将产生一个错误,因为myNumbers...对象不是一个有效的成员 NotSupportedException 调用的方法在类中没有实现 NullReferenceException 试图使用一个未分配的引用 OutOfMemoryException...IndexOutOfRangeException 当一个数组的下标超出范围时运行时引发。 NullReferenceException 当一个空对象被引用时运行时引发。...ArgumentNullException 在参数为空(不允许)的情况下,由方法引发。 ArgumentOutOfRangeException 当参数不在一个给定范围之内时,由方法引发。

    88210

    一文看懂 .NET 的异常处理机制、原则以及最佳实践

    本文适用于已经入门 .NET/C# 开发,已经开始在实践中抛出和捕获异常,但是对 .NET 异常机制的用法以及原则比较模糊的小伙伴。...举一个例子:我们写一个程序有简洁模式和专业模式,在从简洁模式切换到专业模式的时候,我们设置 IsProfessionalMode 为 true,但随后出现了异常导致没有成功切换为专业模式;然而接下来所有的代码在执行时都判断...本身并没有明确的意义 ApplicationException 这是各种异常的基类,本身并没有明确的意义 由 CLR 引发的异常 NullReferenceException 试图在空引用上执行某些方法...NullReferenceException 试图在空引用上执行某些方法,除了告诉实现者出现了意料之外的 null 之外,没有什么其它价值了 IndexOutOfRangeException 使用索引的时候超出了边界...…… 另外,还剩下一些不应该抛出的异常,例如过于抽象的异常和已经过时的异常,这在前面一小结中有说明。

    1.7K41

    C# is和as运算符详解

    这节介绍两个与继承有关的重要运算符:is和as。 01 — 概述 可以把具体类型的对象直接分配给基类或接口,如果这些类型在层次结构中有直接关系。...当然,如果接受一个object类型的对象,有时就会传递无效的对象。此时会得到InvalidCastException异常。在正常情况下接受异常从来都不好。此时应使用is和as运算符。...as运算符的工作原理类似于类层次结构中的cast运算符——它返回对象的引用。然而,它从不抛出InvalidCastException异常。相反,如果对象不是所要求的类型,这个运算符就返回null。...这里,最好在使用引用前验证它是否为空,否则以后使用以下引用,就会抛出NullReferenceException异常: public void WorkWithManyDifferentObjects(...,不会抛出基于类型转换的异常,且使用is和as运算符都是可行的。

    79220

    C# 自定义异常:提升代码健壮性与可维护性

    C# 作为一门面向对象的编程语言,提供了丰富的内置异常类,如 ArgumentException、NullReferenceException 等。...自定义异常允许开发者根据业务需求创建特定类型的异常,使异常信息更加清晰、准确,提高代码的可读性和可维护性。...常见的内置异常类包括: System.ArgumentException:当传递给方法的参数无效时抛出。 System.NullReferenceException:当尝试访问空对象的成员时抛出。...4.2 便于调试和维护 当程序出现问题时,自定义异常能够准确地指出问题所在的业务逻辑,方便开发者进行调试和维护。 4.3 增强代码的可扩展性 随着业务的发展,可能会出现更多的异常情况。...同时,我们应该遵循异常处理的最佳实践,确保异常信息的准确性和完整性。

    33100

    使用 ServiceStack 构建跨平台 Web 服务

    ServiceStack是.Net和Mono的开源框架,相对WCF,MVC及Web API而言它是开发Web服务与Web应用的有力替代品,它越来越普及。...选项 ServiceStack 强制远程 Web 服务最佳实践、 基于公约 DTO 标准为其 Web 服务接口,ServiceStack 还提供预置的响应状态对象,可用于撰写 DTO,鼓励更加直接和简单的错误处理方案...ServiceStack和WCF相同。 WCF 需要何数据对象和数据成员打上标记; 否则,WCF 简单地忽略它们。 这是 ServiceStack 和 WCF 与的不同的地方。...ServiceStack 支持不同的操作,如有 Get 和 Post。 您的选择在这里仅影响的 HTTP 请求。...,创建一个空的ASP.NET应用,使用 NuGet 包管理器控制台将 ServiceStack 引用添加到 ServiceStack.Host.AspNet中所示 ?

    2.6K50

    [] 各种问号的用法和说明

    远不止是一个简单的标点符号。随着语言版本的迭代更新,C# 围绕问号(?)发展出了一套强大而优雅的空值处理和条件表达机制。...熟练掌握这些操作运算符不仅能大幅提升代码的简洁性和可读性,还能有效避免恼人的空引用异常,构建更加健壮的应用程序。 可空类型修饰符(?)...如果对象为 null,整个表达式返回 null 而不会抛出 NullReferenceException;如果对象不为 null,则正常访问成员。...Name; // 不会抛出异常,name 为 null Console.WriteLine(name ??...[]) 在使用索引器访问集合元素前先检查集合对象是否为 null。如果集合为 null,整个表达式返回 null 而不会抛出异常;如果集合不为 null,则正常访问索引位置的元素。

    59310

    C#开发人员应该知道的13件事情

    当实现泛型类型时,可以使用“default”关键字来获取那种无法硬编码到实现中的默认值。具体来说就是,数字类型的默认值为0; 引用和可空值类型的默认值为null。...抛出和重新抛出异常 当你希望在更深层次处理一个捕获到的异常时,维护原始异常状态和堆栈对于调试有极大的帮助。需要仔细地平衡,调试和安全注意事项。...如果你尝试访问一个空引用,以为它是一个对象的有效引用一样 - 例如,通过访问一个属性或方法,运行时将抛出一NullReferenceException异常。...静态和动态分析工具可以帮助你在发布代码之前识别潜在的NullReferenceException异常。在C#中,空引用通常由尚未引用对象的变量引起。对于空值类型和引用类型来说,Null是一个有效值。...从数据库表中读取数据时,请确保,缺失值可以表示为DBNull对象,而不是空引用。不要指望它们表现的像潜在的空引用。

    3K90

    应该抛出什么异常?不应该抛出什么异常?(.NETC#)

    ,不支持) PlatformNotSupportedException 表示在此平台下不支持(如果程序跨平台的话) 实现错误 NullReferenceException 试图在空引用上执行某些方法...,本身并没有明确的意义 Exception 这可是顶级基类,这都抛出来了,使用者再也无法正确地处理此异常了 是时候该决定抛什么异常了 对于使用错误,应该在第一时间抛出 既然对方已经用错了,那么代码继续执行也只会错上加错...NullReferenceException。...对于环境错误,关注于规避和恢复 环境错误是难以提前预估的;或者说预估的成本太高,不值得去预估。....NET 中已经为我们准备了很多场景下的多套环境异常,例如 IO 相关的异常,网络连接相关的异常。这些异常都不是我们应该抛出的。

    2.3K20

    C#OOP之十 异常机制及其处理

    异常简介 索引越界、文件I/O出错、堆栈溢出、除零运算问题、数据库无法使用等一个个问题,对于我们来说如何保证系统容错和程序规范,异常机制是不可或缺的重要因素和手段。...4) 空值错误。“空对象或空引用”的问题。 5) 相等值比较。 6) 数组越界。 7) If else 或switch case 匹配问题。...` 常见系统异常类说明如下: 常见系统异常类说明如下: 系统异常类 说 明 IndexOutOfRangeException 数组索引异常 NullReferenceException 空引用异常...如果表达式的计算产生null,则引发System.NullReferenceException。...编写一个手机号格式不符合规范的自定义异常继承自Application,如果手机号不符合规范则抛出异常错误。 手机规范为:只能是13位数字,不能是其他任何字符。第一必须是1, 第二位必须是3或5。

    55200

    可空值类型

    这种“静默”的失败是最棘手的,因为很难追踪和撤销。相对而言,能够在执行路径中明确抛出异常会好很多。 可空值类型封装了前面第2种方式:为每个值类型维护一个额外的标志,用该标志来指示当前值是否可用。...如果对可空值类型调用GetType(),要么会引发NullReferenceException,要么会返回对应的非可空值类型,如代码清单2-10所示。...()); 抛出NullReferenceException Nullable someValue = new Nullable(5); Console.WriteLine...对于任意两个非可空的值类型S和T, 有操作数是非可空值类型的运算符才能被提升; 对于一元运算符和二元运算符(等价运算符和关系运算符除外),原运算符的返回类型必须是非可空的值类型; 对于等价运算符和关系运算符...对于所有运算符来说,操作数的类型都成了对应的可空等价类型。对于一元操作数和二元操作数,返回类型也成为可空类型。如果任意一个操作数为null,那么返回值也为null。

    3.4K30

    2019-3-8-resharper喊你回家判空啦

    NullReferenceException一定是大多数程序员最讨厌的异常之一 ---- 我们在书写代码时看到NullReferenceException一定很崩溃,但是更崩溃的事情是在团队协作时,小伙伴写的方法给你返回了一个...CanBeNull可以标记在方法的参数或者返回值,使用后可以看到在可能出现空引用的地方vs给出了波浪线提示 ?...还有一种相对来说少见一些的情况是对于Task中对T可能为空的标记 如果我们采用之前的CanBeNull标记,会发现vs提示在await Foo 处出现提示,即Task 可能会null 而不是我们期望的...string 为null ?...ItemCanBeNull可以表示IEnumerable ,Task或者Lazy所包含的对象类型可能为空,例如List,Task和Lazy中的T 那么既然可以表示可空,是否有标记表示非空呢

    62020
    领券