2012-09-24 5 views
0

이 메소드에는 선택적 매개 변수가 있습니다.전용 메소드 매개 변수

public static Test(String connection, Int32 retryInfiniteLoopGuard = 0) 

어떻게 든 클래스의 외부에서 메서드를 호출 할 때 그래서 보이지 않는 될 것이라는 retryInfiniteLoopGuardprivate로 표시 할 수있는 방법이 있습니까?

당신이 왜 retryInfiniteLoopGuard는 재귀 실행하고 사용자가 볼 안 궁금하면 ... 내가 오버로드를 사용하십시오

오늘,하지만 다른 방법은 무엇입니까?

+3

왜 다른 방법을 원하십니까? –

+0

C# 4.0에 선택적 매개 변수가 도입 된 것과 같은 이유 때문에 ...이 단계를 더 진행하고 선택적 매개 변수를 숨기려고합니다. – user1662812

+3

C# 4.0의 선택적 매개 변수 값은 callsite에서 해당 값을 주입하여 컴파일됩니다. 나는. 코드가'Test (connection)'일지라도 컴파일러는 실제로'Test (connection, 0)'와 같은 호출을 생성합니다. 따라서 과부하를 사용하지 않고 원하는 동작을 수행 할 수있는 방법이 없습니다. –

답변

15

해당 매개 변수를 사용하여 메서드의 전용 오버로드를 만들고 공용 매개 변수를 제거합니다. 공개 버전을 기본 값으로 개인 버전으로 호출하는 것보다

private static int Test(string connection, int retryInfiniteLoopGuard) 
{ 
    // The code 
} 

public static int Test(String connection) 
{ 
    return Test(connection, 0); 
} 

그 목표를 달성 할 수있는 방법은 없습니다.

당신이 그것을 필요로하는 이유
+1

그래서 과부하에 대해 정말로 몰랐다고 생각 했습니까? – user1662812

+4

@ user1662812 : 질문을 편집하기 전에 실제로 이렇게 보입니다. –

+4

@ user1662812 여기에서 질문하는 것에 대해 우리가 가정해야 할 것과하지 말아야 할 것이 놀랄 것입니다. 우리는 매우 열린 마음을 지녀야하고해야만합니다. –

1

모르겠지만, 당신은 당신이 다음을 수행 할 수있어 새로운 C# 6에서이

public static Test(String connection, Int32 retryInfiniteLoopGuard) 
{ 
    //method body 
} 

public static Test(String connection) 
{ 
    Test(connection, 0); 
} 
+5

그들이 원했던 것은 아니 었습니다. 여분의 int를 가진 오버로드는 사적이어야합니다. –

+0

그래서 과부하에 대해 정말로 몰랐다고 생각 했습니까? – user1662812

+0

오버로드로 인해 문제가 분명히 해결됩니다. 첫 번째 방법을 비공개로할지 또는 공개로할지 여부가 결정입니다. 그래서 문제가 해결되었습니다. –

3

과 같은 두 가지 방법을 만들 수 있습니다

public static int Test(String connection, private Int32 retryInfintiteLoopGuard = 0) 
{ 
    /* Enter Code Here */ 
} 

이 작동하는 방법은 모든 매개 변수를 기의하지 않는 한, 암시 적 방법 등으로 액세스 할 수 있습니다

private static int test(String connection, Int32 retryInfiniteLoopGuard) 
{ 
    /* Enter Code Here */ 
} 
public static int Test(String connection) 
{ 
    return test(connection, 0); 
} 
입니다

: 그것은으로 컴파일 어디 rse 명시 적으로 다르게 명시된. 지원되는 접근자는 다음과 같습니다 :

public 
internal 
protected 
private 
+0

어떻게이 작업을 수행합니까? .NET Framework 4.6.1 (최신 버전)과 VS2017을 대상으로하고 있지만 아직 사용하지는 못합니다. – Jeppe

+0

C# 6에서이 버전이 출시 된 것으로 생각하지 않습니다. –

관련 문제