写点什么

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:171166

评论

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

说出来就不灵啦

伯薇

糊涂 活在当下 享受状态 生活状态 观察者

多云的一点思考

HU

从数据闭环谈微服务拆分

松花皮蛋me

微服务

HashMap 的 7 种遍历方式与性能分析

Bruce Duan

Java 性能 hashmap 遍历

MySQL中order by语句的实现原理以及优化手段

天堂

Java MySQL 性能优化

KubeFATE: 用云原生技术赋能联邦学习(一)

亨利笔记

人工智能 学习 FATE KUBEFATE

南丁格尔科普

小匚

如何优雅滴在手机上跑Python代码

wangkx

Python 移动应用 手机编程

把成功过成自己的生活

子铭

成功学 生活状态

怎样算是一个好的开发者?

水滴

开发者

即将步入职场,忐忑而又期待的新人菜鸟

菜农阿飞

成长 新人

游戏夜读 | 2020周记(3.27-4.3)

game1night

Day 47|Week 07-5 曾国藩家书|问学篇-学问何处何时都可做

熊小北同学

神经网络的激活函数为什么要使用非线性函数

wangkx

神经网络 激活函数

高仿瑞幸小程序 00 准备工作

曾伟@喵先森

小程序 微信小程序 大前端 瑞幸

Java并发编程系列——锁

孙苏勇

Java Java并发 并发编程 多线程

为什么正在使用的Java版本跟环境变量的版本不一致

阡陌r

Java 踩坑

MySQL的死锁系列- 锁的类型以及加锁原理

程序员历小冰

MySQL

关于5G RCS的产品猜想

机器鸟

浅析 Cocoapods-Packager 实现

Edmond

ruby ios CocoaPods binary packager

消息队列Kafka - acks参数

Java收录阁

kafka

经济大萧条对我的启示

Neco.W

创业 自我管理 职场 自我提升

DDD 实践手册(2. 实现分层架构)

Joshua

设计模式 领域驱动设计 DDD 系统架构 分层架构

韦小宝真的幸福吗 | Random Forest

张利东

Python 学习

使用 jsDelivr 免费加速 GitHub Pages 博客的静态资源

mzlogin

CDN Jekyll GitHub Pages 个人博客

死磕Java并发编程(7):读写锁 ReentrantReadWriteLock 源码解析

Seven七哥

Java并发 读写锁 ReentrantReadWriteLock

Netty 源码解析(四): Netty 的 ChannelPipeline

猿灯塔

学习来应对创业的未知

Neco.W

创业 重新理解创业

InfoQ写作平台首秀,来个自我介绍

nuhcoad

个人感想

阿里巴巴Java开发手册泰山版解读

Bruce Duan

程序员陪娃漫画系列——魔方

孙苏勇

程序员 生活 陪伴 漫画

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