6
|
Sergio Tapia · 技术社区 · 15 年前 |
![]() |
1
15
听起来,如果在方法中收到错误的参数,您可能不确定该怎么做。您现在所做的并没有本质上的错误,但是更常见的模式是检查方法头中的参数,如果这些参数不是您期望的,则抛出异常:
这是一种常见的防御性编程模式——检查以确保提供的数据通过基本的健全性检查。
现在,如果您自己显式地调用这个方法,并且发现这个方法接收到一个空值
|
![]() |
2
4
我可能会被“没有多个出口”的人群否决,但我通常会在方法的开头简单检查一下:
这指定了退出条件,然后您就不需要担心方法中存在多个级别的缩进。只有当你能接受你的列表是空的或者是空的这一事实时,这才有效——这在某些情况下可能发生。 但我同意codeka,因为你需要看看调用代码,并找出是否可以从中改进它。 |
![]() |
3
2
似乎防御性编程和参数验证是您要寻找的。 正如其他人所说,简单的参数验证可以为您工作:
或者,如果您厌倦了为每个参数不断地编写这样的检查,那么您可以签出许多开放源码.NET前提条件强制库中的一个。我喜欢 CuttingEdge.Conditions . 这样,您就可以使用如下内容:
但是,设置上述任何一种前提条件都只会指定您的方法不接受空值。 你的问题仍然存在于你 是 将空值传递到方法中!要解决这个问题,您必须检查调用方法的是什么,并找出传入空对象的原因。 |
![]() |
4
1
除了抛出ArgumentNullException异常之外,还有一个叫做“空obejct模式”的东西,如果您 希望 传递一个空值,例如,表示某个东西不存在,但不想显式地检查空值。本质上,它是一个实现相同接口的存根类,但是它的方法通常是空的,或者返回的值足以使它们完成。 http://en.wikipedia.org/wiki/Null_Object_pattern 对于不能轻易地表示不存在的值类型(不能为空)也很有用。 |
![]() |
5
0
如果输入无效,我将提前返回(或提前抛出InvalidArgumentException)。 例如:
或者,您可以使用常规的空合并模式:
|
![]() |
6
0
你的确问错了问题。正确的问题是“空值是否表示无效的输入或表示x的标志”。 在向语言中添加非空引用类型并使其成为各种API之前,您可以选择在代码中显式地使用该类型,或者让空引用异常帮助您找到违反期望的位置,然后以某种方式修复数据/代码。 |
![]() |
A B · C#Excel自动调整列避免长文本时出错 6 月前 |
![]() |
Megrez7 · C#ToArray转换合并为一行,导致数组元素更改 6 月前 |
![]() |
Aycon · 在工厂方法中释放部分创建的对象的正确方法是什么? 6 月前 |
|
Sei · Avalonia/WPF将路由器传递到控制模板 6 月前 |