2010-11-27 3 views
49

C# 4에는 선택적 출력 매개 변수가있는 좋은 방법이 있습니까?선택적 출력 매개 변수

+0

이러한 기능에는 값이 표시되지 않습니다. PDC에서 C# 컴파일러 녀석의 세션을 들어 본 적이 있다면 모든 변경 사항이 의미가 있음을 알 수 있습니다. –

+29

이 기능에는 가치가 없다는 것에 동의하지 않습니다. 메서드에 BESIDE가 out-parameters를 통해 데이터를 반환하는 로직이있는 경우 -이 논리를 호출 할 수 있기를 원하며 출력이 필요하지 않습니다. – Alex

+1

Int32.TryParse()를 사용하여 주어진 문자열을 숫자로 파싱 할 수 있는지 확인합니다. 가능한 경우 가끔은 걱정하지 않습니다. 그래서 Jitbit이 맞습니다. –

답변

5

번호

은 "옵션", 당신은 방법에 값을 할당 할 필요가 없습니다 의미에서, 당신은 ref을 사용할 수 있도록합니다.

+3

'ref' 매개 변수는 매우 다른 유스 케이스입니다. 호출자가 ref 매개 변수를 지정하지 않으면 선택적 매개 변수가 특정 값으로 전달됩니다. 호출자는 매개 변수를 지정했는지 여부와 관계없이 항상 값을 지정합니다. 'ref'는 항상 유효한 메모리 위치를 가리키며 유효한 메모리 위치는 항상 _something_을 포함합니다. 기껏해야, 이것은 "default value is X"라는 기본 사양의 이점이없는 마법 값 일뿐입니다. – danwyand

+2

예,이 대답은 디자인 판단이 아니므로 "감각적으로"한정어를 추가 한 것입니다. – codekaizen

48

출력 매개 변수를 사용하지 않는 다른 메서드로 항상 메서드를 오버로드 할 수는 있지만 실제로는 아닙니다.

+3

'{string dummy; Foo를 반환합니다 (더미 제외). }'출력 매개 변수를 사용하지 않는 오버로드에서? –

+2

@ 루이스 : 아니, 그게 아마 내가 한거야! – Cameron

+0

그건 보일러 플레이트 코드가 많이 있습니다. – Brain2000

2
private object[] Func(); 

반환 객체 배열에 원하는만큼 선택적 출력을 지정한 다음 사용하십시오! 당신이

private void Func(out int optional1, out string optional2) 

같은 옵션 출력 무언가를 의미 한 다음

Func(out i); 

같은 것을 호출하는 경우 는하지만 대답은 당신이 캔트 전혀 없습니다. 또한 C# 및 .NET Framework에는 매우 유연한 많은 데이터 구조가 ListArray과 같이 있으며 출력 매개 변수 또는 반환 형식으로 사용할 수 있으므로 선택적 출력 매개 변수를 사용하는 방법을 구현할 필요가 없습니다.

7

OptionalAttribute를 사용하여 매개 변수를 꾸미기도 작동하지 않습니다. 이전 샘플을 확장하려면 다음과 같이하십시오.

private void Func(
    [Optional] out int optional1, 
    [Optional] out string optional2) 
{ /* ... */ } 

위의 내용은 컴파일됩니다 (불행히도). 그러나 컴파일을 시도하면 :

Func(out i); 

하나의 매개 변수 시그니처가있는 오버로드가 명시 적으로 제공되지 않는 한 컴파일이 실패합니다.

(이론적으로) 위의 작업을 수행하는 것이 중요한 문제입니다. 생략 된 선택적 매개 변수가있는 메소드가 호출되면 모든 매개 변수의 값을 포함하는 스택 프레임이 작성되고 누락 된 값은 지정된 기본값으로 간단히 채워집니다.

그러나 "out"매개 변수는 값이 아닌 참조입니다. 이 매개 변수가 선택 사항이고 제공되지 않으면 어떤 변수가 참조할까요? 컴파일러는 호출자가 선택적 매개 변수를 지정한 선험적 매개 변수를 컴파일러에서 알 수 없으므로 메서드에서 정상적인 반환 전에 "out"매개 변수를 채워야한다는 요구 사항을 적용해야합니다. 이것은 더미 변수 어쩌면에 대한 참조가 전달되어야하므로 메소드에 채울 내용이 있음을 의미합니다. 이 더미 변수 공간을 관리하면 컴파일러 작성자에게 두통이 생길 수 있습니다. 이것이 어떻게 작동하는지에 대한 세부 사항을 밝혀내는 것은 불가능할 것이라고 말하지는 않지만 아키텍처의 함의는 Microsoft가이 기능을 이해할 수있을만큼 충분히 컸습니다.

0
public class Dummy<T> 
{ 
    public T Value; 
} 

다음 int는 모든 유형이 될 수 functionDoSomething(out new Dummy<int>().Value를 사용합니다.