2011-05-10 4 views
1

메서드 오버로드 (및 생성자 체인)와 C# 4.0의 선택적 매개 변수 사이에 중요한 차이점이 있었지만 어떤 차이점을인지 할 수는 없었습니다.메서드 오버로드 대 선택적 매개 변수

다음 두 구현간에 중요한 차이점이 있습니까?

먼저

public void Foo(string message = "") 
{ 
   Console.WriteLine(message); 
}
+1

저는 C#에 익숙하지 않지만 다른 유형의 매개 변수를 원할 때 일반적으로 메서드 오버로드가 사용됩니다. 선택적 매개 변수를 사용하면 특정 유형 만 사용할 수 있습니다. –

답변

8

메서드 오버로딩을 선호합니다. 선택적 매개 변수와 관련된 문제는 known versioning입니다.

매우 좋은 기사가 입니다. Jon Skeethere입니다. 이 추가

동기 부여 방법은 많은 많은 매개 변수 및 C# 클래스 적은 포럼 새로운 디자인 연습을 할 수있는

+0

+1, 나는 그것에 대해 생각하지 않았다. 좋은 지적! – FrustratedWithFormsDesigner

+0

바로 그게 내가 찾고있는 것입니다. 고맙습니다. – senfo

+0

"알려진 버전 문제"는 실제로 문제가 아니며 선택적 인수 사용에 대한 인수도 아닙니다. 메소드가 다음 버전에서 수정 될 때만 문제가됩니다. 그러나 이것은 선택적 매개 변수 대신 과부하를 추가하여 쉽게 해결할 수 있습니다.문제는 해결되었습니다. (그렇습니다. 필은 다른 말을하고 있지만 그는 새로운 주장을 선택으로했기 때문에 실수를했습니다.) –

1

내가 두 번째 옵션과 함께 갈 것

public void Foo() 
{ 
   Foo(String.Empty); 
} 

public void Foo(string message) 
{ 
   Console.WriteLine(message); 
}

두 번째. 당신은 어떤 일정에 기본 문자열을 변경할 수 있으며, 다음 나중에 당신과 같은, 상수의 값을 변경할 수 있습니다

constant String defaultString = String.Empty; //change this later if the default value needs to be something else, can't remember if the syntax is valid C# ;) 
//... 
public void Foo(string message = defaultString) 
{ 
    Console.WriteLine(message); 
} 

는 또한, 당신이 (단순이기는하지만) 하나 더 적은을 유지하는 기능.

+0

메서드 오버로딩과 선택적 매개 변수 사이의 기능상의 주요 차이점에 대해서는 언급하지 않았습니다. 따라서 코드 유지 관리를 위해 선택적 매개 변수를 기본값으로 사용하고 일부 상황에서 그렇게해야하는 경우 오버로드 만 사용하십시오. – AllenG

+0

"'k_dflt_str'"- 뭐라구?! 아뇨 아뇨, 아뇨. –

+0

@ Konrad Rudolph : heh brain은 현재 PL/SQL 표준 모드에 있습니다. ;) – FrustratedWithFormsDesigner

0

선택적 매개 변수는 문법 설탕입니다 쉽게 COM 얘기하고 했다.

이전 버전의 .NET과의 하위 호환성 외에는 동일합니다.

+0

그들의 IL은 다릅니다. JIT 후에도 여전히 달라진다고 생각하게 만듭니다. 하위 호환성도 의문의 여지가 있습니다. 선택적 매개 변수가 .Net 4 이전의 IL에서 지원 되었기 때문에. –

3

선택적 매개 변수는 상수처럼 작동하며 컴파일 타임에 대체됩니다.

public void Foo(string s = "default") 
Foo(); 

발신자에 대한 코드를 생성합니다

public void Foo(string s) 
Foo("default"); 

이이 새 버전에서 기본값을 변경하도록 선택하는 경우 모든 어셈블리는 당신이 OLD 기본이있을 것이다 참조 의미!

오버로드는 상수처럼 작동하지 않으며 어셈블리의 기본값을 숨 깁니다. 이렇게하면 깨끗한 업그레이드 경로가 제공됩니다.