Tips

2018.05.29

C# 基礎 第10回 変数定義

名前をつけて管理しよう

みなさん、こんにちは。
執筆者の後藤です。
最近すさまじく暑くなってきましたが、
ご体調、大丈夫でしょうか。
熱射病や脱水症状、体調不良に
気をつけてくださいね。

この連載も10回目です。
今日学ぶ内容は、『変数定義』です。
『変数定義』というのは、文字列、整数、小数、真偽値などさまざまなデータに、
名前をつけてあげることです。

名前をつけてあげることで、そのデータが何を表しているのか、
書いている自分も、
読んでいる他のチームメンバーも、
分かりやすくなります。

変数定義と、次回の条件分岐が両方出来るようになると、
本格的なプログラミングをする基礎が整っていきます。
ひとつの山場ですが、どうか気楽な気持ちで読んでいただけると幸いです。

今日のラインアップです。

  1. 名前をつけることはなぜ大事か
  2. 変数定義
  3. 変数名の基本ルール
  4. よりよい変数名にするために
  5. 型指定するかしないか
  6. 定数
  7. 実習
  8. まとめ

1. 名前をつけることはなぜ大事か

私たち人間の言語では、『猫』や『犬』という名前をつけて、
現実世界のいろいろな物や生き物を整理しています。
もしこういう名前がないと、とても不便ですね。

同じように、プログラミングでも、名前をつけて整理することが重要です。
名前のないデータがぽんとあると、
何を意味しているのかとつい考えてしまいます。

でも、名前をつけると、とたんにそのデータがわかりやすくなるんです。
これを『変数定義』といいます。
以下の例をご覧ください。

データがあるけれども、名前がない

// ???何を意味してるの???
"CSharp";
"Microsoft";

名前のついたデータ

// なるほど。言語名と会社名だったんだね!
string languageName = "CSharp";
string companyName = "Microsoft";

次章では、C#での変数定義の方法を詳しく解説します。

2. 変数定義

変数定義は、より細かく見ると、
データのための名前を用意する『変数宣言』と、
名前とデータを結びつける『値の代入』の、
二つに分かれます。
実例を見てみましょう。

// 『変数宣言』
// stringがデータ型を明示する型指定キーワードです。
// firstDummyStringは変数の名前(変数名)です。
string firstDummyString;

// 『値の代入』
// firstDummyStringは変数の名前(変数名)です。
// 『=』の意味は、『=』の左にある名前が、実際に指し示しているのは、『=』の右のデータであるということ。
// "aaa"は変数の指す具体的なデータです。
firstDummyString = "aaa";

// 変数宣言と値の代入を同時に行う変数定義
// stringがデータ型を明示する型指定キーワードです。
// secondDummyStringは変数の名前(変数名)です。
// 『=』は、左にある名前が、実際に指し示しているのは、右のデータですよという意味。
// "bbb"は変数の指す具体的なデータです。
string secondDummyString = "bbb";

しかしながら、特別な理由がない限り、変数宣言と値の代入を同時に行います。
この記事でも、以降、変数宣言と値の代入を同時に行うタイプの変数定義を学んでいきましょう。

3. 変数名の基本ルール

変数名をつけるにはいくつかの基本的なルールがあります。

  1. ルール1. ローマ字と数字を使おう
  2. ルール2. なるべく英語で変数名をつけよう
  3. ルール3. 日本語をローマ字にするときは表記を統一

ルール1. ローマ字と数字を使おう

最初の文字には数字は使えません。ローマ字26文字を使ってください。
2回目からは数字も大丈夫です。

最初は小文字です。
複合語は、2個目の単語の最初の文字からは大文字です。
『ローワーキャメルケース』というやり方です。

実例をお示ししますね。

// 慣例違反: 最初が大文字(パスカルケース)
// エラーではないですが、C#の慣習に反します。
string UserName = "Taro";

// 慣例違反: 『_』でつなげる(スネークケース)
// エラーではないですが、C#の慣習に反します。
string user_name = "Taro";

// エラー: 『-』でつなげる(チェーンケース)
// -が引き算の記号と解釈される。全体でひとつの変数名として解釈されない。
string user-name = "Taro";

