java if hasvalue_首选:可为空 .HasValue或Nullable !=空吗?

我一直使用Nullable<>.HasValue因为我喜欢这种语义。 但是,最近我正在开发其他人的现有代码库,其中他们专门使用Nullable<> != null 。

是否有理由优先使用一个,还是纯粹是偏爱?

int? a; if (a.HasValue) // ...

int? b; if (b != null) // ...

#1楼

我更喜欢(a != null)以便语法与引用类型匹配。

#2楼

我通过使用不同的方法将值分配给可为null的int进行了一些研究。 这是我做各种事情时发生的事情。 应该澄清发生了什么。 请记住: Nullable还是速记的something? 是一种结构,编译器似乎为此进行了大量工作,让我们将null当作类使用。

如下所示, SomeNullable == null和SomeNullable.HasValue将始终返回预期的true或false。 尽管下面没有演示, SomeNullable == 3也有效(假设SomeNullable是int? )。

虽然SomeNullable.Value会让我们运行时错误,如果我们分配null给SomeNullable 。 实际上,由于重载运算符,重载object.Equals(obj)方法以及编译器优化和猴子业务的结合,这是唯一可能导致可为空的问题引起我们问题的情况。

这是我运行的一些代码的描述,以及它在标签中产生的输出:

int? val = null;

lbl_Val.Text = val.ToString(); //Produced an empty string.

lbl_ValVal.Text = val.Value.ToString(); //Produced a runtime error. ("Nullable object must have a value.")

lbl_ValEqNull.Text = (val == null).ToString(); //Produced "True" (without the quotes)

lbl_ValNEqNull.Text = (val != null).ToString(); //Produced "False"

lbl_ValHasVal.Text = val.HasValue.ToString(); //Produced "False"

lbl_NValHasVal.Text = (!(val.HasValue)).ToString(); //Produced "True"

lbl_ValValEqNull.Text = (val.Value == null).ToString(); //Produced a runtime error. ("Nullable object must have a value.")

lbl_ValValNEqNull.Text = (val.Value != null).ToString(); //Produced a runtime error. ("Nullable object must have a value.")

好的,让我们尝试下一个初始化方法:

int? val = new int?();

lbl_Val.Text = val.ToString(); //Produced an empty string.

lbl_ValVal.Text = val.Value.ToString(); //Produced a runtime error. ("Nullable object must have a value.")

lbl_ValEqNull.Text = (val == null).ToString(); //Produced "True" (without the quotes)

lbl_ValNEqNull.Text = (val != null).ToString(); //Produced "False"

lbl_ValHasVal.Text = val.HasValue.ToString(); //Produced "False"

lbl_NValHasVal.Text = (!(val.HasValue)).ToString(); //Produced "True"

lbl_ValValEqNull.Text = (val.Value == null).ToString(); //Produced a runtime error. ("Nullable object must have a value.")

lbl_ValValNEqNull.Text = (val.Value != null).ToString(); //Produced a runtime error. ("Nullable object must have a value.")

和以前一样。 请记住,用int? val = new int?(null);初始化int? val = new int?(null); int? val = new int?(null); ,如果将null传递给构造函数,则会产生COMPILE时间错误,因为可为空的对象的VALUE不可为空。 只有包装对象本身可以等于null。

同样,我们将从以下位置获得编译时错误:

int? val = new int?();

val.Value = null;

更不用说val.Value还是一个只读属性,这意味着我们甚至不能使用以下内容:

val.Value = 3;

但是同样,多态重载的隐式转换运算符使我们能够:

val = 3;

只要它能正常工作,就不用担心杂乱的东西。 :)

#3楼

在VB.Net中。 当可以使用“ .HasValue”时,请勿使用“ IsNot Nothing”。 我刚刚解决了“操作可能破坏运行时的稳定性”的中等信任错误,方法是将“ IsNot Nothing”替换为“ .HasValue”。 我真的不明白为什么,但是编译器中发生的事情有所不同。 我认为C#中的“!= null”可能有相同的问题。

#4楼

