写点什么

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

评论

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

关于GDB你需要知道的技巧

泰伦卢

c c++ C#

MySQL中 int(11)和 int(10) 到底有没有区别?

周三不加班

MySQL 字符宽度 数据库数据类型

金融「中台」十宗罪

FinClip

中台 企业中台 业务中台

翻译和产品本地化的区别是什么?

葛仲君

翻译 本地化 全球化 产品开发

DDD 实践手册(4. Aggregate — 聚合)

Joshua

设计模式 领域驱动设计 架构模式

机会是留给不停寻找他们的人,而不是原地等待的人

非著名程序员

程序员 提升认知 机会 行动派

从一道面试题来看计算机基础知识的重要性

周三不加班

数组 堆栈 函数栈 函数栈调用

一次线上服务高 CPU 占用优化实践

挖坑的张师傅

性能优化 JVM cpu

《TCP/IP详解》概述

网瘾少年SEC

TCP 网络协议 IP

当我们谈到ThreadLocal的时候,我们在谈什么?

Jason

Java 多线程 ThreadLocal

浅谈SpringCloud之服务注册中心Eureka

北漂码农有话说

写字工具更新史

Bonaparte

学习 读书笔记

业务代码的救星——Java 对象转换框架 MapStruct 妙用

周三不加班

MapStruct 对象转换

笔记:《如何系统思考》之如何做到系统思考

wiflish

思维方式

C++线程池的实现

泰伦卢

c++ C# 线程池

内存对齐

泰伦卢

c c++ C#

【译】【UX】一个页面可以有多个面包屑导航吗?

Yukun

用户研究 UX 面包屑导航

Python3.6.1官方文档练习——初入江湖(一)

小匚

Python python3.x 入门

css常见问题总结

靖仙

CSS css3

写作的意义到底是什么

董一凡

写作

C++定时器的实现

泰伦卢

c c++ C#

各大公司面试题分类整理

是小毛吖

面试 后端

一个平凡程序员的年度总结

小智

程序员 人生

Redis 6.0 新特性-多线程连环13问!

牧码哥

redis 多线程 io

Clickhouse 性能测试

久吾尔岂

开始每周写作计划

M1racle

从删库到跑路?

芦苇

产品 职业 产品经理 职业素养 职业道德

面试指南 | 终于要跟大家见面了,我有点紧张。

Apache Flink

大数据 flink 流计算 实时计算

centos7 maven私服自动启动

kcnf

开源商业模式促进金融业科技生态的发展

FinClip

开源 金融科技

聊聊苹果账号的那些事儿

不要艾特我

iphone

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