关于约定我有一个非常简单的问题,什么时候方法实际上应该在C#中引用参数?
这如何适应遵循良好的OOP而不仅仅是懒惰或糟糕的设计?
作为一个例子,我遇到了一个MembershipProvider类(来自.NET System.Web.Security),它有一个CreateUser方法,它有一个为MembershipCreateStatus的out并返回一个MembershipUser。
背后的原因基本上是因为当需要从方法中获取信息但是它不合适/不能从方法返回时?
由于
答案 0 :(得分:2)
想到以下系统:
你有一个方法,它返回一个对象和某种状态(甚至更多的实例)。现在您有2个返回值选项:
bool
(或enum
)状态和实际结果我更喜欢包装器,如果我必须返回2个以上的实例。如果签名只处理状态和结果,我更喜欢out
/ ref
- 样式。
对于out
/ ref
- 样式我更喜欢签名例如。 TryParse
:bool TryParse(out T result)
,因为这在使用时提供了更自然的方式,例如。为:
int foo;
if (int.TryParse(someString, out foo)) {
// do something with foo
}
,而
MyState state;
Foo fooInstance = FooCreator.Create(out state);
if (fooInstance != null)
* OR *
if (state == State.Success)
可能不是那么自然
答案 1 :(得分:1)
out参数的主要用途是当你需要返回多个东西时。
TryParse,一个对大量数字对象的静态方法,例如,当成功时需要返回true / false,还需要返回值。
如果您需要返回多个值,有些人可能更喜欢返回具有多个属性的对象/结构;它的偏好。
答案 2 :(得分:1)
out关键字会导致参数 通过引用传递。这是类似的 到ref关键字,除了ref 要求变量是 在被传递之前初始化。
因此,当您需要将值传递给方法时,请使用ref
参数,以及从方法接收值。当信息流仅从方法发送给调用者时,请使用out
参数。为了完成这个故事,有一个unadorned值参数,它将信息传递给方法,但不能从方法中接收信息。
我真的不认为只有在需要从方法中返回多个项目时才使用out
和ref
。我总是喜欢使用out
来返回有副作用的方法中的值。
对我而言,这是你问题的答案。如果方法没有副作用,并且方法的名称是与返回值的含义匹配的名词,则通过函数返回值从函数返回单个值。否则,通过out
或ref
参数返回值。