好的说我有以下简单的课程:
public interface IResult<T>
{
T Results { get; set;}
string Message { get; set;}
}
public class Result<T> : IResult<T>
{
T Results { get; set;}
string Message { get; set;}
}
public class Result2<T> : IResult<T>
{
T Results { get; set;}
string Message { get; set;}
}
现在当我想调用一些方法来返回一个IResult时,哪种方法是正确的?
public class TestClass
{
public bool TryDoSomething(out IResult<bool> result)
{
// Do stuff
result.Message = "Out!";
return true; // for example
}
public IResult<bool> DoSomething(IResult<bool> result)
{
// Do Stuff
result.Message = "Sent in!";
result.Result = true;
return result;
}
public IResult<bool> DoSomething()
{
// Do Stuff
IResult<bool> result = new Result<bool>();
result.Message = "I'm a Result!";
result.Result = true;
return result;
}
}
现在说我实际上想要一个Result2,最好是创建它并将其作为参数(方法#1或#2)发送或者创建一个新的结果但是将其重新设置为IResult然后重命名为Result2,如方法# 3?
public class GetResults
{
public void GetResults()
{
Result2<bool> results = new Result2<bool>();
if (TryDoSomething(out results))
{
Debug.WriteLine(results.Message);
}
results = DoSomething(results);
if (results.Result) Debug.WriteLine(results.Message);
results = DoSomething();
if (results.Result) Debug.WriteLine(results.Message);
}
}
因此,最好在Method中创建我的接口实现,还是将其作为参数发送?
答案 0 :(得分:3)
你应该只使用out
参数作为最后的手段 - 除非真的想要从同一个方法中有效地返回两个值,并且你有充分的理由不封装他们在一起(或使用Tuple
),我绝对不会建议第一种方法。 (bool
意味着什么?)
如果目标是操纵现有对象,那么第二种方法是合适的 - 但如果目标是创建结果(这是更常见的,IMO )然后第三种方法是最合适的方法。
当我们没那么多时,很难给出具体的建议,但我个人赞成实用的不可变类型,无论如何都排除了第二种方法。
关于“我真的想要一个Result2
” - 想要一个Result2
的问题?调用代码,还是返回结果的方法?通常,如果您正在创建结果,那么“创建”代码更适合了解它想要使用的实现。
答案 1 :(得分:1)
从你的评论到Jon的答案之后,调用者可以指定所需的类型而不创建对象,假设该类具有公共无参数构造函数:
public TResult DoSomething<TResult, U>() where TResult : IResult<U>, new()
{
// Do Stuff
TResult result = new TResult();
result.Message = "I'm a Result!";
result.Result = true;
return result;
}
用法:
Result<bool> result1 = DoSomething<Result<bool>, bool>();
Result2<bool> result2 = DoSomething<Result2<bool>, bool>();