C#에서 기본 함수 인수를 갖는 유일한 방법은 오버로드입니까?

StackOverflow https://stackoverflow.com/questions/40090

  •  09-06-2019
  •  | 
  •  

문제

기본 함수 인수를 처리하는 유일한 방법은 함수 오버로드를 통해서라는 것이 사실입니까?

예를 들어, PHP에서는 다음과 같이 할 수 있습니다.

function foo($x, $y=0)
{
}

C#에서 처리하는 가장 좋은 방법은 이것이겠습니까?

void foo(int x)
{
  foo(x, 0);
}

void foo(int x, int y)
{
}

여기에서 예제가 해제되었습니다.

편집하다

C# 예제를 실제 C#으로 만들었습니다(Blair Conrad에게 감사드립니다).

도움이 되었습니까?

해결책

응, 그게 최선일 거야, 당신이 생략하는 것을 제외하고 $매개변수 이름에 대한 s, 다른 사람들이 지적했듯이.기본 매개변수 값이 부족한 이유에 관심이 있는 경우 @Giovanni Galbo의 설명을 참조하세요.

다른 팁

호기심을 충족시키기 위해:

에서 C#에서 기본 매개변수를 지원하지 않는 이유는 무엇입니까?:

C++와 같은 언어에서는 기본값이 메서드 선언의 일부로 포함될 수 있습니다.

무효 프로세스(직원 직원, 부울 보너스 = false)

이 메서드는 다음 중 하나로 호출할 수 있습니다.

a.Process(직원, 참);

또는

a.프로세스(직원);

두 번째 경우에는 매개변수 보너스가 false로 설정됩니다.

C#에는 이 기능이 없습니다.

이 기능이 없는 이유 중 하나는 해당 기능의 특정 구현과 관련이 있습니다.C++ 세계에서는 사용자가 다음과 같이 작성할 때:

a.프로세스(직원);

컴파일러가 생성

a.process(직원, false);

즉, 컴파일러는 메소드 프로토타입에 지정된 기본값을 가져와서 메소드 호출에 넣습니다. 이는 마치 사용자가 두 번째 매개변수로 'false'를 쓴 것과 같습니다.불행하게도 클래스 사용자가 다시 컴파일하도록 강제하지 않고는 해당 기본값을 변경할 수 있는 방법이 없습니다.

이 점에서는 오버로딩 모델이 더 잘 작동합니다.프레임워크 작성자는 두 개의 별도 메서드를 정의하고 단일 매개변수 메서드는 두 개의 매개변수 메서드를 호출합니다.이렇게 하면 프레임워크에 기본값이 유지되며 필요한 경우 수정할 수 있습니다.

컴파일러가 C++ 정의와 같은 것을 가져와 오버로드를 생성하는 것이 가능하지만 해당 접근 방식에는 몇 가지 문제가 있습니다.

첫 번째는 사용자가 작성하는 코드와 컴파일러가 생성하는 코드 사이의 상관 관계가 덜 명확하다는 것입니다.우리는 일반적으로 가능하면 마법을 제한하려고 노력합니다. 왜냐하면 그것이 프로그래머를 더 어렵게 만들기 때문입니다.두 번째 문제는 XML 문서 주석 및 Intellisense와 관련된 것입니다.컴파일러에는 오버로드된 메서드에 대한 문서 주석을 생성하는 방법에 대한 특별한 규칙이 있어야 하며, intellisense에는 오버로드된 메서드를 단일 메서드로 축소하는 스마트한 기능이 필요합니다.

오버로드를 직접 작성하는 것은 다소 덜 편리하지만 허용 가능한 솔루션이라고 생각합니다.

에 관하여 C# FAQ에서 발췌:

거기에 나열된 문제의 대부분은 VB.Net(특히 intellisense 및 xml 주석 문제)에서 해결되었습니다. 이는 실제로 문제가 있다는 의미입니다. C# 팀에서 문제를 해결할 수 있는 코드가 있습니다.

또 다른 이유는 클래스 사용자에게 강제로 다시 컴파일하도록 하는 것과 관련이 있지만 그것도 약간의 문제입니다.만약 너라면 변화 프레임워크 클래스의 기본값이고 사용자는 이를 수행합니다. ~ 아니다 다시 컴파일해야 하면 사용자가 위험해질 수 있습니다 기본값이 변경된 것을 알지 못합니다. 이제 런타임까지 표시되지 않는 코드에 잠재적인 버그가 있습니다.즉, 함수를 오버로드하는 대안은 적어도 그만큼 나쁩니다.물론 이는 특정 기능 구현을 가정하지만 FAQ에서 제안된 구현입니다.

따라서 남은 이유("마법을 제한하려고 시도")와 오버로드를 작성하는 것이 "조금 덜 편리하다"는 사실(그들이 인정하는)을 비교 평가해야 합니다.개인적으로 나는 이 기능을 넣고 프로그래머가 그 기능을 사용할지 말지를 결정하게 하라고 말합니다.

기본 인수는 C++의 일부이지만 C# 3.5부터 기본 인수는 여전히 지원되지 않습니다. 따라서 오버로드해야 합니다.VB.Net 1.0부터 사용할 수 있습니다.

예.

아니면 카레.

또는 클래스로 추상화하고 거기에서 기본값을 사용합니다.

아니요, AFAIK C#은 재정의를 지원하지 않습니다. 예, 이는 동일한 효과를 달성하는 데 권장되는 방법입니다.

지적한 대로 이는 현재 C#에서는 사용할 수 없지만 Sam Ng이 자신의 블로그에서 설명하는 것처럼 C# 4.0에는 제공될 예정입니다.

http://blogs.msdn.com/samng/archive/2009/02/03/named-arguments-ional-arguments-and-default-values.aspx

이게 일을 안 해?

void foo(int x):this(x, 0){}

void foo(int x, int y){
 // code here
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top