【发布时间】:2018-01-10 08:39:06
【问题描述】:
正如 8 年前Here 提出的问题,但我认为应该有一种方法(新模式、新设计、新架构或其他任何东西。)强制方法不返回 null。
如您所知,在一种对我来说很重要的方法中返回 null 有一些含义:
在消费端处理 null 和可理解的语义,例如:
方法:
public ClassName Do()
{
...
return null;
}
并致电Do() 喜欢(也请注意评论):
var objVal = Do();
//Accessing property of ClassName raised exception
var pnVal = objVal.PropName;//Exception id objVal is null
//But I should handle if it is not null then do anything I want
if(objVal!= null)
{
//Do something
}
通过上述方式在产品上出现许多问题后,我得出了这个结论,以概括所有方法以遵循一种可读、干净和防止语义模糊的模式。
所以一个非常基本的方法是使用Struct 类型,因为结构不能是 null ,如果方法的返回类型是结构,那么它们就不能返回 null 并且我们在编译时知道这一点 不在运行时。
所以我实现了上面的方法:
1- 为方法创建 DTO out 和 in,在这种情况下只需 out:
public struct Do_DTO_Out
{
public ClassName Prop1 { get; set; }
public bool IsEmpty
{
get
{
return Prop1 == null;
}
}
public static Do_DTO_Out Empty
{
get
{
return new Do_DTO_Out() { Prop1 = null };
}
}
}
2- Do 方法应该是:
public Do_DTO_Out Do()
{
try
{
return manipulatedObj;
}
catch (Exception exp)
{
}
return Do_DTO_Out.Empty;
}
3- 在消费端:
var objVal = Do();
if (!objVal.IsEmpty)
//Do something
struct 是最好的方法吗?是否值得更改所有方法并为每个方法创建 DTO in 和 out(我认为是这样)。
有没有更好的方法来做到这一点,任何想法、帮助、答案都将不胜感激。
【问题讨论】:
-
@Aria 方法不会返回
null因为它返回的是一个结构,但它仍然返回一个带有空引用的结构,如果您检查IsEmpty那么您有相同的代码(在调用点),如果你不这样做,那么你有完全相同的异常(在调用点)。您只需支付一些开销(并为原始代码添加一些晦涩难懂的内容)。如果这是不能发生的事情,那么我同意帕特里克的观点:代码合同(或者,如果你的目标是核心,至少是断言)。 -
“如您所知,在方法中返回 null 存在一些问题” - 会是什么?肯定有“暗示” - 但问题 ?
-
所以你用更糟糕的方法来规避它? @阿里亚
-
@Aria 请注意,如果
null永远不允许(并且您不能引入合同),那么您应该在假设的NotNull<T>结构中进行一些检查(至少在值为是创建的,而不是在使用时创建的(可能会在以后以不明显的方式进行优化)。 -
@Fildor 已编辑的问题已更改为含义,谢谢我的英语仍然很弱。
标签: c# oop null nullreferenceexception