【ゲーム開発のためのC#入門講座・応用学習編】名前空間を省略できるようにしよう【#7】

2022-02-204.0_C#応用学習編

Visual Studio Codeで環境構築された方へ

本記事はVisual Studio想定であるため、Visual Studio Codeで環境構築された方は下記をご参照下さい。

おさらい

  • オブジェクト指向では基本的に「1クラス=1スクリプトファイル」で管理する
  • 名前空間とはクラスの属するグループを定義できる機能。この機能のおかげで同名のクラスであっても作成し使うことができる
  • 名前空間は入れ子にすることができ、作者名だったりそこに所属しているクラスの性質を表す単語を設定することが多い

前回はクラス名の重複を避けるための仕組み、名前空間について学びました。

このおかげで、例え同じ名前のクラスがあっても、どのクラスなのかを明確にすることができます。これにはコンピュータ君もにっこりですね。

同じ名前の人がいるならばわかるけども……

一方で、この名前空間が長くなればなるほど、コードを書く手間は増えます。

// なげえ!
Yuume.Number.Random random = new Yuume.Number.Random();

名前が重複しているクラスであれば仕方がありません。が、名前の重複がないクラスまで毎回名前空間を書かなければいけないとしたら、それってすごく面倒ですよね。

ようは同じ名前の人が一人もいないのに、常にフルネームで呼び合っているような状態です。長く付き合っていくなら、もっとフレンドリーにいきたいところ。

そこで名前空間を省略するための機能がC#では提供されています。

それがusingです(日本語名とかはないみたいですね)。

usingで名前空間を省略しよう

前回作成したプロジェクトファイルを開いてください。

その上で、今回は特別に下記の設定をお願いします。

  1. ソリューションエクスプローラのプロジェクト名を右クリック
  2. 選択肢の一番下にある「プロパティ」を選択
  3. ビルド項目の全般にある「暗黙的なglobal using」のチェックを外す

それでは、改めて「Random」クラスを確認してみましょう。

// ↓usingがいっぱい!
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
​
namespace Yuume
{
    namespace Number
    {
        internal class Random
        {
        }
    }
}

スクリプトの先頭にいっぱい「using」が並んでいますね。

見慣れないものも多いですが、ひとつだけ、皆さんにも馴染みがあるものがあります。

基礎編で活用していたWebサービスの頃からお世話になっている「コンソール画面に引数の値を出力する」という命令を思い出してみてください。

先頭の文言って何でしたか?

// ↓この「System」ってもしや……?
System.Console.WriteLine(引数);

そう、「System.Console.WriteLine」というのは分解すると、

  1. Systemという名前空間に所属する
  2. Consoleクラスの
  3. WriteLineというメソッド

だったんですね。

そして今回学習する「using」は、指定された名前空間を省略可能にする機能です。

試しに下記のメソッドを「Random」クラスに追加してみましょう。

public int Next(int maxValue)
{
    Console.WriteLine(maxValue);
    return maxValue + 1;
}

「System」という名前空間を省略していても、特にエラーにはなりませんね。

では、今度はプログラムの先頭にある「using System;」をコメントアウトしてみましょう。

// using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
​
namespace Yuume
{
    namespace Number
    {
        internal class Random
        {
            public int Next(int maxValue)
            {
                Console.WriteLine(maxValue);
                return maxValue + 1;
            }
        }
    }
}

今度はエラーが発生しました。「using」を設定していないのに、勝手に名前空間を省略してしまっているため、コンピュータ君が命令を理解できなくなってしまっているんですね。

このように、各クラスを使った命令は本来、名前空間も含めてフルネームで記述しなければなりません。クラスの重複を避けるためとはいえ、毎回書くのは正直かなりだるいです。

少しでも楽するために、そのスクリプト内で使いたい名前空間だけは省略して記述できるようにしておこう、というのが「using」という機能です。

その性質上、スクリプトファイルの先頭にしか記述できないという点にご注意下さい。

また、同じ名前空間に所属しているものは「using」を必要としません。自分自身が属しているものなので、わざわざ名前空間の利用を宣言する必要がない、ということですね。

