C# メソッド中で処理終了するには？


button1_Click実行→テストメソッド実行→後処理へ進まないようにするにはどうしたら良いでしょうか？

[code]

      private void button1_Click(object sender, EventArgs e)
        {
            テスト();
            //後処理
            System.IO.StreamReader sr = new System.IO.StreamReader("test.txt");
            string contents = sr.ReadToEnd();
            sr.Close();
    
        }
    
        public void テスト()
        {
    
    
             if (false==System.IO.File.Exists("test.txt"))
             {
                  return ;//ここで処理を終了したいがreturnだとメソッドから抜けるだけになってしまう
             }
    
        }
    
[/code]

returnに戻り値を付与してそれを元にif判定するしかないでしょうか？  
visual studio Express 2015 (64bit)




`テスト()`メソッドではファイルが存在するかどうかの情報を返し、呼び出し元ではその情報を元に`if`で分岐すればよいのでは？

[code]

    private void button1_Click(object sender, EventArgs e)
    {
        if (テスト()) {
            System.IO.StreamReader sr = new System.IO.StreamReader("test.txt");
            string contents = sr.ReadToEnd();
            sr.Close();
        }
    }
    
    public bool テスト()
    {
        ...
        return System.IO.File.Exists("test.txt");
    }
    
[/code]

* * *

> 呼び出し元のコード量が増えてしまうので出来ればメソッド中で終了したいと考えています。

無理です。そもそも`button1_Click()`と`テスト()`の両メソッドで`"test.txt"`を扱っています。各メソッドの役割が適切に分離できていないためにそもそも記述量が増えてしまっています。その他にもC#言語には記述量を減らせる機能がいくつも用意されています。`if`文だけを減らす努力をしても仕方がありません。

>
[code]

>     System.IO.StreamReader sr = new System.IO.StreamReader("test.txt");
>     string contents = sr.ReadToEnd();
>     sr.Close();
>  
[/code]

は`var`キーワードを使用することで型名を明示する必要はなくなります。

[code]

    var sr = new System.IO.StreamReader("test.txt");
    var contents = sr.ReadToEnd();
    sr.Close();
    
[/code]

とできます。`using System.IO;`ディレクティブで名前空間の記述も省略できます。

[code]

    var sr = new StreamReader("test.txt");
    var contents = sr.ReadToEnd();
    sr.Close();
    
[/code]

`using`ステートメントで後処理を確実に行えます。

[code]

    using (var sr = new StreamReader("test.txt")) {
        var contents = sr.ReadToEnd();
    }
    
[/code]

そもそも`File.ReadAllText()`メソッドで簡単に読み出せます。

[code]

    var contents = File.ReadAllText("test.txt");
    
[/code]

`using static System.IO.File;`ディレクティブで更にクラス名も省略できます。

[code]

    var contents = ReadAllText("test.txt");
    
[/code]

さて`テスト()`メソッドはファイルの有無の判定結果を返すのではなく、ファイルコンテンツを返す方法もあります。

[code]

    private void button1_Click(object sender, EventArgs e)
    {
        var contents = テスト();
        if (contents != null) {
            ...
        }
    }
    
    public string テスト()
    {
        ...
        return Exists("test.txt") ? ReadAllText("test.txt") : null;
    }
    
[/code]

以上はあくまで一例ですが、このようにメソッドの役割分担を再検討されることをお勧めします。




`テスト()`メソッドではファイルが存在するかどうかの情報を返し、呼び出し元ではその情報を元に`if`で分岐すればよいのでは？

[code]

    private void button1_Click(object sender, EventArgs e)
    {
        if (テスト()) {
            System.IO.StreamReader sr = new System.IO.StreamReader("test.txt");
            string contents = sr.ReadToEnd();
            sr.Close();
        }
    }
    
    public bool テスト()
    {
        ...
        return System.IO.File.Exists("test.txt");
    }
    
[/code]

* * *

> 呼び出し元のコード量が増えてしまうので出来ればメソッド中で終了したいと考えています。

無理です。そもそも`button1_Click()`と`テスト()`の両メソッドで`"test.txt"`を扱っています。各メソッドの役割が適切に分離できていないためにそもそも記述量が増えてしまっています。その他にもC#言語には記述量を減らせる機能がいくつも用意されています。`if`文だけを減らす努力をしても仕方がありません。

>
[code]

>     System.IO.StreamReader sr = new System.IO.StreamReader("test.txt");
>     string contents = sr.ReadToEnd();
>     sr.Close();
>  
[/code]

は`var`キーワードを使用することで型名を明示する必要はなくなります。

[code]

    var sr = new System.IO.StreamReader("test.txt");
    var contents = sr.ReadToEnd();
    sr.Close();
    
[/code]

とできます。`using System.IO;`ディレクティブで名前空間の記述も省略できます。

[code]

    var sr = new StreamReader("test.txt");
    var contents = sr.ReadToEnd();
    sr.Close();
    
[/code]

`using`ステートメントで後処理を確実に行えます。

[code]

    using (var sr = new StreamReader("test.txt")) {
        var contents = sr.ReadToEnd();
    }
    
[/code]

そもそも`File.ReadAllText()`メソッドで簡単に読み出せます。

[code]

    var contents = File.ReadAllText("test.txt");
    
[/code]

`using static System.IO.File;`ディレクティブで更にクラス名も省略できます。

[code]

    var contents = ReadAllText("test.txt");
    
[/code]

さて`テスト()`メソッドはファイルの有無の判定結果を返すのではなく、ファイルコンテンツを返す方法もあります。

[code]

    private void button1_Click(object sender, EventArgs e)
    {
        var contents = テスト();
        if (contents != null) {
            ...
        }
    }
    
    public string テスト()
    {
        ...
        return Exists("test.txt") ? ReadAllText("test.txt") : null;
    }
    
[/code]

以上はあくまで一例ですが、このようにメソッドの役割分担を再検討されることをお勧めします。

