“ x为null”和“ x == null”有什么区别?

在C#7中,我们可以使用 if (x is null) return; 代替 if (x == null) return; 使用新方法(以前的示例)比旧方式有任何优势吗? 语义有什么不同吗? 这只是一个品味问题吗?如果没有,我什么时候应该使用另一个? 参考:C#7.0中的新功能。 答案 Update: 罗斯林编译器已更新以使两个运营商的行为相同当没有超负荷运算符时 。请看当前编译器结果中的代码((M1和M2在代码)中显示没有超载平等比较时发生的情况。他们俩现在都有表现更好的==行为。如果有超载平等比较,代码仍然有所不同。 有关罗斯林编译器的较旧版本,请参见以下分析。 为了null与C#6相关的习惯没有区别。但是,当您更改时,事情变得有趣null达到另一个常数。 以此为例: Test(1); public void Test(object o) { if (o is 1) Console.WriteLine("a"); else Console.WriteLine("b"); } 测试产生a。如果将其比较o == (object)1您通常会写的是,它确实有很大的不同。is考虑比较另一侧的类型。太棒了! 我觉得== nullVS.is null恒定模式只是"偶然"非常熟悉的东西,其中的语法is操作员和等价运算符得出相同的结果。 作为斯维克评论,is null呼叫System.Object::Equals(object, object)在哪里==呼叫ceq。 伊尔为is: IL_0000: ldarg.1 // Load argument 1 onto the stack IL_0001: ldnull // Push a null reference on the stack IL_0002: call bool [mscorlib]System.Object::Equals(object, object) // Call method indicated on the stack with arguments IL_0007: ret // Return from method, possibly with a value 伊尔为==:...

“零或零”的最佳Ruby习语

我在找一个简明的方式来检查一个值是否等于零或零。 if (!val || val == 0) # Is nil or zero end 但这看起来非常笨拙。 答案 对象有一个*零?*方法。 if val.nil? || val == 0 [do something] end 或者,仅针对一条指令: [do something] if val.nil? || val == 0 来自: stackoverflow.com

Alter表,在NOT NULL列中设置NULL,PostgreSQL 9.1

我有一个没有零列的表,如何在此列中设置一个null值,为默认值? 我的意思是,我想做这样的事情: postgres=# ALTER TABLE person ALTER COLUMN phone SET NULL; 但这表明: postgres=# ALTER TABLE person ALTER COLUMN phone SET NULL; ERROR: syntax error at or near "NULL" LINE 1: ALTER TABLE person ALTER COLUMN phone SET NULL; 答案 ALTER TABLE person ALTER COLUMN phone DROP NOT NULL; 手册中的更多细节:http://www.postgresql.org/docs/9.1/static/sql-altertable.html 来自: stackoverflow.com

Android Intent.getStringExtra() 返回 null

这是将字符串添加到 Extras 的方式: Intent i = new Intent(); i.putExtra("Name", edt_name.getText()); i.putExtra("Description", edt_desc.getText()); i.putExtra("Priority", skb_prior.getProgress()); setResult(RESULT_OK, i); finish(); 这就是我尝试将它们提取出来的方法onActivityResult(): String name = data.getStringExtra("Name"); String desc = data.getStringExtra("Description"); int prior = data.getIntExtra("Priority", 50); 但是在第二个代码块之后name和desc是null的,虽然prior有其应有的价值。data.mExtras.mMap包含所需的字符串,但仅在第一次请求之后才包含。 答案 当您插入您的Extras尝试添加.toString() i.putExtra("Name", edt_name.getText().toString()); 你正在看到CharSequence那里的值,但你需要将其转换为String打电话getStringExtra()。Strings。int因为这样做是正确的 来自: stackoverflow.com

AngularJS 未定义或为 null