// 慣例上適切: ローワーキャメルケース
string userName = "Taro";

ルール2. なるべく英語で変数名をつけよう

出来る限り、英語で変数名をつけるようにしてください。
C#は英語を元に作られています。
変数名も英語にすることで、全体的な読みやすさがあがります。
英語モードと日本語(あるいは中国語やアラビア語など)モードを切り替える
必要性をなくすのです。

実例です。

// 悪例
// 英語モードと日本語モードをスイッチする必要がある。
string yuuzaaNoNamae = "Taro";

// よい例
string userName = "Taro";

ルール3. 日本語をローマ字にするときは表記を統一

ローマ字日本語は最小限。表記は一貫させてください。
表記が一貫していない例を示します。
このような例は見習うべきではないです。

// 悪例: 日本語ローマ字表記の方式が一定していない。改善すべき。
// 年号の『ごう』を『go』で表記。
string nengoKanji = "平成";

// 年号の『ごう』を『gou』で表記。
string nengouKana = "へいせい";

4. よりよい変数名にするために

前章では変数名の基本的ルールを学んでいただきました。
この章では、より良い変数名のつけ方を学んでいきましょう。
二つヒントをお示しします。

  1. ヒント1. 意味のある名前をつけよう
  2. ヒント2. 略号はやめよう

ヒント1. 意味のある名前をつけよう

名前をつけるのは、そのデータが何を表しているか、
名前を見ただけで理解できるようにするためです。
ですので、英語としてみた際に、意味を読み取れない
名前は避けましょう。

実例をご解説しますね。

// 絶対に避けるべき例
// iって何だろう???
int i = 123;
// aって何だろう???
string a = "Taro";

// 良い例
// ユーザーIDが123なんだ
int userId = 123;
// ユーザーの名前はTaroさんなんだね
string userName = "Taro";

ヒント2. 略号はやめよう

自分とコンピュータにしかわからない略語は、
他人が読んだときに読みづらいです。
多少長くても、情報をつめることが大切です。

// 悪例:
// userNameをuNmと略している。
// 略号は読み手の思考コストを増やすので、避ける。
string uNm = "Taro";

// よい例:
string userName = "Taro";

5. きっちり型指定するかしないか

第1回で述べたとおり、C#はデータ型が大切な言語です。
そのデータがどのデータ型なのかを、変数定義の際も指定します。

ただし、実際に代入されるデータをみれば、
そのデータ型が絶対に誤解されないと判断したときは、
特別な型指定キーワードvarを使えます。

ここでは、この連載向けの基準を示します。
C#初心者の方にも使っていただけるよう基準を決めてみました。
(上級者は、『絶対に誤解されない』範囲がかなり広いので、多くvarで済ませる傾向があります。)

varを使うべき場合

『=』の右側にデータだけが直接書かれていて、文字列、整数、小数、真偽値である場合

実例

// ""にはさまれているので文字列型とわかる。
var customerName = "Hanako";

// ""にはさまれていない。数字だけ。整数型とわかる。
var secondTokyoOlympicYear = 2020;

// ""にはさまれていない。数字と小数点だけ。小数型とわかる。
var approximationOfPi = 3.14;

// ""なしのtrueは、真偽値型とわかる。
var animalsAreOnEarth = true;

『=』の右側にデータだけが直接書かれているわけではない。しかし型名が書いてある場合

実例

// 整数型(int)に変換すると書いてある。
var truncatedApproximationOfPi = (int)3.14;

きっちり型指定をすべき場合

データだけが直接書かれておらず、『=』の右側に型名が書いていない場合すべて

実例

// 返ってくるものが文字列型であることはすぐわからない
string userInput = Console.ReadLine();

// 返ってくるものが整数型であることはすぐわからない
int randomInt = (new Random()).Next(0, 3);