一般答案和经验法则:如果您有一个选择(例如,编写自定义序列化程序),可以在与object不同的管道中处理Nullable,并使用其特定的属性,则可以这样做并使用Nullable的特定属性。 因此,从一致的观点来看,应首选HasValue 。 一致的想法可以帮助您编写更好的代码,而不必花费太多时间在细节上。 例如,第二种方法会有效很多倍(主要是因为编译器内联和装箱,但是数字仍然非常有表现力):

public static bool CheckObjectImpl(object o)

{

return o != null;

}

public static bool CheckNullableImpl(T? o) where T: struct

{

return o.HasValue;

}

基准测试:

BenchmarkDotNet=v0.10.5, OS=Windows 10.0.14393

Processor=Intel Core i5-2500K CPU 3.30GHz (Sandy Bridge), ProcessorCount=4

Frequency=3233539 Hz, Resolution=309.2587 ns, Timer=TSC

[Host] : Clr 4.0.30319.42000, 64bit RyuJIT-v4.6.1648.0

Clr : Clr 4.0.30319.42000, 64bit RyuJIT-v4.6.1648.0

Core : .NET Core 4.6.25009.03, 64bit RyuJIT

Method | Job | Runtime | Mean | Error | StdDev | Min | Max | Median | Rank | Gen 0 | Allocated |

-------------- |----- |-------- |-----------:|----------:|----------:|-----------:|-----------:|-----------:|-----:|-------:|----------:|

CheckObject | Clr | Clr | 80.6416 ns | 1.1983 ns | 1.0622 ns | 79.5528 ns | 83.0417 ns | 80.1797 ns | 3 | 0.0060 | 24 B |

CheckNullable | Clr | Clr | 0.0029 ns | 0.0088 ns | 0.0082 ns | 0.0000 ns | 0.0315 ns | 0.0000 ns | 1 | - | 0 B |

CheckObject | Core | Core | 77.2614 ns | 0.5703 ns | 0.4763 ns | 76.4205 ns | 77.9400 ns | 77.3586 ns | 2 | 0.0060 | 24 B |

CheckNullable | Core | Core | 0.0007 ns | 0.0021 ns | 0.0016 ns | 0.0000 ns | 0.0054 ns | 0.0000 ns | 1 | - | 0 B |

基准代码:

public class BenchmarkNullableCheck

{

static int? x = (new Random()).Next();

public static bool CheckObjectImpl(object o)

{

return o != null;

}

public static bool CheckNullableImpl(T? o) where T: struct

{

return o.HasValue;

}

[Benchmark]

public bool CheckObject()

{

return CheckObjectImpl(x);

}

[Benchmark]

public bool CheckNullable()

{

return CheckNullableImpl(x);

}

}

PS 。 人们说建议“由于始终如一的想法而首选HasValue”是无关的和无用的。 您可以预测其性能吗?

public static bool CheckNullableGenericImpl(T? t) where T: struct

{

return t != null; // or t.HasValue?

}

PPS人们继续CheckNullableGenericImpl但没有人试图预测CheckNullableGenericImpl性能。 而且那里的编译器不会帮助您用HasValue替换!=null 。 如果您对性能感兴趣,则应直接使用HasValue 。

#5楼

如果您使用linq并希望使代码简短,我建议始终使用!=null

这就是为什么:

假设我们有一些带有可为空的双变量SomeDouble Foo类

public class Foo

{

public double? SomeDouble;

//some other properties

}

