1

컨벤션에 관한 아주 간단한 질문이 있는데, 메소드가 C #에서 ref 또는 out 매개 변수를 실제로 가지고 있어야합니까?

이것이 게으름이나 나쁜 디자인뿐만 아니라 좋은 OOP을 따르는 데 어떻게 적합합니까?

한 예로, MembershipCreateStatus에 대한 Out을 가지고 있고 MembershipUser를 반환하는 CreateUser 메서드가있는 MembershipProvider 클래스 (.NET System.Web.Security에서)를 보았습니다.

기본적으로 그 이유는 정보가 필요한 경우가 있지만 그 정보가 적절하지 않거나 메서드에서 반환 될 수없는 경우입니다.

감사


3 답변


2

다음 시스템을 생각해보십시오.

당신은 객체와 일종의 상태 (또는 더 많은 인스턴스)를 반환하는 메소드를 가지고있다. 이제 반환 값을위한 두 가지 옵션이 있습니다.

  1. 래퍼를 생성합니다.bool(또는enum) 상태와 실제 결과
  2. 그 n 개의 인스턴스를 분리한다.

나는 2 개 이상의 인스턴스를 반환해야하는 경우 래퍼를 선호합니다. 서명이 상태와 결과 만 처리한다면, 나는 선호한다.out/ref-스타일.

...에 대한out/ref스타일 나는 eg의 서명을 선호한다.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

out 매개 변수의 주요 용도는 두 가지 이상을 반환해야하는 경우입니다.

TryParse, 예를 들어 수치 객체를 많이 포함하는 정적 메서드는 성공할 때 true / false를 반환해야하고 캐스팅 된 값도 반환해야합니다.

어떤 사람들은 여러 값을 반환해야하는 경우 여러 속성을 가진 객체 / 구조체를 반환하는 것을 선호 할 수 있습니다. 그것의 단지 취향.


1

C #에 따르면,외출을위한 문서:

out 키워드는 인수가되도록합니다.   참조로 전달. 이것은 비슷하다.   ref를 제외하고 ref 키워드에   변수가   전달되기 전에 초기화됩니다.

그래서,ref매개 변수는 메서드에 값을 전달할 때뿐만 아니라 메서드에서 값을받을 때 필요합니다. 사용out매개 변수는 정보의 흐름이 메서드에서 호출자로만 전달되는 경우에 사용됩니다. 이야기를 완성하기 위해 정보를 메소드에 전달하지만 메서드에서 정보를 수신 할 수없는 값이없는 값 매개 변수가 있습니다.

나는 그 아이디어를 정말로 사지 않는다.outref메서드에서 둘 이상의 항목을 반환해야하는 경우에만 사용해야합니다. 나는 항상 선호한다.out부작용이있는 메서드에서 값을 반환합니다.

내게 그것은 당신의 질문에 대한 답입니다. 메서드에 부작용이 없거나 메서드 이름이 반환 값의 의미와 일치하는 명사 인 경우 함수 반환 값을 통해 함수에서 단일 값을 반환합니다. 그렇지 않으면을 통해 값을 반환합니다.out또는ref매개 변수.

연결된 질문


관련된 질문

최근 질문