作者wind681201 (阿风~~)
看板C_Sharp
标题[心得] 真的很讨厌null
时间Fri May 5 22:54:45 2017
null这个东西,真的是很讨厌,虽然它叫做连空白也没有。
但,没有就没有,干麻报错。
举个例来说:
我有一个 class 叫person ,里面有人名,年纪二个栏位
若我查询 人名叫josn 的就怎样怎样。
假设这个person是null
if(person.name == "josn"){怎样。}
就错,为什麽不直接跳过去就好,因为我只是判别呀。
而非要写成
if(person != null && person.name == "josn"){怎样。}
就这样,就要多几个字,很讨厌
由上面的例子,person 是null 那在person.name 当然就不可能为josn,就
跳过去就好,干麻要报错。
由其是dictionary物件,为了安全,非要一个containskey,先看有没有再处理。
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 218.161.78.48
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_Sharp/M.1493996089.A.75B.html
1F:推 yeo1987: 可改用person?.name == "json" / Dictionary.TryGetValue 05/05 23:01
2F:→ yeo1987: josn, 打错=.= 05/05 23:02
3F:→ wind681201: 若person是null,name也是null的话,就没办法了吧 05/05 23:09
4F:→ wind681201: tryGetValue,是好一点,但还是不能直接用 05/05 23:10
5F:→ wind681201: 就是还是要多一层判别 05/05 23:10
7F:→ vi000246: 原来一楼有贴了 05/06 00:03
8F:→ vi000246: 不然就用try{...} catch(){} 略过exception就好 05/06 00:04
9F:推 e23882: NullReferenceException 05/06 01:45
10F:→ ssas1115577: 逻辑问题,就像是我想透过看我钱包这个动作来看我还 05/06 02:31
11F:→ ssas1115577: 有多少钱,但其实我根本没有钱包 05/06 02:31
12F:→ IKAFIRE: 拜托不要用try catch做这种简单的判断 05/06 11:22
13F:推 james732: 同一楼,用?应该可以简化 05/06 11:46
14F:推 skitty: .ToString 05/06 21:59
15F:→ testPtt: 那你就不要让他null不就好了 05/07 00:23
16F:嘘 jizang: 宣告马上给初始值。 05/07 00:42
17F:→ ssccg: 没有值就是null,不是什麽东西都适合有初始值 05/07 02:59
18F:→ ssccg: 是说 ?. 已经很方便了啊 05/07 03:08
19F:嘘 bizer: 没有人又怎会有名子,写程式本来最好就严谨点,bug才比较少 05/07 04:39
20F:→ vi000246: 查到一个GetValueOrDefault()可以试试 05/07 10:55
21F:嘘 jizang: 给初始值 String.Empty 是一种习惯!编译器都会给警告~ 05/07 11:22
22F:→ wind681201: 其实理论我懂,只是觉得null 不等於json干麻要报错 05/07 17:49
24F:→ vi000246: 只是正确的解法应该是呼叫前就要判断null 05/07 19:34
25F:→ wind681201: 谢谢~~~ 05/07 20:36
26F:嘘 Litfal: 3F在说什麽...name也是null又怎样? 05/07 20:54
27F:→ uranusjr: 请爱用 null object pattern, 或改写 Objective-C 05/08 02:30
28F:推 soheadsome: 用optional啊 05/08 18:16
29F:推 s4300026: 只有我喜欢null吗? 我一直困扰着没有任何东西代表没有 05/08 18:37
30F:→ s4300026: 东西,就像是-1与1之间的 “没有”般的喜爱,与其自 05/08 18:37
31F:→ s4300026: 己定义,倒不如有个固定的东西可以指派。 举例来说,如 05/08 18:37
32F:→ s4300026: 果你要求输入自然数为变数,你可能会在意没有输入值的 05/08 18:37
33F:→ s4300026: 情况,或许任何负数都可以代表这个情形,但你不觉得交 05/08 18:37
34F:→ s4300026: 由null是更好的一件事情吗? 05/08 18:37
35F:→ ssccg: 不要跳exception的话就很好 05/08 20:44
36F:推 outofyou: 想过这个问题,觉得让 05/10 00:47
37F:→ outofyou: ((person)null).name == (string)null好像可以,但又不 05/10 00:47
38F:→ outofyou: 想自己写compiler,所以发现C#有?.的语法时有惊喜到。 05/10 00:47
39F:→ outofyou: 但dictionary会分不清d[key].value==null及d[key]==null 05/10 00:48
40F:→ outofyou: 上一句错了,dictionary确认有没有此key很正常吧 05/10 00:58
41F:→ jinmin88: 相信我 如果没null可用某些状况下你会更想哭 05/11 04:56
42F:嘘 s89227: 遇到NullException表示你的逻辑设计有问题,Compiler才讨 05/12 21:12
43F:→ s89227: 厌你吧,好心提醒你没好报! 05/12 21:13
44F:→ ssccg: null exception是runtime的吧? 跟compiler有关系? 05/13 06:24
45F:→ s89227: ……对欸,我脑袋一时糊涂了,谢谢楼上提醒QQ 05/15 01:31
46F:→ AizawaYuuiti: 当person == null的时候,别说person.name是否等於 05/19 14:58
47F:→ AizawaYuuiti: john了,person是无法读取name属性的 05/19 14:59
48F:→ AizawaYuuiti: 一般来说我会先在外面判断null,不是才进去做事 05/19 14:59
49F:→ AizawaYuuiti: 是的话直接置底报错或跳过,因为有时候null是代表 05/19 15:00
50F:→ AizawaYuuiti: 那里就是真的没东西,而不是不是你要的东西 05/19 15:00
51F:→ AizawaYuuiti: 如果你没去检查是否有旧的物件残留,有时候会有逻辑 05/19 15:01
52F:→ AizawaYuuiti: 上的盲点 05/19 15:01
53F:→ AWEN221: 不喜欢就自己覆写运算子...... 05/31 14:45
54F:→ AWEN221: 等有天你自以为都有赋值CODE量又很多 就需要它报错了 05/31 14:50