0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【C#】こんなコメントアウトの使い方あるんだ...って思ったやつ【小技?】

Last updated at Posted at 2023-01-21

結論

コメントアウトでif文の行を消すだけで中括弧({})は消さなくてもビルドできるみたいです。(知らなかった)


using System;

namespace QiitaCommentOut
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            var flg = false;

            //if (flg)
            {
                Console.WriteLine("IF文の中です。");
            }

            Console.WriteLine("IF文の外です。");
            
            Console.Read();
            //出力:
            //IF文の中です。
            //IF文の外です。
        }
    }
}

環境

IDE
→VisualStudio 2022

フレームワーク
→.Net FrameWork4.7.2

プロジェクト
→コマンドライン

感想

いままでif文をコメントアウトするときは中括弧まで削除していましたが、中括弧は無視されるみたいなのでif文だけをコメントアウトするだけで問題なくビルドできるみたいです。ただ、インデントが深くなってしまうので私は中括弧もコメントアウトしますかね~。そもそも、バージョン管理しているソースであればコメントアウトせずに行自体を削除しますね。

小ネタ

ということで中括弧は無視されるのでこんなコードを書くこともできますね!

qiita.PNG

追記

@albireo さんからコメントにて教えていただきました。

正確には「無視される」わけではなく「if (true){ ... }と同じ条件なしのコードブロック」という扱いになります。
何が違うのかというと、ローカル変数のスコープの違いですね。

常に実行されるif(true){ ... }と同じ扱いのようです。念のため、内部実装がどうなっているのか調べたのですが、調べ方がよくないのか見つかりませんでした。ただ、私もif(true){ ... }と同じ扱いと考えて問題ないと思います。@albireoさんの引用の通り一番の違いは変数のスコープです。


using System;

namespace QiitaCommentOut
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            //変数名が同じでも中括弧のお陰でエラーにならない!
            {
                var scope = "first scope";
                Console.WriteLine(scope);
            }

            {
                var scope = "second scope";
                Console.WriteLine(scope);
            }

            Console.Read();
        }
    }
}

「ひとつのメソッド内によく似た処理が繰り返し出てくるとき、コピペしてもローカル変数名が衝突しない」なんて使い方もしますが、これが重要になるのはラムダ式を使う時でしょうね。
クロージャに取り込む変数を選ぶのに使ったりします。

ひとつのメソッド内によく似た処理が繰り返し出てくるとき、コピペしてもローカル変数名が衝突しない」なんて使い方もしますが、これが重要になるのはラムダ式を使う時でしょうね。の部分に関して私の中では下記ソースと捉えています。


using System;

namespace QiitaCommentOut
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            //内容がほぼ同じラムダ式をコピペしても変数名ダブりエラーが発生しない!
            Action action1 = () =>
            {
                var scope = "first scope";
                Console.WriteLine(scope);
            };

            Action action2 = () =>
            {
                var scope = "second scope";
                Console.WriteLine(scope);
            };

            Console.Read();
        }
    }
}

クロージャに取り込む変数を選ぶのに使ったりします。クロージャに関しては初めて聞く単語で調べたのですが取り込む変数を選ぶという部分は分かりませんでした。クロージャを使用したソース例は下記と考えます。


using System;

namespace QiitaCommentOut
{
    internal class Program
    {
        private static Func<int, int> Sum(int n)
        {
            return x => n + x;
        }

        private static void Main(string[] args)
        {
            var sum10 = Sum(10);

            var sum20 = Sum(20);

            Console.WriteLine($"{sum10(100)}");

            Console.WriteLine($"{sum20(200)}");

            Console.Read();
        }
    }
}

0
0
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?