2016-08-24 7 views
1

したがって、別のメソッドを呼び出すことによってメソッドまたは関数の実行を終了します。私はこれまでに以外のの問題を見つけただけで、私の必要とするものは何もありません。 ExitMethodが、それは方法ですので、私は、より簡単に場合やその他の条件を追加することができる唯一のこと、リターン文のように動作します。..別のメソッドを呼び出すことによってメソッドを終了する

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をアセンブリで使用することが多い場合は、呼び出しメソッドの実行を停止する条件を簡単にリファクタリングできます。それはシリアルキーを必要とし、正しいものが与えられている場合にのみ、それは次いで、毎回Aをチェックするいくつかの静的なブールを可能にするように


これは、例えば、DLLを確保する明らかに安全ではない試みで使用され関数はdllから呼び出されます。事前に

感謝:)

EDIT:だけに必要とされることが目標である

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

: 私のようなものを避けたいのキャンセルタスクのために呼び出すことができる別の方法を用いることにより ExitMethod物事を処理するメソッドを呼び出します。問題のコメントから

+2

私は申し訳ありませんが、私は理解していません。あなたはなぜif-statementを使いたいのですか? – StarterPack

+3

'ExitMethod()'に例外を投げるのはどうですか?あるいは、 'ExitMethod'が' bool'を返して 'if(ExitMethod())return;'のように使うこともできます。 –

+0

ExitMethodのif文を使用しないでください。そうしないと、何をすべきか分かります。私はちょうどそこに他の解決策があるかどうか、または例外かどうかを知りたいのです。私はそれらについて考えました。 – RememberOfLife

答えて

4

なぜ[...]そこに、より良い解決策ではないでしょうか?

暗黙のフロー制御は、一般的にアンチパターンとみなされます。例外は例外ではありません。意図的に暗黙的なフロー制御の形式を含まない言語が存在します(例:Go)。

ここでは、使用できるアプローチをいくつか紹介します。

DocCommentsなしの明示的なフロー制御

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

public void SomeMethod() 
{ 
    if (ExitMethod()) 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 enum ExitParentStatus : byte 
{ 
    Continue, Return 
} 

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

public void SomeMethod() 
{ 
    if (ExitMethod() == ExitParentStatus.Return) 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()); 

例外

デバッグにあなたのコードを不可能にしたい場合は、これを使用してください。

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

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

コンパイル後

使用自動的に枝を注入するpost-sharpのようなもの。これは、完全に維持できないコードのための素晴らしいアプローチです。

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

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

あなたは本当に面白いことがいくつかありますが、私が知っていることから判断すると、これは非常に固い解決策です。ただ例外がtryなしで処理できることに注意してください。 – RememberOfLife

関連する問題