嗨,我有与此类似的C#代码:
int someNumber;
Thing someThing;
doStuff(out someNumber);
someThing = new Thing(someNumber);
Run Code Online (Sandbox Code Playgroud)
我想知道的是,是否有任何方法可以删除someNumber并直接在参数参数中实例化someThing.
编辑actaul代码给了我8个参数,但我只是想保持简单所以它更像是:
int someNumber1, someNumber2, somNumber3, someNumber4,
someNumber5, someNumber6, someNumber7, someNumber8;
Thing someThing1, someThing2, someThing3, someThing4,
someThing5, someThing6, someThing7, someThing8;
doStuff(out someNumber1, out someNumber2, out someNumber3, out someNumber4,
out someNumber5, out someNumber6, out someNumber7, out someNumber8);
someThing1 = new Thing(someNumber1); etc.....................
Run Code Online (Sandbox Code Playgroud)
好吧,如果你发现自己经常这样做,你可以这样做:
public delegate void OutAction<T>(out T value);
public TResult UseOut<TIntermediate,TResult>
(OutAction<TIntermediate> outAction,
Func<TIntermediate,TResult> selector)
{
TIntermediate tmp;
outAction(out tmp);
return selector(tmp);
}
Run Code Online (Sandbox Code Playgroud)
然后调用它(注意doStuff这里是一个方法组 - 缺乏()是故意的!):
Thing someThing = UseOut(doStuff, x => new Thing(x));
Run Code Online (Sandbox Code Playgroud)
我不一定说这是一个好主意,只需考虑一下.
编辑:当你开始获得多个参数时,它变得更加困难 - 因为out参数可能是第一,第二,第三,第四等...
编辑:稍微简单的版本:
public TResult ReturnOut<TResult>(OutAction<TResult> outAction)
{
TResult tmp;
outAction(out tmp);
return tmp;
}
Run Code Online (Sandbox Code Playgroud)
用法:
Thing someThing = new Thing(ReturnOut(doStuff));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
645 次 |
| 最近记录: |