写点什么

Visual Basic 和 C#在空类型上的不同

  • 2007-09-19
  • 本文字数:942 字

    阅读完需:约 3 分钟

在.NET 1.0 发布的时候,VB 和 C#没有太多的区别,但是随着第四个版本发布的临近,两者之间的区别逐渐拉开。今天让我们一起看看那些在空类型上可能会困扰开发人员的小地方。

空类型是在.NET 2.0 发布的时候被引入的。使用泛型(Generics),任何值类型都可以被包装成空类型,从而可以有空值。在从前,要达到这个效果只可以通过创建一个定制的类,或者将值封装然后指定给类型对象的一个变量。

C#很快增加了对空类型的语言支持。但是 VB 一直在忙于从 VB 转换到 VB.NET 方面的后遗症,无暇像 C#那样顾及到这一块,虽然可以用空值,但只能在 API 的级别。在 9 版本里,Visual Basi 会对空类型全面支持。它会使用一个和 C#非常接近的语法,但是语义上会有很大的区别。在 C#中,比较操作要么会返回 true,要么返回 false。但是在 VB 中,因为空值的引入,比较操作可能会返回 true,false 或者 null 等。

a=null, b=null Operator C# Result VB Result == true Nothing != false Nothing > false Nothing < false Nothing >= false Nothing <= false Nothing a=1, b=null Operator C# Result VB Result == false Nothing != true Nothing > false Nothing < false Nothing >= false Nothing <= false Nothing 从上表可以看出在 C#中出现的一个非常有意思的异常,在 a 和 b 都是空的时候,a==b 返回的是 true,但是 a>=b 和 a<=b 则返回的是 false。

在遇到检查 Boolean 值的时候,C#是非常清晰易懂的。另外一方面,VB 不得不以某种方式把自己的三状态逻辑映射到 Boolean 值。为了满足像 IF、While 和 Untile 这样的 Boolean 检查,VB 是将 null 等同于 false 处理的。这会导致下面所列出的很有意思的现象:

a = null, b = null <br></br>If a=b Then <br></br>'skipped <br></br>Else <br></br>'this line is executed <br></br>End if <p>If Not (a=b) Then </p><br></br>'skipped <br></br>Else <br></br>'this line is executed <br></br>End if(a=b) 和 Not (a=b) 都返回 null 值,也都被认定为 false。

真正地理解这些语言中细微的差别和不一致,对于使用空类型的开发人员是非常有必要的,否则就会有 Bug 的产生。

查看英文原文: Visual Basic and C#: Differences in Nullable Types

2007-09-19 01:171147

评论

发布
暂无评论
发现更多内容

面试突击68:为什么 TCP 需要 3 次握手?

王磊

Java 面试题 网络

莫慌!Java 多商户外贸版系统这不就来了么

CRMEB

vue2升级vue3:provide与inject 使用注意事项

zhoulujun

Vue3 provide inject

前端食堂技术周刊第 45 期:Vite3.0、第91次TC39会议、Figma背后的CSS、B 站事故复盘、图片优化工具

童欧巴

前端 deno vite TC39 figma

为啥谷歌的内部工具不适合你?

laofo

DevOps cicd 研发效能 工具链 谷歌

一种分布式深度学习编程新范式:Global Tensor

OneFlow

深度学习 编程 分布式

Okaleido生态核心权益OKA,尽在聚变Mining模式

西柚子

算法题每日一练---第10天:时间显示

知心宝贝

算法 前端 后端 7月月更

STM32+MFRC522完成IC卡号读取、密码修改、数据读写

DS小龙哥

7月月更

2B和2C

白粥

万字详解“用知识图谱驱动企业业绩增长”

博文视点Broadview

期待已久的 RocketMQ Summit 等待你的参与!

阿里巴巴云原生

Apache 阿里云 RocketMQ 云原生 消息队列

SAP ABAP Netweaver 容器化的一些前沿性研究工作分享

汪子熙

SAP abap Netweaver Docker 镜像 7月月更

vue2升级vue3:Vue Demij打通vue2与vue3壁垒,构建通用组件

zhoulujun

Vue3 vue2 demij vue2有vue3兼容

Kubernetes网络插件详解 - Calico篇 - 概述

巨子嘉

第二届中国Rust开发者大会来啦,完整议程大曝光!

Mike Tang

rust rust conf

入门前端 -- CSS

bo

CSS 前端 7月月更

C# Serialport的发送和接收

IC00

C# 7月月更

Qt | 关于如何使用事件过滤器 eventFilter

YOLO.

qt 7月月更

C#入门系列(三十一) -- 运算符重载

陈言必行

7月月更

语音聊天app源码——钠斯直播系统源码

开源直播系统源码

直播系统源码 语音聊天系统 语音聊天软件 一对一语音聊天系统

如何写一篇百万阅读量的文章

六月的雨在InfoQ

内容 个人提升 写作技巧

Prometheus 运维工具 Promtool (二)Query 功能

耳东@Erdong

Prometheus 7月月更 Promtool

模块二作业

薛敏

java零基础入门-异常、线程(上)

喵手

Java 7月月更

LeetCode-67. 二进制求和(java)

bug菌

Leet Code 7月月更

vue2升级vue3: h、createVNode、render、createApp使用

zhoulujun

Vue3

如何使用Docker内的kafka服务

程序员欣宸

Java kafka 7月月更

vue2升级vue3:vue3 hooks库选用

zhoulujun

Vue3 Hooks vueuse ahooks

vue2升级vue3:单文件组件概述 及 defineExpos/expose

zhoulujun

Vue3 expose

服务器内存故障预测居然可以这样做!

vivo互联网技术

运维 内存监控 EDAC 内存预测

Visual Basic和C#在空类型上的不同_.NET_Jonathan Allen_InfoQ精选文章