Microsoftの優しさ……?

先程見てもらった通り、初期設定のコードには勝手にいくつかの「using」が設定されています。

// ↓ここの部分
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

これは、とにかくよく使われる名前空間で、皆があまりにも毎回書いている「using」なもんだから、それなら最初から自動で設定しておくよというMicrosoftなりの優しさだったりします。

とはいえ、それ以外の名前空間を省略したい時には結局自分で記述しなきゃいけないんですよね。

そりゃ命令の度に名前空間を書くよりは先頭で一回書くだけの方が確かにマシです。でも個々のスクリプトの先頭にいつも似たような「using」ばかり書いてて、正直うんざりだよという苦情は昔からあったのです。

そこで、2022/01/20現在の最新バージョン、C#10にてとある機能が導入されました。

それが「global using」という機能です。

すべてのスクリプトファイルに一括適用する「using」機能なのですが、ある意味厄介なのは「暗黙のglobal using」というものも導入されていること。

そう、今回学習にするにあたりチェックを外してもらったアレです。

いくつかの名前空間を強制的に「global using」扱いとする機能のようです。

環境構築編で下記のように説明していた理由がこれです。

2行目は「System」という文言がカットされてはいますが、これまでも使ってきた「System.Console.WriteLine」が記述されています。なぜ「System」がカットされているのかは応用編で解説予定なので、今は「コンソールアプリでは書かなくていいらしい」と思ってもらえればOKです。

「global using」によって「System」という名前空間が常に省略可能になっていたんですね。

そういう意味では一見とても便利そうなんですが、個人的には何とも言えないです。完全に名前空間のこと考えなくてよくなるなら大歓迎なんですが、全然そんなことはないんですよね。

新規作成したクラスにはデフォルトでプロジェクト名の名前空間が設定されるし、先頭には初期設定の「using」が相変わらず実装されているし。

なのに中途半端に設定が隠蔽されていたりすると、未経験者・初心者からしたら「何で?」が深まるばかり……。

その機能追加はありがた迷惑だよ、というのが今回記事を書いていて非常に苦労した僕の愚痴です(死

それはさておき、理屈を理解してしまえばいちおう便利な機能のはずです。今回は説明のために外させてもらいましたが、次回以降はこれまで通りその恩恵を活用していきましょう。

Unityでの活躍ポイント

Unity Technologiesが提供してくれるクラス群もいくつかの名前空間にまとめられています。そのため、それらの名前空間に属するクラスを利用する場合はスクリプトの先頭で「using」しておくのが基本となります。

// Unityでよく利用する名前空間
using UnityEngine;
using UnityEngine.UI;

この「using」を書いておかないと、各命令でいちいち「UnityEngine.クラス名」とか「UnityEngine.UI.クラス名」なんて書かなければいけなくなってしまいます。

忘れずに記述しておきましょう。

実践演習

それでは実際に「using」を使ってみましょう。

仕様

先程のプロジェクトにて、「Program.cs」に下記のコードをコピーしてください。その上で、エラーが発生しないよう、「using」で名前空間を指定してあげてください。

テンプレート
Random random = new Random();
System.Console.WriteLine(random.Next(10));

答え合わせ

今回はエラーがなくなったらOKなので、正解のコード記載はなしです。

まとめ

  • 「using」とは使いたい名前空間の記述を省略できる機能
  • 本来は名前空間も含めてフルネームで記述しなければならないが、毎回フルネームは辛いので、指定した場合のみ省略できるようになっている
  • 「暗黙のglobal using」という、若干迷惑だけどいちおうありがたい機能が導入されたため、一部の名前空間(例えばSystem)については常に記述不要になった

次回で応用学習編は最終回となります。

それでは、今回もお疲れ様でした!

また次の記事でお会いしましょう!

お借りした素材一覧

この記事では下記サイト様の素材をお借りしています。

ありがとうございました!

かわいいフリー素材集 いらすとや (irasutoya.com)

Posted by yuumekou