在VB.NET中,有没有 ?.这个运算符

好的,这是一个非常常见的问题,特别是对于从 C# 转过来的开发者。

VB.NET 中,没有 ?.这个运算符?.是 C# 中的空条件运算符

但是,VB.NET 提供了功能完全等效的替代方案来实现同样的目的

1. C# 中的 ?.是做什么的?

首先,我们来理解 ?.的作用。它的目的是在访问对象的成员(属性、方法、字段等)之前,先检查该对象是否为 null(在 VB.NET 中叫 Nothing)。如果对象为 null,则整个表达式的结果就是 null,而不会抛出 NullReferenceException

C# 示例:

java 复制代码
// C# 代码Customer customer = GetCustomer(); // 这个方法可能返回 null// 使用 ?. 安全访问string name = customer?.Name; // 如果 customer 为 null,name 也会是 null,不会报错int? length = customer?.Name?.Length; // 链式安全访问// 旧方法:需要写很多判断if (customer != null){    name = customer.Name;}

2. VB.NET 中的等效功能:If()运算符和 Nothing传播

VB.NET 使用一个非常强大的 If()运算符 来达成同样的安全访问效果。这个 If不是 If...Then语句,而是一个三元运算符,并且具有特殊的"空传播"行为。

语法: If(Obj, DefaultValue)

  • 作用 :计算表达式 Obj。如果 Obj不是 Nothing,则返回 Obj本身;如果 ObjNothing,则返回你指定的 DefaultValue

  • 当用它来访问成员时,就实现了和 ?.一样的安全链式访问。

VB.NET 等效示例:

sql 复制代码
' VB.NET 代码Dim customer As Customer = GetCustomer() ' 这个方法可能返回 Nothing' 安全访问属性:相当于 C# 的 customer?.NameDim name As String = If(customer?.Name, Nothing) ' 第一种写法,明确指定Nothing为默认值Dim name As String = If(customer?.Name, Nothing) ' 更常见的简洁写法' 安全链式访问:相当于 C# 的 customer?.Name?.Length' 注意:因为 .Length 返回 Integer(值类型,不可为Nothing),' 所以通常使用可空类型 Integer? 来接收可能为空的长度结果。Dim length As Nullable(Of Integer) = If(customer?.Name?.Length, Nothing)' 你也可以提供一个有意义的默认值,而不一定是 Nothing' 相当于:如果 customer 或 Name 为 null,则返回 "(Unknown)"Dim safeName As String = If(customer?.Name, "(Unknown)")

对比总结

结论

虽然语法不同,但 VB.NETIf()运算符 完全具备了 C# ?.空条件运算符的核心功能。你可以在 VB.NET 中用它来安全地进行链式成员访问,有效避免 NullReferenceException

?.VB.NET 中的正确写法

在标准的 VB.NET 中,要实现类似空安全访问的功能,应该使用 If()运算符:

复制代码
vbnet`' 正确的 VB.NET 写法
rowData.Add(If(value IsNothing, "", value.ToString()))`

或者更简洁的写法:

复制代码
vbnet`rowData.Add(If(value?.ToString(), ""))`

但请注意,第二种写法中的 ?.并不是标准 VB.NET 语法,实际上应该写成:

复制代码
vbnet`rowData.Add(If(value IsNotNothing, value.ToString(), ""))`
相关推荐
Once_day10 分钟前
C++之《程序员自我修养》读书总结(1)
c语言·开发语言·c++·程序员自我修养
若鱼191912 分钟前
SpringBoot4.0新特性-Observability让生产环境更易于观测
java·spring
觉醒大王21 分钟前
强女思维:着急,是贪欲外显的相。
java·论文阅读·笔记·深度学习·学习·自然语言处理·学习方法
喜欢喝果茶.28 分钟前
QOverload<参数列表>::of(&函数名)信号槽
开发语言·qt
亓才孓29 分钟前
[Class类的应用]反射的理解
开发语言·python
努力学编程呀(๑•ี_เ•ี๑)29 分钟前
【在 IntelliJ IDEA 中切换项目 JDK 版本】
java·开发语言·intellij-idea
码农小卡拉39 分钟前
深入解析Spring Boot文件加载顺序与加载方式
java·数据库·spring boot
向上的车轮1 小时前
为什么.NET(C#)转 Java 开发时常常在“吐槽”Java:checked exception
java·c#·.net
Dragon Wu1 小时前
Spring Security Oauth2.1 授权码模式实现前后端分离的方案
java·spring boot·后端·spring cloud·springboot·springcloud
island13141 小时前
CANN GE(图引擎)深度解析:计算图优化管线、内存静态规划与异构任务的 Stream 调度机制
开发语言·人工智能·深度学习·神经网络