TomoProgの技術書

底辺プログラマーが達人プログラマーになるまで

C#で見たことが無い型に遭遇した

皆さん
こんにちは、こんばんは
TomoProgです。

気がつけばもうすぐ6月も終わりですね。
今年も半分が過ぎようとしていると思うと早いものです。

最近ブログは週一ぐらいが自分のペースに合ってるなと思ってきました。
ですので、それぐらいのペースで更新していけたらなと思います。

それはさておき、
今回はC#で見たことの無い型を見つけたので、そのことについて書いていこうと思います。

それでは頑張っていきましょう。

戻り値の型がint?ってどういうこと!?

Xamarinを勉強するためにC#で書かれたサンプルコードを眺めていると以下の様なコードに遭遇しました。

static readonly string[] digits = {
    "ABC", "DEF", "GHI", "JKL", "MNO", "PQRS", "TUV", "WXYZ"
};

static int? TranslateToNumber(char c)
{
    for (int i = 0; i < digits.Length; i++)
    {
        if (digits[i].Contains(c))
            return 2 + i;
    }
    return null;
}

なんじゃこりゃ!?
戻り値の型がint?ってどういうこと!?
と心の中で叫んだ私はとりあえず調べてみることにしました。

?を付けるとnullを許容できる

調べてみると以下のサイトに辿り着きました。
メモ帳: [C#] int?

なるほど。
?を付けるとその型の範囲値だけでなくnullを許容できるようになるらしいです。

int?型を使ってみる

本当にnullを許容できるようになるのか実際にコードを書いてみます。

using System;

namespace console
{
    class MainClass
    {
        public static void Main (string [] args)
        {
            int val = null;
            if(val == null)
            {
                Console.WriteLine("val is null");
            }
            else
            {
                Console.WriteLine("val is {0}", val);
            }
        }
    }
}

valがnullであれば"val is null"が表示されるはずですが、
コンパイルしてみると・・・

Error CS0037: Cannot convert null to `int' because it is a value type

nullからint型へ変換できないと言われてしまいました。

次にintに?を付けてみます。

using System;

namespace console
{
    class MainClass
    {
        public static void Main (string [] args)
        {
            int? val = null;
            if(val == null)
            {
                Console.WriteLine("val is null");
            }
            else
            {
                Console.WriteLine("val is {0}", val);
            }
        }
    }
}

これを実行すると、

val is null

nullを変数に入れる事ができ、正しく表示出来るようになりました!!

int?型を関数の戻り値として使ってみる

関数の戻り値でもint?型を使ってみたいと思います。

using System;

namespace console
{
    class MainClass
    {
        public static void Main (string [] args)
        {
            string str = string.Empty;
            char c = 'z';
            str = "123456abcdef";

            int? index = SearchIndex(str, c);
            if(index == null)
            {
                Console.WriteLine("'{0}' is not found", c);
            }
            else
            {
                Console.WriteLine("Index of '{0}' is {1}", c, index);
            }
        }

        private static int? SearchIndex(string str, char target_chara)
        {
            for (int i = 0; i < str.Length; i++)
            {
                if (str[i] == target_chara)
                {
                    return i;
                }
            }
            return null;
        }
    }
}
実行結果:
'z' is not found

文字列の中に対象文字が存在する場合はその位置を、存在しない場合はnullを返す関数を定義しています。
int?型を戻り値に指定することで、戻り値にnullを指定することが出来ました!!

まとめ

  • int型に?を付けるとintの範囲値だけでなく、nullも許容できるようになる

intだけでなくdouble、float、char、boolなどに使用出来るみたいです。
初めて見た型だったので少しビビりましたが、nullが使えるようになると覚えておけばとりあえず大丈夫だと思ってます。

それではまた。

TomoProg

GitHub
TomoProg (TomoProg) · GitHub

Twitter
TomoProg (@tomoprog_xxx) | Twitter