问题标签 [null]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2338 浏览

c# - C# 使用“as”覆盖 Equals 和用于正确性、灵活性和性能的专用方法

我想知道在 C# 中实现正确、灵活和快速的 Equals 的最佳方法,它几乎可以用于任何类和情况。我认为性能需要一个专门的 Equals(将实际类的对象作为参数)。为了避免代码重复,一般的 Equals 应该调用专门的 Equals。空值检查应该只执行一次,即使在继承的类中也是如此。

我终于想出了这个设计:

重要的想法:

  • “as”运算符的用法。这样我们就不必检查一般 Equals 中的空值。错误的类类型会减少为 null,并将在专门的 Equals 中进行排序。
  • 在某一点进行空值检查,即使对于派生类也是如此。
  • 一个接一个地检查属性提供了一个清晰的结构。

这个概念有缺陷,还是我错过了任何条件?

0 投票
12 回答
31000 浏览

javascript - 为什么 JavaScript 中有一个“null”值?

在 JavaScript 中,有两个值基本上表示“我不存在” -undefinednull.

程序员没有分配任何东西的属性 will be undefined,但为了让属性成为nullnull必须显式分配给它。

我曾经认为有必要null因为undefined是一个原始值和null一个对象。不是,即使typeof null会 yield 'object':实际上,两者都是原始值 - 这意味着既不能undefined也不null能从构造函数返回,因为两者都将转换为空对象(必须抛出错误才能在构造函数中声明失败)。

它们也都false在布尔上下文中求值。我能想到的唯一真正的区别是,一个评估为NaN,另一个评估为0在数字上下文中。

那么为什么两者都存在undefinednull如果这只会让程序员null在试图找出是否设置了属性时错误地检查呢?

我想知道的是,是否有人有一个合理的例子,必须使用null它不能用undefined代替来表达。

所以普遍的共识似乎是这undefined意味着“没有这样的财产”,而null意味着“财产确实存在,但没有价值”。

如果 JavaScript 实现实际上会强制执行此行为,我可以忍受 - 但undefined它是一个完全有效的原始值,因此可以轻松地将其分配给现有属性以破坏此合同。因此,如果要确定属性是否存在,则必须使用in运算符或hasOwnProperty()无论如何。再说一遍: 和 的单独值有什么实际undefined用途null

undefined当我想取消设置不再使用但我不想的属性值时,我实际上会使用delete。我应该null改用吗?

0 投票
7 回答
176439 浏览

c++ - 错误:未在此范围内声明“NULL”

在 gcc 4.3 上编译 C++ 时收到此消息

它出现又消失,我不知道为什么。为什么?

谢谢。

0 投票
3 回答
105782 浏览

xml - i:nil="true" 是什么意思?

我有一个 xml,它有带有 i:nil="true" 的节点。这意味着什么?

例如:

这是否意味着不同于:

如果是这样,有什么区别?

0 投票
3 回答
12884 浏览

.net - 使用反射将属性值设置为 Nothing (Null)

编辑:根据 LoveMeSomeCode 的回答,我相信这个问题只出现在 VB.Net 中。

我试图通过将更改的属性的旧值保存在字典中并在需要恢复时通过反射设置它们来将类恢复到以前的状态。我遇到了一个问题,如果旧值是 Nothing (null),我在尝试设置属性时会得到一个空引用异常。这是我尝试过的。

假设每个循环都像这样:

方法一:

方法二:

方法三:

对于这些方法中的每一个,当 pair.Value 为空时,我都会得到一个空引用异常。setter 能够保存一个空值(通常该属性是一个字符串)。我做错了什么或者我该如何解决?

编辑:如果我也直接将它传递给 null,则每种方法都会失败。

编辑:如果他们帮助任何人,这里是堆栈跟踪:

方法 1 System.NullReferenceException:对象引用未设置为对象的实例。在 Microsoft.VisualBasic.CompilerServices.Symbols.Container.InvokeMethod(Method TargetProcedure, Object[] Arguments, Boolean[] CopyBack, BindingFlags Flags) 在 Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateSet(Object Instance, Type Type, String MemberName, Object [] Arguments, String[] ArgumentNames, Type[] TypeArguments, Boolean OptimisticSet, Boolean RValueBase, CallType CallType) at Microsoft.VisualBasic.CompilerServices.Versioned.CallByName(Object Instance, String MethodName, CallType UseCallType, Object[] Arguments) 在myProject .Presenter.CustomerDetailPresenter.RevertCustomer() 在我的文件中:第 378 行

方法 2 System.Reflection.TargetInvocationException:调用的目标已抛出异常。---> System.NullReferenceException:对象引用未设置为对象的实例。在我的项目.Presenter.CustomerDetailPresenter.set_City(String value) --- 内部异常堆栈跟踪结束 --- 在 System.RuntimeMethodHandle._InvokeMethodFast(Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner) 在 System.RuntimeMethodHandle .InvokeMethodFast(Object target, Object[] arguments, Signature sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner) at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfoculture, Boolean skipVisibilityChecks) at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfoculture) at System.RuntimeType.InvokeMember(String name, BindingFlags bindingFlags, Binder binder,System.Type.InvokeMember(String name, BindingFlags invokeAttr, Binder binder, Object target, Object[] args) at System.Type.InvokeMember(String name, BindingFlags invokeAttr, Binder binder, Object target, Object[] args) 在myProject .Presenter.CustomerDetailPresenter.RevertCustomer ()

方法 3 System.Reflection.TargetInvocationException:调用的目标已抛出异常。---> System.NullReferenceException:对象引用未设置为对象的实例。在我的项目.Presenter.CustomerDetailPresenter.set_City(String value) --- 内部异常堆栈跟踪结束 --- 在 System.RuntimeMethodHandle._InvokeMethodFast(Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner) 在 System.RuntimeMethodHandle .InvokeMethodFast(对象目标,对象 [] 参数,签名 sig,MethodAttributes 方法属性,RuntimeTypeHandle typeOwner)在 System.Reflection.RuntimeMethodInfo.Invoke(对象 obj,BindingFlags invokeAttr,Binder binder,Object[] 参数,CultureInfo 文化,布尔 skipVisibilityChecks)

在 System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfoculture) at System.RuntimeType.InvokeMember(String name, BindingFlags bindingFlags, Binder binder, Object target, Object[] providedArgs, ParameterModifier[] 修饰符,CultureInfo 文化,String[] namedParams) 在 System.Type.InvokeMember(String name, BindingFlags invokeAttr, Binder binder, Object target, Object[] args) 在myProject .Presenter.CustomerDetailPresenter.RevertCustomer ()

