bool型とメソッドの練習

2021年3月26日

C#の基本について一通り学んだ方向けですが、bool型変数とメソッドのまとめのコードを確認してみましょう。

問題です。
次のコードを実行するとどのような結果が表示されますか?

using System;

namespace BoolSample
{
    class Program
    {
        static void Main(string[] args)
        {
            bool x = CheckBool();

            if (x == true)
            {
                Console.WriteLine("結果はTrue");
            }
        }

        static bool CheckBool()
        {
            bool r = (3 == 3);
            return r;
        }

    }
}

true

まず、CheckBoolメソッドの動作についてみていきましょう。

bool r = (3 == 3);

(3 == 3)は、比較文になります。
3は、3ですか?という当たり前のことが記述してあるのですが、これが基本になります。
どうですか?・・・その通りと思いますよね。これが、つまり、真(true)と言うことになるのです。

そして、その結果(true)が、変数rに代入されます。

CheckBoolメソッドで、実際の比較文の結果が代入される様子

bool r = true;

となるわけです。

メソッドのシグネチャーをみてみましょう

static bool CheckBool()

注意)staticは、staticメソッド(main)からの呼び出しなので必要です。


boolと記述されているの は、このメソッドの結果を呼び出されたところに返す値の型になることを示しています。

return r;

rに代入されている値、この場合は、trueでしたね。
この値は、bool型(trueかfalseのどちらかしか代入できない型)ですね。

このメソッドを呼び出したところに、rの値(true)が戻されるわけです。

static void Main(string[] args)
{
    bool x = CheckBool();
}

呼び出し元はここなので、xにtrueが返るわけですね。

Mainメソッドで、実際の比較文の結果が代入される様子

static void Main(string[] args)
{
    if (x == true)
    {
        Console.WriteLine("結果はTrue");
    }
}

xにはtrueが代入されているので、

if (x == true)

true == true を考えると、CheckBoolメソッドで確認したように結果が trueなので、条件が成り立つということです。

リファクタリング

応用になりますが、このコードは短縮が可能です。

bool r = (3 == 3);
return r;

インテリセンスを使うと次のようになります。

return 3 == 3;

ずいぶん、短くなりました。このような方法も同じ結果ということも覚えておきましょう。

if (x == true)

は、どうでしょう。
同様にインテリセンスと使うと

比較文でのtrue判定の省略

if (x)

このように短くすることが許されています。

さらに上のコード行

bool x = CheckBool();

if (x)

も、一緒にインテリセンスを使いリファクタリングすると、

if (CheckBool())

のようになります。if文の条件式にメソッド呼び出しが直接記述されているのが分かりますね。
このように書かれることも多いので、これも覚えておきましょう。

まとめると、

using System;

namespace BoolSample
{
    class Program
    {
        static void Main(string[] args)
        {
            if (CheckBool())
            {
                Console.WriteLine("結果はTrue");
            }
        }

        static bool CheckBool()
        {
            return 3 == 3;
        }
    }
}

式本体に変換

次の部分をインテリセンスを活用し、式本体にします。コードブロック内が1行の場合、変換が可能になります。

static bool CheckBool()
{
    return 3 == 3;
}

変換後は、次のようになります。 => ラムダ記号は、returnを指しているのが分かります。

static bool CheckBool() => 3 == 3;

これまでのコードをまとめると、次のようになります。
今回は、練習のためメソッドに分けていますが、頭の中でこのコードが浮かんでくるようになるとスキルの向上を自覚できると思います。

using System;

namespace BoolSample
{
    class Program
    {
        static void Main(string[] args)
        {
            if (CheckBool())
            {
                Console.WriteLine("結果はTrue");
            }
        }

        static bool CheckBool() => 3 == 3;
    }
}

おまけ

さらに、if文のところをインテリセンスで変更すると次のようにもなります。
メソッドの全てが、if文の条件式の中に記述されましたね。
このように色々な変換を試してみることで、サンプルコードやライブラリの作りを読み取る力がつきます。
まだまだ、知らないことがたくさんありますね。

using System;

namespace BoolSample
{
    class Program
    {
        static void Main(string[] args)
        {
            if (3 == 3)
            {
                Console.WriteLine("結果はTrue");
            }
        }
    }
}

C#

Posted by hidepon