定数化をする場合(後述

6. 定数

名前とデータの組み合わせをしても、
話はそこでは終わりません。
実は、名前を変えないまま、中身のデータだけを入れ替えることが
C#では可能なのです。

実例

	// languageYouLearnCSharpはCSharpを指している
	var languageYouLearn = "CSharp";
	
	// languageYouLearnCSharpの中身がJavaに変わる
	languageYouLearn = "Java";
	
	// Javaが画面に表示される
	Console.WriteLine(languageYouLearn);

同じ名前で、中身が別であることは、なるべく避けるべきです。
対策のひとつが、中身が書き換え不可能な変数を作ることです。
これを定数といいます。
(変数や定数という日本語の名前付けが不適切なことにはここでは触れません。)

型指定キーワードの前に、constというキーワードをつけます。
このことで、中身の書き換えを防げます
ただしこのとき、型指定キーワードに、varは使えません。
細かく型指定をしてください。
また、文字列、整数、小数、真偽値のデータのみを『=』の右側に書いてください。

実例

// 定数を定義しました。
const string languageYouLearn = "CSharp";

// 以下はエラー。定数には再代入は出来ない。
languageYouLearn = "Java";

7. 実習

問題1. 以下のデータに名前をつけてください。

データ1. "Tokyo"
データ2. 2020
データ3. 3.14
解答例
[csharp] // データ1
var japaneseCapitalName = "Tokyo";

// データ2
var secondTokyoOlympicYear = 2020;

// データ3
var approximationOfPi = 3.14;
[/csharp]

問題2. 以下の変数名は不適切です。書き換えてください。

変更前

// 要改善:
// iは何の情報もあらわしていない。
// 最初の東京オリンピックの開催年だと明示すべき。
var i = 1964;
Console.WriteLine("最初の東京オリンピックは" + i.ToString() + "年に開かれました。");
解答例
[csharp] var firstTokyoOlympicYear = 1964;
Console.WriteLine("最初の東京オリンピックは" + firstTokyoOlympicYear.ToString() + "年に開かれました。");
[/csharp]

問題3. 以下型指定キーワードが、適切かどうか解答してください。その際、初心者もこのソースコードを読むことを前提としてください。

string messageFromAuthor = "Great! You are marvelously progressing in learning C#!";
string userInput = Console.ReadLine();
int prefectureNumberInJapan = 47;
double approximationOfPi= 3.14;
解答例
解答例1(この連載の型指定の暫定基準に沿ったもの)

        1行目: 型指定キーワードをvarにすべき。""にはさまれているので、文字列型なのは自明なため。
        2行目: 型指定キーワードはstringのまま。コマンドライン画面が読み取ったデータが文字列扱いか自明ではないため。
        3行目: 型指定キーワードはvarにすべき。""にはさまれていない数字だけのデータは整数型なのは自明なため。
        4行目: 型指定キーワードはvarにすべき。""にはさまれていない、数字と小数点だけのデータは小数型なのは自明なため。

解答例2(より誤解の余地をなくそうとした解答)

        1行目: 解答例1と同じ。ただし、""の有無は関係ない。中身に数字がなく、trueでもfalseでもない。文字列以外ありえない。
        2行目: 解答例1と同じ。
        3行目: 解答例1には反対。型指定キーワードはintのまま。""のあるなしで文字列か整数か決まるので、初心者にはわからない。
        4行目: 解答例1には反対。型指定キーワードはdoubleのまま。""のあるなしで文字列か小数か決まるので、初心者にはわからない。

問題4. 以下の真偽値型の変数名conditionを、何の条件なのか具体的にわかる名前に書き換えてください。

var userId = 101;
var userIdOfCelebrationTarget = 100;

// 改善すべき:
// 何の条件(condition)なのか、明示してほしいです。
bool condition = (userId == userIdOfCelebrationTarget);
解答例
[csharp] var userId = 101;
var userIdOfCelebrationTarget = 100;

bool userShouldBeCelebrated = (userId == userIdOfCelebrationTarget);
[/csharp]

8. まとめ

おめでとうございます。
これで、大きな山場を越えましたね。

変数定義が出来るようになったことで、
データを整理、管理することが出来ました。

次回は、『条件制御』を学びます。
変数のあらわすデータしだいで、
何を行うかが異なるプログラムを作りましょう。

ゲーム制作関連のオススメ連載リンク

とっても手軽なゲーム制作体験!
Unityゲーム開発基礎

実際のリリースゲームを題材にしたハンズオンゲーム制作連載
実践unityゲーム開発

Recent News

Recent Tips

Tag Search