如果我们想在代码中的某个地方从Foo集合中获取所有具有非null SomeDouble值的Foo(假设该集合中的某些foos也可以为null),那么我们将以至少三种方式编写函数(如果我们使用C#6):

public IEnumerable GetNonNullFoosWithSomeDoubleValues(IEnumerable foos)

{

return foos.Where(foo => foo?.SomeDouble != null);

return foos.Where(foo=>foo?.SomeDouble.HasValue); // compile time error

return foos.Where(foo=>foo?.SomeDouble.HasValue == true);

return foos.Where(foo=>foo != null && foo.SomeDouble.HasValue); //if we don't use C#6

}

在这种情况下,我建议总是选择较短的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/508290.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 源程序的良好书写规范有哪些_使用Java作为程序语言时,好的命名规范有哪些...

变量名普通变量命名应该采用首字母小写&#xff0c;其他字母首字母大写的方式。final static变量的名字应该都大写&#xff0c;并且指出完整含义。如果一个常量名称由多个单词组成&#xff0c;则应该用下划线来分割这些单词如。NUM_DAYS_IN_WEEK MAX_VALU如果需要对变量名进行缩…

java邮箱exchange_使用Javamail访问Microsoft Exchange邮箱(IMAP,MS Exchange)

我需要通过IMAPS JavaMail连接到Microsoft Exchange Server.首先,我得到了&#xff1a;A1 NO AUTHENTICATE failed.javax.mail.AuthenticationFailedException: AUTHENTICATE failed.我的调试器中的异常.然后,我禁用了一些身份验证协议&#xff1a;imapProps.setProperty("…

java.equal例子_Java中的== 和equals()方法详解与实例

Java中的 和equals()方法&#xff1a;Java中的数据类型&#xff0c;可分为两类&#xff1a;1.基本数据类型&#xff0c;也称原始数据类型。byte,short,char,int,long,float,double,boolean&#xff0c;他们之间的比较&#xff0c;应用双等号(),比较的是他们的值。2.引用数据类型…

aix系统升级失败提示java_AIX系统补丁升级失败处理

问题描述&#xff1a;现网一台IBM P550小型机&#xff0c;初始版本通过oslevel –r命令检查为5300-02&#xff0c;在IBM官方网站下载5300-06补丁并升级到5300-06后系统报错&#xff0c;缺少sysmgt.websm.apps 5.3.0.60&#xff0c;sysmgt.websm.rte 5.3.0.60两个文件问题处理&a…

java 序列化工具kryo_java jackson avro kryo等几种序列化与反序列化工具的使用

最近由于工作需要&#xff0c;需要研究常用的集中序列化方式&#xff0c;主要目的是对象序列化后占用空间会大大减少&#xff0c;便于存储和传输&#xff0c;下面是几种序列化方式的使用demo1. Java自带的Serialize依赖jar包&#xff1a;无代码示意&#xff1a;import java.io.…

Java反射设置list的属性值_利用java反射比较两个实体有哪些属性值不一样

分享一个利用反射实现比较两个实体属性值的方法&#xff1a;package net.zwq1105.test;import java.beans.Introspector;import java.beans.PropertyDescriptor;import java.lang.reflect.Method;import java.sql.Timestamp;import java.util.ArrayList;import java.util.Array…

java编码规范右大括号换行_java编码规范摘选

1.方法注释模板;description&#xff0c;param&#xff0c;author可选&#xff1a;return&#xff0c;exception2. 行尾注释&#xff0c;如循环结束&#xff0c;模块类结束行3. 文件开头注释项目名称project n ame创建日期&#xff1a;{date}修改历史&#xff1a;版权声明&…

python widnows mysql_Windows下python安装MySQLdb

安装MySQLdb需要在电脑上安装MySQL connector C&#xff0c;只需要这个connector就好&#xff0c;不需要把mysql装全。另外&#xff0c;需要安装VC for python提供编译。到官网上下载脚本进行安装即可&#xff0c;解压压缩包以后&#xff0c;cmd到目标目录&#xff0c;python s…

centos6 yum安装mysql5.6_centos 6.5 yum安装mysql 5.6

[rootlocalhost ~]# vim /etc/yum.repos.d/mysql.repo 新建mysql的yum文件[mysql56-community]nameMySQL 5.6 Community Serverbaseurlhttp://repo.mysql.com/yum/mysql-5.6-community/el/6/$basearch/gpgcheck0wq保存退出&#xff01;[rootlocalhost ~]# yum repolist enable…

java 中断代码_你的java代码可中断吗?(2)

1.确保提交到线程池的任务可中断原文&#xff1a;www.securecoding.cert.org&#xff0c;TPS02-J. Ensure thattasks submitted to a thread pool are interruptible。为了能完全关闭线程池或者取消线程池中的个别任务&#xff0c;程序应提交支持使用Thread.interrupt()中断的任…

php session 封装类,PHP封装的数据库保存session功能类

本文实例讲述了PHP封装的数据库保存session功能类。分享给大家供大家参考&#xff0c;具体如下&#xff1a;PHP用数据库保存session类&#xff1a;class SafeSessionHandler implements SessionHandlerInterface {public $save_path;public $session_name;public $table;public…

apache php mysql配置详解,详细介绍:Apache+PHP+MySQL配置攻略_php基础

一、系统要求&#xff1a;本系统在REDHAT7.2版本测试通过二、服务器端软件要求&#xff1a;1:到APACHE的网络站下载APACHE WEB SERVER http://www.apache.org/2. 到php的网络站下载php解析器 http://www.php.net/三&#xff0e;安装调试WEB SERVER把以上各文件下载后放到同一个…

php递归算法排序,php常用的排序算法代码[冒泡,递归排序-PHP源码

《script》ec(2);《script》php 常用的排序算法代码[冒泡,递归排序冒泡排序算法function bubblesort($arr){$ncount($arr);for($i0;$i{for($j$i;$j<$n-1;$j){if($arr[$i]>$arr[$j]){$temp$arr[$i];$arr[$i]$arr[$j];$arr[$j]$temp;}}}return $arr;}//直接插入排序functio…

php dos,防止用户利用PHP代码DOS造成用光网络带宽

用PHP代码调用sockets,直接用服务器的网络攻击别的IP,常见代码如下:$packets 0;$ip $_GET[\ip\];$rand $_GET[\port\];set_time_limit(0);ignore_user_abort(FALSE);$exec_time $_GET[\time\];$time time();print \"Flooded: $ip on port $rand\";$max_time $t…

java中wait的场景,wait——webdriver实用指南java版

场景Wait类的使用场景是在页面上进行某些操作&#xff0c;然后页面上就会出现或隐藏一些元素&#xff0c;此时使用WebDriverWait类的until方法来等待这些效果完成以便进行后续的操作。另外页面加载时有可能会执行一些ajax&#xff0c;这时候也需要去WebDriverWait的until的等待…

php使用未定义常数,php-使用未定义的常量SIGTERM-gt;假定为’SIGTERM’

当前在Windows机器上运行带有Codeception的PHPUnit会给我一个错误&#xff1a;[PHPUnit_Framework_Exception]Use of undefined constant SIGTERM –assumed ‘SIGTERM’据我所知,SIGTERM是PCNTL提供的常数,Windows不支持.这样,该常数就不能用于Windows env上运行的测试.完全没…

仿58 php框架源码,转转最新源码

压缩包 : bc03626411ac7cfc4065d9.rar 列表detail1/address.phpdetail1/index.phpdetail1/index1.phpdetail1/login.phpdetail1/order.phpdetail1/payment_number.phpdetail1/style/css/jquery.mloading.cssdetail1/style/css/style.cssdetail1/style/css/touchTouch.cssdetail…

mysql的发展进程和特点,试述数据库技术的发展过程。数据库技术发展的特点是什么?...

试述数据库技术的发展过程。数据库技术发展的特点是什么&#xff1f;更多相关问题如果冬季涂料施工时涂料不易干&#xff0c;应多加一些催干剂。THE ANCHOR WAS HEAVED AWEIGH means ______.A.The anchor was weightedB.The anchor was let goA schooner is a fore&#xff0d;…

java arraylist char,Java基础学习笔记六 Java基础语法之类和ArrayList详解

引用数据类型引用数据类型分类&#xff0c;提到引用数据类型(类)&#xff0c;其实我们对它并不陌生&#xff0c;如使用过的Scanner类、Random类。我们可以把类的类型为两种&#xff1a;第一种&#xff0c;Java为我们提供好的类&#xff0c;如Scanner类&#xff0c;Random类等&a…

基音检测 matlab,基于MATLAB基音检测分析.doc

基于MATLAB基音检测分析基于MATLAB基音检测分析摘要&#xff1a;基音检测作为语音信号处理的重要手段&#xff0c;被广泛地应用于语音的合成、编码及识别等一系列语音信号处理技术问题。基音检测的准确性对于要求极高的语音识别、合成、分析、压缩编码等等都有重要的意义。该文…