当我编写手表处理函数时,我检查 newVal 参数undefined和null。angular.isUndefined但不是angular.isUndefinedOrNull。 Edit: 这个例子: $scope.$watch("model", function(newVal) { if (angular.isUndefined(newVal) || newVal == null) return; // do somethings with newVal } 这种处理方式是普遍接受的做法吗? Edit 2: JSFiddle 示例(http://jsfiddle.net/ubA9r/): <div ng-app="App"> <div ng-controller="MainCtrl"> <select ng-model="model" ng-options="m for m in models"> <option value="" class="ng-binding">Choose model</option> </select> {{model}} </div> </div> var app = angular.module("App", []); var MainCtrl = function($scope) { $scope.models = ['Apple', 'Banana']; $scope.$watch("model", function(newVal) { console.log(newVal); }); }; 答案 您始终可以根据您的应用程序准确添加它 angular.isUndefinedOrNull = function(val) { return angular....

Avoiding NullPointerException in Java

我用object != null很多要避免的NullPointerException。 什么是替代方法: if (someobject != null) { someobject.doCalc(); } 答案 对我来说,这听起来像是中级开发人员在某个时候面临的一个相当普遍的问题:他们要么不知道或不信任他们所参与的合同,而且防守地超过了无效的。此外,在编写自己的代码时,他们倾向于依靠返回零来指示某些内容,从而需要呼叫者检查nulls。 换句话说,有两个实例进行了无效检查: 零是合同方面的有效响应;和 它不是有效的回应。 (2)很容易。从Java 1.7开始,您可以使用Objects.requireNonNull(foo)。(如果您遇到了以前的版本,则assert离子可能是一个很好的选择。) “正确"此方法的用法如下所示。该方法返回传递到其中的对象并抛出一个NullPointerException如果对象为空。这意味着返回的值始终是非零的。该方法主要用于验证参数。 public Foo(Bar bar) { this.bar = Objects.requireNonNull(bar); } 它也可以像assert虽然离子由于对象为null而引发异常。在两种用途中,都可以添加一条消息,该消息将在异常中显示。以下是像断言一样使用它并提供消息。 Objects.requireNonNull(someobject, "if someobject is null then something is wrong"); someobject.doCalc(); 通常会抛出特定的例外NullPointerException当一个值无效但不应该抛出更普遍的例外AssertionError。这是Java库采用的方法;偏爱NullPointerException超过IllegalArgumentException当不允许参数为null时。 (1)有点困难。如果您无法控制要调用的代码,那么您就会卡住。如果null是有效的响应,则必须检查它。 但是,如果您确实控制了它,但是(通常是这种情况),那是一个不同的故事。避免使用零作为响应。借助返回集合的方法,很容易:返回空的集合(或数组),而不是始终返回空。 对于非收集,这可能会更难。以此为例:如果您有这些接口: public interface Action { void doSomething(); } public interface Parser { Action findAction(String userInput); } 解析器获取原始用户输入并找到要做的事情的地方,也许如果您要为某些东西实现命令行接口。现在,如果没有适当的措施,您可能会签订其返回零的合同。这导致了您正在谈论的无效检查。 另一种解决方案是永远不要返回null,而是使用空对象模式: public class MyParser implements Parser { private static Action DO_NOTHING = new Action() { public void doSomething() { /* do nothing */ } }; public Action findAction(String userInput) { // ....

C

我的问题可能听起来有点愚蠢,但每次我面对它时都会让我烦恼。 where value.HasValue 和 where value != null HasValue 是否检查value一片空白? 答案 它们都做同样的事情,只需选择一个并坚持下去,这样你就能保持一致性。 来自: stackoverflow.com

C 中的指针使用 NULL 或 0(零)吗?

在 C 的早期,当它固定在 C 之上时,你不能使用 NULL,因为它被定义为(void*)0。void*,这使得它有点无用。0(零)表示空指针。 直到今天,我仍然继续使用零作为空指针,但我周围的人坚持使用NULL。NULL)到现有值 - 因为我也喜欢将指针测试为真值: if (p && !q) do_something(); 那么使用零更有意义(就像你使用NULL,你不能逻辑地使用p && !q- 你需要明确地比较NULL,除非你假设NULL为零,在这种情况下为什么要使用NULL)。 是否有任何客观原因让我们更喜欢零而不是 NULL(反之亦然),或者这一切都只是个人喜好? 编辑:我应该补充一点(最初的意思是),对于 RAII 和异常,我很少使用零/NULL 指针,但有时您仍然需要它们。 答案 以下是 Stroustrup 对此的看法:C 风格和技术常见问题解答 在 C 中,定义NULL是0,所以只有审美上的差异。NULL人们有时会错误地认为它不同于 0 和/或不是整数。NULL有时被定义为不合适的东西,因此必须避免。 如果必须命名空指针,请调用它nullptr;nullptr将是一个关键字。 也就是说,不要为小事而烦恼。 来自: stackoverflow.com

C:与 NULL 比较

抛开宗教争论不谈: 选项1: if (pointer[i] == NULL) ... 选项2: if (!pointer[i]) ... 在 C 中,选项 1 在功能上等同于选项 2 吗? 由于没有比较,后者是否解决得更快? 答案 我喜欢第二个,其他人喜欢第一个。 事实上,我更喜欢第三种而不是第一种: if (NULL == ptr) { ... } 因为那时我: 不会错过,只需输入一个= 不会错过== NULL如果条件很长(多行),则将其误认为相反 在功能上它们是等效的。 即使一个NULL指针不为"0"(全零位),if (!ptr)与NULL指针。 **The following is incorrect. It’s still here because there are many comments referring to it:**但是,不要将指针与文字零进行比较。 来自: stackoverflow.com

char 数组的空终止

考虑以下情况: #include<stdio.h> int main() { char A[5]; scanf("%s",A); printf("%s",A); } 我的问题是如果 charA[5]仅包含两个字符。A[0]='a',A[1]='b'和A[2]='\0'。'\0'在这种情况下。A[5]包含'\0'?sizeof(A)将始终返回 5 作为答案。'\0'哪个sizeof()不算? 答案 如果输入超过四个字符,则多余的字符和空终止符将写入数组末尾之外,覆盖不属于数组的内存。 C 不会阻止您破坏不属于您的内存。undefined behavior。 这是一个很好的例子来说明为什么scanf("%s")是危险的,切勿使用。fgets(): fgets() 最多读入one less than size从流中读取字符并将它们存储到 s 指向的缓冲区中。 例子: if (fgets(A, sizeof A, stdin) == NULL) { /* error reading input */ } 令人烦恼的是,fgets() 会在数组末尾留下一个尾随换行符(’\n’)。 size_t length = strlen(A); if (A[length - 1] == '\n') { A[length - 1] = '\0'; } 啊。scanf("%s")已经变成了7行怪物。 来自: stackoverflow.com

char*的数组应该以' 0'或“ 0”结尾?

可以说我们有一系列的char指针 char* array[] = { "abc", "def" }; 现在应该说什么? char* array[] = { "abc", "def", '\0' }; 或者 char* array[] = { "abc", "def", "\0" }; 不过,两者都起作用。我们只需要将条件相应地检查结束 喜欢 array[ index ] != '\0'; 或者 array[ index ] != "\0"; 我的问题是哪一种是更好的方法?大多数程序员使用哪个? Edit 大多数答案表明,null比’\ 0’和" \ 0"更好。但是我一直以为 null与" \ 0"相同,与0x0或0相同 这是错的吗? 答案 我会结束NULL。为什么?因为你不能做任何一个: array[index] == '\0' array[index] == "\0" 第一个是比较char *到char,那是不是你想要什么。 array[index][0] == '\0' 第二个甚至不起作用。您正在比较一个char *到char *是的,但是这种比较毫无意义。如果两个指针指向同一记忆,它会通过。你不能使用==要比较两个字符串,您必须使用strcmp()函数,因为除了一些(我的意思是很少)语法细节之外,C 没有对字符串的内置支持。 array[index] == NULL 工作正常,并传达您的观点。...

collections.emptylist()而不是null检查?

如果我在某些类中很少使用的集合可以实例化多次,则有时我可能会诉诸以下"成语",以保存不必要的对象创建: List<Object> list = null; void add(Object object) { if (list == null) list = new ArrayList<Object>(); list.add(object); } // somewhere else if (list != null) for (Object object : list) ; 现在我想知道我是否无法消除那些无效的检查Collections.emptyList()但是,但是我必须更改IF检查add()像这样: if (list == Collections.<Object>emptyList()) list = new ArrayList<Object>(); 除了每次都分配一个新的空系列外,还有更好的方法可以处理此问题吗? EDIT: 只是要清楚,我想使用collections.emptylist(),但是上面的add()中的检查确实很丑陋…我想知道是否有更好的方法可以做到这一点,甚至是一种处理此操作的其他方法。 答案 in order to save unnecessary object creations 这是一个非常糟糕的主意,它会使您的代码乱扔== null检查角案件的检查和其他处理(大概最终会遇到空指针例外)! Now I was wondering if I couldn’t eliminate those null checks using Collections.emptyList() 不,不是真的。emptyList()返回一个空列表。你可以做 if (list.equals(Collections.<Object>emptyList())) but that will still throw a NullPointerException if list == null,所以这仍然不是您所追求的。...

C中EOF和'�'的值是什么

我知道EOF和'\0'是整数类型,但如果是的话,它们不应该有一个固定值吗? 我打印了两者并得到了-1EOF0 表示'\0'。 我也有这个 int a=-1; printf("%d",a==EOF); //printed 1 的值是EOF和'\0'固定整数? 答案 EOF是一个宏,它扩展为类型为整型常量表达式int以及依赖于实现的负值,但通常为 -1。 '\0'是一个charC 中值为 0 且intC 中的值为 0。 之所以printf("%d",a==EOF);导致1是因为你没有赋值EOF到a。a等于EOF既然这是真的(a == -1 == EOF)它打印了1。 来自: stackoverflow.com

DateTime“ null”值

我一直在搜索很多,但找不到解决方案。您如何处理应该能够包含非初始化值(相当于NULL)的日期时间?我有一个可能设置DateTime属性值的类。我正在考虑将属性持有人初始化为dateTime.minvalue,然后很容易检查。我想这是一个非常普遍的问题,您该怎么做? 答案 对于普通的日期时间,如果您根本不初始化它们,那么它们将匹配DateTime.MinValue,因为它是值类型而不是参考类型。 您还可以使用像这样的可无效的日期时间: DateTime? MyNullableDate; 或更长的形式: Nullable<DateTime> MyNullableDate; 最后,有一种内置的方式来引用任何类型的默认值。这返回null对于参考类型,但是对于我们的日期示例,它将返回与DateTime.MinValue: default(DateTime) 或者,在C#的最新版本中, default 来自: stackoverflow.com

getActivity()返回片段功能中的null

我有一个带有这样的公共方法的片段(F1) public void asd() { if (getActivity() == null) { Log.d("yes","it is null"); } } 是的,当我称其为(来自活动)时,它是无效的… FragmentTransaction transaction1 = getSupportFragmentManager().beginTransaction(); F1 f1 = new F1(); transaction1.replace(R.id.upperPart, f1); transaction1.commit(); f1.asd(); 这一定是我做错了什么,但我不知道那是什么。 答案 commit计划交易,即不会直接发生,而是在主线程准备就绪时安排在主线程上的工作。 我建议添加一个 onAttach(Activity activity) 方法Fragment并在上面放一个断点,看看何时将其相对于您的调用asd()。您会看到它是在您调用的方法之后调用的asd()退出。这onAttach呼叫是Fragment与之相关,从此开始getActivity()将返回非无效(nb也有一个onDetach()称呼)。 来自: stackoverflow.com