메서드 오버로드 (및 생성자 체인)와 C# 4.0의 선택적 매개 변수 사이에 중요한 차이점이 있었지만 어떤 차이점을인지 할 수는 없었습니다.메서드 오버로드 대 선택적 매개 변수
다음 두 구현간에 중요한 차이점이 있습니까?
먼저
public void Foo(string message = "")
{
Console.WriteLine(message);
}
메서드 오버로드 (및 생성자 체인)와 C# 4.0의 선택적 매개 변수 사이에 중요한 차이점이 있었지만 어떤 차이점을인지 할 수는 없었습니다.메서드 오버로드 대 선택적 매개 변수
다음 두 구현간에 중요한 차이점이 있습니까?
먼저
public void Foo(string message = "")
{
Console.WriteLine(message);
}
메서드 오버로딩을 선호합니다. 선택적 매개 변수와 관련된 문제는 known versioning입니다.
매우 좋은 기사가 입니다. Jon Skeethere입니다. 이 추가
동기 부여 방법은 많은 많은 매개 변수 및 C# 클래스 적은 포럼 새로운 디자인 연습을 할 수있는
+1, 나는 그것에 대해 생각하지 않았다. 좋은 지적! – FrustratedWithFormsDesigner
바로 그게 내가 찾고있는 것입니다. 고맙습니다. – senfo
"알려진 버전 문제"는 실제로 문제가 아니며 선택적 인수 사용에 대한 인수도 아닙니다. 메소드가 다음 버전에서 수정 될 때만 문제가됩니다. 그러나 이것은 선택적 매개 변수 대신 과부하를 추가하여 쉽게 해결할 수 있습니다.문제는 해결되었습니다. (그렇습니다. 필은 다른 말을하고 있지만 그는 새로운 주장을 선택으로했기 때문에 실수를했습니다.) –
내가 두 번째 옵션과 함께 갈 것
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);
}
는 또한, 당신이 (단순이기는하지만) 하나 더 적은을 유지하는 기능.
메서드 오버로딩과 선택적 매개 변수 사이의 기능상의 주요 차이점에 대해서는 언급하지 않았습니다. 따라서 코드 유지 관리를 위해 선택적 매개 변수를 기본값으로 사용하고 일부 상황에서 그렇게해야하는 경우 오버로드 만 사용하십시오. – AllenG
"'k_dflt_str'"- 뭐라구?! 아뇨 아뇨, 아뇨. –
@ Konrad Rudolph : heh brain은 현재 PL/SQL 표준 모드에 있습니다. ;) – FrustratedWithFormsDesigner
선택적 매개 변수는 문법 설탕입니다 쉽게 COM 얘기하고 했다.
이전 버전의 .NET과의 하위 호환성 외에는 동일합니다.
그들의 IL은 다릅니다. JIT 후에도 여전히 달라진다고 생각하게 만듭니다. 하위 호환성도 의문의 여지가 있습니다. 선택적 매개 변수가 .Net 4 이전의 IL에서 지원 되었기 때문에. –
선택적 매개 변수는 상수처럼 작동하며 컴파일 타임에 대체됩니다.
public void Foo(string s = "default")
Foo();
발신자에 대한 코드를 생성합니다
public void Foo(string s)
Foo("default");
이이 새 버전에서 기본값을 변경하도록 선택하는 경우 모든 어셈블리는 당신이 OLD 기본이있을 것이다 참조 의미!
오버로드는 상수처럼 작동하지 않으며 어셈블리의 기본값을 숨 깁니다. 이렇게하면 깨끗한 업그레이드 경로가 제공됩니다.
저는 C#에 익숙하지 않지만 다른 유형의 매개 변수를 원할 때 일반적으로 메서드 오버로드가 사용됩니다. 선택적 매개 변수를 사용하면 특정 유형 만 사용할 수 있습니다. –