0 投票
11 回答
28542 浏览

mysql - 何时在 MySQL 表中使用 NULL

我很欣赏数据库表中 NULL 值的语义含义,它不同于 false 和空字符串 ''。但是,我经常阅读有关字段可为空时的性能问题,并建议在 NULL 实际上语义正确的情况下使用空字符串。

什么情况下适合使用可空字段和空值?有哪些取舍?简单地完全避免使用 NULL 并简单地使用空字符串、false 或 0 来表示不存在值是否明智?

更新

好的 - 我了解 '' 和 NULL 之间的语义差异以及 NULL 是适当字段值的(与性能无关的)情况。但是,让我扩展一下暗示的性能问题。这是来自 Schwartz、Zeitsev 等人的优秀“高性能 MySQL” http://www.borders.co.uk/book/high-performance-mysql-optimization-backups-replication-and-more/857673/

MySQL 更难优化引用可空列的查询,因为它们使索引、索引统计和值比较更加复杂。可为空的列使用更多的存储空间,并且需要在 MySQL 内部进行特殊处理。当一个可为空的列被索引时,每个条目需要一个额外的字节,甚至可以导致固定大小的索引(例如单个整数列上的索引)在 MyISAM 中转换为可变大小的索引。

更多内容: Google 图书预览

这很可能是确定的答案——我只是在寻找一线的第二意见和经验。

0 投票
15 回答
10471 浏览

java - 它是否有助于 GC 使 Java 中的局部变量为空

myLocalVar = null;在离开方法之前,我被迫将语句添加到 finally 子句中。原因是为了帮助GC。有人告诉我,下次服务器崩溃时我会在晚上收到短信,所以我最好这样做:-)。

我认为这是没有意义的,因为 myLocalVar 仅限于方法,并且一旦方法退出就会“丢失”。额外的归零只会污染代码,否则是无害的。

我的问题是,这个关于帮助 GC 的神话从何而来?(我被称为“Java 内存书籍”)你知道“权威”的任何文章更深入地解释它吗?有没有可能这不是神话,但真的有帮助?如果是这样,怎么做?将局部变量归零可能会造成任何伤害吗?

为了澄清,方法如下所示:

0 投票
4 回答
20888 浏览

sql - SQL“或”运算符。在以下场景中它是如何工作的?

我一直在优化查询,遇到了一个让我质疑我一直使用 SQL 的 OR 运算符的情况。(SQL Server 2000 也是)

我有一个查询,其中条件 (WHERE) 子句看起来像这样:

现在,我一直理解 SQL 中的 OR 评估了这两个表达式。因此,所有对左侧表达式评估为 true 的记录将与所有在右侧表达式评估为 true 的记录一起返回。例如:

这将返回 COL1 为“测试”的所有记录以及 Col2 为“数据”的任何记录

在上面的示例中,我将 Column2 条件修改为以下内容:

突然间,我返回了 0 行。

我是否误认为 OR 只评估表达式,直到找到 TRUE 结果,或者是否存在会导致 2 个不同返回不同结果的条件?

0 投票
13 回答
419565 浏览

javascript - 如何在jQuery中检查空对象

我正在使用 jQuery,我想检查页面中是否存在元素。我已经编写了以下代码,但它不起作用:

如何检查元素的存在?

0 投票
17 回答
186303 浏览

java - 如何简化 null 安全的 compareTo() 实现?

我正在compareTo()为这样的简单类实现方法(以便能够使用Collections.sort()Java 平台提供的其他好东西):

我希望这些对象的自然排序是:1)按名称排序,2)如果名称相同,则按值排序;两种比较都应该不区分大小写。对于这两个字段,空值是完全可以接受的,因此compareTo在这些情况下不能中断。

想到的解决方案如下(我在这里使用“保护条款”,而其他人可能更喜欢单个返回点,但这不是重点):

这可以完成工作,但我对这段代码并不完全满意。诚然,它不是复杂,但相当冗长乏味。

问题是,您将如何减少冗长(同时保留功能)?如果有帮助,请随意参考 Java 标准库或 Apache Commons。使这(一点)更简单的唯一选择是实现我自己的“NullSafeStringComparator”,并将其应用于比较两个字段吗?

编辑 1-3: Eddie 是对的;修复了上面的“两个名字都为空”的情况

关于接受的答案

我在 2009 年问过这个问题,当然是在 Java 1.6 上,当时Eddie 的纯 JDK 解决方案是我首选的公认答案。直到现在(2017 年),我才开始改变它。

还有第 3 方库解决方案——一个 2009 Apache Commons Collections 一个和一个 2013 Guava 一个,都是我发布的——我在某个时间点确实更喜欢它们。

我现在将Lukasz Wiktor的干净Java 8 解决方案作为公认的答案。如果在 Java 8 上,这绝对应该是首选,而如今几乎所有项目都应该使用 Java 8。