컨벤션에 관한 아주 간단한 질문이 있는데, 메소드가 C #에서 ref 또는 out 매개 변수를 실제로 가지고 있어야합니까?
이것이 게으름이나 나쁜 디자인뿐만 아니라 좋은 OOP을 따르는 데 어떻게 적합합니까?
한 예로, MembershipCreateStatus에 대한 Out을 가지고 있고 MembershipUser를 반환하는 CreateUser 메서드가있는 MembershipProvider 클래스 (.NET System.Web.Security에서)를 보았습니다.
기본적으로 그 이유는 정보가 필요한 경우가 있지만 그 정보가 적절하지 않거나 메서드에서 반환 될 수없는 경우입니다.
감사
다음 시스템을 생각해보십시오.
당신은 객체와 일종의 상태 (또는 더 많은 인스턴스)를 반환하는 메소드를 가지고있다. 이제 반환 값을위한 두 가지 옵션이 있습니다.
bool
(또는enum
) 상태와 실제 결과나는 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)
그게 자연스럽지 않을 수도 있습니다.
out 매개 변수의 주요 용도는 두 가지 이상을 반환해야하는 경우입니다.
TryParse, 예를 들어 수치 객체를 많이 포함하는 정적 메서드는 성공할 때 true / false를 반환해야하고 캐스팅 된 값도 반환해야합니다.
어떤 사람들은 여러 값을 반환해야하는 경우 여러 속성을 가진 객체 / 구조체를 반환하는 것을 선호 할 수 있습니다. 그것의 단지 취향.
C #에 따르면,외출을위한 문서:
out 키워드는 인수가되도록합니다. 참조로 전달. 이것은 비슷하다. ref를 제외하고 ref 키워드에 변수가 전달되기 전에 초기화됩니다.
그래서,ref
매개 변수는 메서드에 값을 전달할 때뿐만 아니라 메서드에서 값을받을 때 필요합니다. 사용out
매개 변수는 정보의 흐름이 메서드에서 호출자로만 전달되는 경우에 사용됩니다. 이야기를 완성하기 위해 정보를 메소드에 전달하지만 메서드에서 정보를 수신 할 수없는 값이없는 값 매개 변수가 있습니다.
나는 그 아이디어를 정말로 사지 않는다.out
과ref
메서드에서 둘 이상의 항목을 반환해야하는 경우에만 사용해야합니다. 나는 항상 선호한다.out
부작용이있는 메서드에서 값을 반환합니다.
내게 그것은 당신의 질문에 대한 답입니다. 메서드에 부작용이 없거나 메서드 이름이 반환 값의 의미와 일치하는 명사 인 경우 함수 반환 값을 통해 함수에서 단일 값을 반환합니다. 그렇지 않으면을 통해 값을 반환합니다.out
또는ref
매개 변수.