写点什么

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

评论

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

江西吉安:一个上了区块链柚子的真情告白

CECBC

区块链 蜜柚

“黑五”前夜的裁员:无接触配送大趋势为什么都带不动亚马逊无人机?

脑极体

《穿越数据的迷宫》笔记:第 2章 数据管理的挑战

方志

数据治理

LeetCode题解:51. N 皇后,回溯+哈希表,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

重点人员管控系统开发,可视化数据分析搭建

t13823115967

重点人员管控系统开发 智慧公安 可视化数据分析搭建

数字货币管理三大新模式

CECBC

数字货币

构师训练营 - 第六周学习总结

joshuamai

一万字详解 Redis Cluster Gossip 协议

程序员历小冰

redis 分布式 redis cluster

我理解的信息化、数字化、数智化

boshi

数字化 数据智能 信息化

架构设计之路-1

5加3彩票

架构师 代码规范

区块链版权应用搭建,区块链版权存证平台开发

13530558032

构师训练营 - 第六周课后练习

joshuamai

什么是KMP算法(详解)

赖猫

c++ Linux KMP

线程模型Reactor/Proactor的区别

Linux服务器开发

reactor 线程 多线程 Linux服务器开发 Proactor

Spring AOP核心类解析,这是最全的一篇了!!

冰河

spring aop ioc 注解驱动 切面编程

Spock单元测试框架实战指南一Spock是什么?它和JUnit有什么区别?

Java老k

Java 单元测试 JUnit Mock spock

《穿越数据的迷宫》笔记:第 3 章 DAMA的数据管理原则

方志

数据治理

Spring 源码学习 05:BeanDefinition 概念及其实现

程序员小航

spring 源码 源码阅读 BeanDefinition

智慧公安扫码一键定位报警系统搭建

t13823115967

智慧公安 智慧公安扫码 一键定位报警系统搭建

2020亚马逊“黑五”再次成为亚马逊史上最大的年终全球狂欢

爱极客侠

区块链电子发票应用落地,区块链电子发票系统开发

13530558032

年轻人会用C++实现一种协程吗?

ShenDu_Linux

Linux 程序员 多线程 协程 什么是多线程

自己搭建服务器需要多少钱?

德胜网络-阳

JVM调优不知道怎么回答,阿里总结四大模块,学不会就背过来

996小迁

Java 架构 面试 调优

面对日益严峻的网络安全问题,CDN可以做什么?

阿里云Edge Plus

周小川深度解读:DC/EP和数字人民币e-CNY

CECBC

数字人民币

当千行万业的轨道,换上智能云网的高铁

脑极体

极客大学 - 架构师训练营 第十一周总结

9527

甲方日常 62

句子

工作 随笔杂谈 日常

区块链商品追溯平台开发,区块链防伪追溯系统搭建

13530558032

AOT慈善币系统软件开发|AOT慈善币APP开发

系统开发 现成系统

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