2016-08-24 3 views
1

그래서 다른 메서드를 호출하여 메서드 나 함수의 실행을 종료하고 싶습니다. 나는 지금까지 단지 else와 같은 문제를 발견했으며 필요한 것은 아무것도 없습니다.다른 메서드를 호출하여 메서드에서 끝내기

예는 방법이기 때문에

public static void SomeMethod() { 
    // some code 
    ExitMethod(); 
    // the next line of code will never be executed 
    Console.WriteLine("Test"); 
} 

private static void ExitMethod() { 
    // if possible the execution of the Method above will be stopped here 
} 

반환 문처럼 작동 할을 ExitMethod 제 1, 아니라 내가 더 쉽게에 경우 또는 다른 조건을 추가 할 수 있습니다 .. 다음과 같이 . 내 어셈블리에서 ExitMethod을 자주 사용하면 호출하는 메소드의 실행을 중지 할 수있는 조건을 쉽게 리팩토링 할 수 있습니다. 이 시리얼 키가 필요하고 올바른 일이 주어진 경우에만 그 다음 매번 체크 일부 정적 부울을 수 있도록


예를 들어,이 캔, DLL을 확보 명백하게 안전하지 않은 시도에 사용 함수는 dll에서 호출됩니다.

public static void SomeMethod() { 
    if (ExitMethod) return; 
} 

목표는 만해야한다 : 내가 좋아하는 일을 피하려고 취소 작업을 위해 호출 할 수있는 다른 방법을 사용하여 : 사전 :

편집에

감사합니다 ExitMethod 사물을 처리하는 방법으로 전화하십시오. 질문의 주석에서

+2

미안하지만 나는 이해하지 못합니다. 왜 if 문을 사용하고 싶지 않으십니까? – StarterPack

+3

'ExitMethod()'에 예외를 던지는 것은 어떻습니까? 아니면'ExitMethod'가'bool'을 반환하도록 만들고 if (ExitMethod()) return;처럼 사용할 수 있습니다. –

+0

ExitMethod의 if 문을 사용하지 않으려면 어떻게해야 할지를 알고 있어야합니다. 나는 단지 예외가 아닌 다른 해결책이 있는지 알고 싶다. 나는 그것들에 대해 생각 해왔다. – RememberOfLife

답변

4

:

왜 더 나은 솔루션이없는 [...]?

암시 적 흐름 제어는 일반적으로 안티 패턴으로 간주됩니다. 예외는 예외로 간주됩니다. 의도적으로 어떠한 형태의 암시 적 흐름 제어도 포함하지 않는 언어 (예 : 이동)가 존재합니다.

다음은 사용할 수있는 몇 가지 방법입니다.

DocComments없이 명시 흐름 제어

public bool ExitMethod() => // ... 

public void SomeMethod() 
{ 
    if (ExitMethod()) return; 
    Console.WriteLine("Test"); 
} 

부울 반환 값은 혼란 스러울 수 있습니다. 열거자가 문서화 코드 초래 :

public enum ExitParentStatus : byte 
{ 
    Continue, Return 
} 

public ExitParentStatus ExitMethod() => // ... 

public void SomeMethod() 
{ 
    if (ExitMethod() == ExitParentStatus.Return) return; 
    Console.WriteLine("Test"); 
} 

명시 흐름 제어 상태

public enum RequestStatus : byte 
{ 
    Processing, Handled 
} 

public class Request 
{ 
    public RequestStatus Status { get; set; } 
} 

public void ExitMethod(Request request) => // ... 

public void SomeMethod(Request request) 
{ 
    ExitMethod(); 
    if (request.Status == Handled) return; 
    Console.WriteLine("Test"); 
} 

사용 항복 반환

이 그들이 잘못 설계된 코드에 접근하는 것을 다른 개발자에 대한 단서를 제공한다, 버그 가능성을 약간 줄입니다.

public void ExecuteConditionalCoroutine(IEnumerable<bool> coroutine) 
{ 
    foreach (var result in coroutine) 
    { 
    if (result) return; 
    } 
} 

public bool ExitMethod() => // ... 

public IEnumerable<bool> SomeMethod() 
{ 
    yield return ExitMethod(); 
    Console.WriteLine("Test"); 
} 

ExecuteConditionalCoroutine(SomeMethod()); 

예외

당신이 디버그 코드가 불가능하게하려면이 경우

사용.post-sharp 같은

public bool ExitMethod() { throw new ExitParentMethodException(); } 

public void SomeMethod() 
{ 
    try 
    { 
    ExitMethod(); 
    Console.WriteLine("Test"); 
    } 
    catch (ExitParentMethodException) { } 
} 

후 컴파일

사용 뭔가가 자동으로 분기를 주입합니다. 이는 완전히 유지할 수없는 코드에 대한 훌륭한 접근 방식입니다.

[ExitsParentMethod] 
public bool ExitMethod() => // ... 

public void SomeMethod() 
{ 
    ExitMethod(); 
    Console.WriteLine("Test"); 
} 
+0

당신은 거기에 정말 흥미로운 것들을 가지고 있지만, 내가 아는 것과 판단에 대한 판단은 정말 단단한 해결책입니다. 예외가 시도하지 않고 처리 될 수 있다는 점에 유의하십시오. – RememberOfLife

관련 문제