Encapuslate代码,可能会也可能不会返回值

时间:2017-11-21 12:41:38

标签: c# methods encapsulation return-type

我们说我有一些我想重用的代码。这段代码具有以下属性:它返回某些内容或修改某些数据但不返回任何内容。因此,我不能使它成为一种常用方法(返回类型void是错误的,因为它可能会返回,并且任何返回类型都是错误的,因为它可能不会返回)。

C#是否支持这种"方法"以任何方式,即允许以某种方式封装和重用这样的代码?

以下是一个示例用例:

我有一个界面ITree<T>和许多实现T的课程ITree<T>

interface ITree<T>
{
    public T Child;
    public bool Ignore;
}

我有很多方法将某些类型T的对象实现ITree<T>作为参数,并将某些类作为返回类型。 几乎所有这些方法都是这样的:

MyClass2 SomeMethod(MyClass1 input) // MyClass1 implements ITree<MyClass1>
{
    while (input.Ignore)
    {
        input = input.Child;
        if (input == null)
            return null;
    }

    ... // do MyClass1 specific stuff and finally return some instance of MyClass2
}

因为while循环在任何地方都是相同的,我想将它封装在&#34;方法&#34;中,如下所示:

... WhileLoop<T>(ref ITree<T> input)
{ // can't specify return type because it might return null or nothing at all
    while (input.Ignore)
    {
        input = input.Child;
        if (input == null)
            return null;
    }
}

MyClass2 SomeMethod(MyClass1 input)
{
    WhileLoop(ref input);
        // either returns null or changes input so that input can be used below

    ... // do MyClass1 specific stuff and finally return some element of MyClass2
}

但是因为这个&#34;方法&#34;可能会或可能不会返回某些东西,它不是通常意义上的方法。

3 个答案:

答案 0 :(得分:1)

我可能会误解这个问题,但是如何回复bool

bool MoveToNextNonIgnoreChild<T>(ref ITree<T> input)
{
    while (input.Ignore)
    {
        input = input.Child;
        if (input == null)
            return false;
    }

    return true;
}

MyClass2 SomeMethod(MyClass1 input)
{
    if (!MoveToNextNonIgnoreChild(ref input)) return null;

    ... // do MyClass1 specific stuff and finally return some instance of MyClass2
}

答案 1 :(得分:1)

没有关键字&#34; voidable return&#34;一个功能。 C#不支持这一点,我不认为任何语言都会这样做,因为它会破坏封装(调用方法应该知道返回值将提前或不获得结果)。 你唯一的选择是,返回null,忽略函数的输出或者生成一个带有输出参数的void方法。

答案 2 :(得分:0)

如果我正确理解您的问题,您的界面ITree<T>应该看起来像这样:

interface ITree<T>
{
    public ITree<T> Child;
    public bool Ignore;
}

尽管存在命名问题(它是链接列表而不是树),但找到下一个非忽略子项(或原始输入,如果Ignore为false)的循环可能如下所示:< / p>

public static ITree<T> GetNextNonIgnoreChild(this ITree<T> input)
{
    while (input != null && input.Ignore) input = input.Child;
    return input;
}

用法:

MyClass2 SomeMethod(MyClass1 input) // MyClass1 implements ITree<MyClass1>
{
    input = input.GetNextNonIgnoreChild();
    if (input == null) return null;
    ... // do MyClass1 specific stuff and finally return some instance of MyClass2
}

老实说,这样写的你根本没有明显的代码保存;你不妨写一下:

MyClass2 SomeMethod(MyClass1 input) // MyClass1 implements ITree<MyClass1>
{
    while (input != null && input.Ignore) input = input.Child;
    if (input == null) return null;
    ... // do MyClass1 specific stuff and finally return some instance of MyClass2
}