在我目前的Net Framework 4项目中,我这样做了:
这看起来如下:
MyClassName obj = MyClassName.GetObject("Name").DoJob().Close();
,其中
this
并在GetObject失败时抛出System.NullReferenceException
,或者其间的任何内容都失败。 问题:是否可以按照我想要的方式设计,没有try-catch块?我希望有许多一个衬垫而不是try - lineOfCode - catch
。每一行都将是另一个执行其特定任务并摧毁自身/被遗忘的对象。我也不需要使用MyClassName obj =
部分。
答案 0 :(得分:3)
您可以返回null对象作为Null Object pattern的一部分,而不是返回null
值。
在这种情况下,当DoJob
和Close
被调用并且只返回时,此对象将不执行任何操作。
可能需要定义某种简单的类层次结构来实现此模式。当你现在只有一个班级时,这似乎有点矫枉过正。
答案 1 :(得分:0)
zerkms建议的第二个选项是使用某种Option
类型而不是可以为空的值。
因此,使用Option library进行C#。您的代码可能类似于:
// simplified skeleton
class MyClassName
{
private MyClassName() {}
public MyClassName GetObject(string name)
{
return new MyClassName();
}
public MyClassName DoJob() { return this; }
public MyClassName Close() { return this; }
}
Option<MyClassName> obj = MyClassName.GetObject("Name").ToOption().Select(x=>x.DoJob()).Select(x=>x.Close());
if (obj.HasValue)
{
// can work with obj.Value
}
else
{
// somewhere was null
}
是的,我同意有一些噪音,但这些都是语言的限制。