36176


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)


CC BY-SA 3.0
2017-07-05T13:56:23.170
36118
2017-07-07T13:17:57.817
2017-07-07T07:44:18.003
4236
12778
question
c#
C# メソッド中で処理終了するには？


~~[Application.Exit メソッド](https://msdn.microsoft.com/ja-
jp/library/ms157894\(v=vs.110\).aspx)
でアプリケーションを終了([Runメソッド](https://msdn.microsoft.com/ja-
jp/library/ms157902\(v=vs.110\).aspx)によるメッセージループを抜ける)できます。  
使用例：`Application.Exit();`~~

~~終了する意味でない場合は、~~

C# では埋め込みアセンブラや上位メソッドの`return`を実行するような機能はないので、  
言われるように値を返すようにしてその値で分岐するか  
例外を投げる（結局同じことなので単に値を返す方がいい(try{}catch{}を書くのが余分)かも）  
しかないと思います。  
もしくは、単に、`テスト(); return;` と書く。

また、単にデバッグのためにデバッグ中は`テスト();`のみを実行して  
本処理では`テスト();`を実行しないで後処理を実行するというような場合には、

[#if ディレクティブ](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-
reference/preprocessor-directives/preprocessor-if) が使用できます。

例えば、

[code]

    #define DEBUG
    #if DEBUG  
        テスト();
    #else
        //後処理
    #endif
    
[/code]

のようにすることで、デバッグ(`DEBUG`が定義されている)時には`テスト();`のみを実行し、本処理(`DEBUG`が未定義)の時には後処理部分のみを実行するようにできます。


CC BY-SA 3.0
2017-07-05T14:05:34.273
36119
2017-07-05T15:02:18.423
2017-07-05T15:02:18.423
5044
5044
36118
answer


`テスト()`メソッドではファイルが存在するかどうかの情報を返し、呼び出し元ではその情報を元に`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]

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


CC BY-SA 3.0
2017-07-07T07:43:55.113
36176
2017-07-07T13:17:57.817
2017-07-07T13:17:57.817
4236
4236
36118
answer