我们说我有一些我想重用的代码。这段代码具有以下属性:它返回某些内容或修改某些数据但不返回任何内容。因此,我不能使它成为一种常用方法(返回类型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;可能会或可能不会返回某些东西,它不是通常意义上的方法。
答案 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
}