Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 没有构造对象时的方法链接_C#_Fluent Interface - Fatal编程技术网

C# 没有构造对象时的方法链接

C# 没有构造对象时的方法链接,c#,fluent-interface,C#,Fluent Interface,在我当前的Net Framework 4项目中,我做了以下工作: 将我的类构造函数定义为private 调用静态类方法以获取该类的对象 调用新构造的对象的方法,可能会失败 这将以以下方式显示: MyClassName obj = MyClassName.GetObject("Name").DoJob().Close(); 在哪里 GetObject是一个静态方法,它返回MyClassName或NULL的实例。我特别希望在创建失败时返回NULL,因为我没有想到其他方法 DoJob和Close是实

在我当前的Net Framework 4项目中,我做了以下工作:

将我的类构造函数定义为private 调用静态类方法以获取该类的对象 调用新构造的对象的方法,可能会失败 这将以以下方式显示:

MyClassName obj = MyClassName.GetObject("Name").DoJob().Close();
在哪里

GetObject是一个静态方法,它返回MyClassName或NULL的实例。我特别希望在创建失败时返回NULL,因为我没有想到其他方法 DoJob和Close是实例方法,它们返回该方法,并在GetObject失败或两者之间的任何操作失败时抛出System.NullReferenceException。 问题是:是否有可能以我想要的方式设计它,而不使用try-catch块?我想要很多很多单行代码,而不是try-lineOfCode-catch。每一条线都将是另一个执行其特定任务的物体,并且会自我毁灭/被遗忘。我也不需要使用MyClassName obj=part。

您可以将null对象作为函数的一部分返回,而不是返回null值

在这种情况下,当调用DoJob和Close时,该对象将不执行任何操作,只返回自身


可能的问题可能是需要定义某种简单的类层次结构来实现此模式。当您现在只有一个类时,这可能看起来有些过分。

zerkms建议的第二个选项是使用某种选项类型,而不是可为空的值

因此,使用for 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
}

是的,我同意有一些噪音,但这些是语言的限制。

这就是C6的空条件运算符的位置?。一定要发光!嗯,我应该提到,我正在为这个项目与NETFramework4合作。。。。。。或者,如果你对命令式OO范式太厌倦了,他们可能会实现一个相反的PS:链接是随机的,但文章看起来是合法的PPS:这看起来也很有希望:@zerkms C中的Maybe's的问题是缺乏语言支持。像选项类型这样的东西只有在您有语言支持时才有意义,因为否则,您就有大量的样板代码。但对我来说,它看起来更容易接受:var result=MaybeGetAnInt.Match Just:v=>v*10,Nothing:0;它简洁易读,在实践了一些之后,我刚刚创建了NullClassName,它是从MyClassName和虚拟化键方法派生的。当创建失败时,我会创建并返回NullObject,然后它什么也不做。问题是我需要为剩余的MyClassName1、MyClassName2等定义NullClassName1、NullClassName2、NullClassName3。。。好吧,没关系,只要我不必担心异常。感谢您为我指明了正确的方向: