program story

선택적 출력 매개 변수

inputbox 2020. 11. 25. 07:57
반응형

선택적 출력 매개 변수


이 질문에 이미 답변이 있습니다.

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


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


아니.

"선택 사항"으로 만들려면 메서드에 값을 할당 할 필요가 없다는 의미에서을 사용할 수 있습니다 ref.


OptionalAttribute로 매개 변수를 장식하는 것도 작동하지 않습니다. 이전 샘플을 확장하려면 다음과 같은 결과를 얻습니다.

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

위의 내용이 컴파일됩니다 (아마도 안타깝게도). 그러나 컴파일 시도 :

Func(out i);

단일 매개 변수 서명이있는 오버로드가 명시 적으로 제공되지 않으면 실패합니다.

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

그러나 "out"매개 변수는 값이 아니라 참조입니다. 해당 매개 변수가 선택 사항이고 제공되지 않은 경우 어떤 변수를 참조합니까? 컴파일러는 호출자가 지정하는 선택적 매개 변수 (있는 경우)를 사전에 알지 못하므로 메서드에서 정상적인 반환을하기 전에 "out"매개 변수를 채워야한다는 요구 사항을 계속 적용해야합니다. 이것은 어딘가에 더미 변수에 대한 참조를 전달해야 메서드가 채울 것이 있음을 의미합니다. 이 더미 변수 공간을 관리하면 컴파일러 작성자에게 골칫거리가 될 것입니다. 이것이 어떻게 작동 할 것인지에 대한 세부 사항을 파악하는 것이 불가능하다고 말하는 것은 아니지만, 아키텍처에 미치는 영향은 Microsoft가이 기능을 이해할 수있을만큼 전달하기에 충분합니다.


private object[] Func();

반환 객체 배열에서 원하는만큼의 선택적 출력을 할당 한 다음 사용하십시오! 그러나 선택적인 출력을 의미한다면

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

그런 다음 다음과 같이 호출합니다.

Func(out i);

그렇다면 대답은 '아니오'입니다. 또한 C # 및 .NET 프레임 워크 께서 같은 매우 유연 많은 많은 데이터 구조 ListArray옵션 출력 매개 변수를 가질 수있는 방법을 구현할 필요가 없습니다 그래서 당신은 출력 매개 변수 또는 반환 형식으로 사용할 수 있습니다.


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

그런 다음 사용하는 functionDoSomething(out new Dummy<int>().Value경우, int어떤 유형이 될 수 있습니다.

참고 URL : https://stackoverflow.com/questions/4293627/optional-output-parameters

반응형