C#での基本的な変数宣言の方法と型推論についてについてわかりやすく徹底解説!
- システム
エンジニア - C#の変数宣言の方法と型推論について教えてください。
- プロジェクト
マネージャー - プログラム中に扱う値やオブジェクトなどを保持するための変数の宣言について紹介します。
C#における変数の宣言
プログラミング言語が提供しなければならない機能として変数があります。今回は、プログラム中に扱う値やオブジェクトなどを保持するための変数の宣言について説明します。
C#は、言語仕様として静的型付け言語と呼ばれるプログラミング言語の1つとなっており、プログラム内で変数を使用する場合には、使用する前に変数宣言をする必要があります。
これは多くの状況において使用される変数の型がコンパイル時に決定され、チェックされることで、実行時のスピードを向上させることができる他、コンパイル時にエラーを発見することができるため、実際のアプリケーションの開発時に実行時のトラブルを事前に発見する事ができるようになります。
反対に、JavaScriptのように、実行時に変数の型が決定されるような言語を動的型付け言語といいます。
変数宣言の基本の形
C#では、変数を使用する状況によって変数宣言の形がいくつか変化しますが、基本的な形は以下のような形になります。
アクセス修飾子 変数の型 変数名 ( = 変数への初期値 );
アクセス修飾子は、主にクラスや構造体で使用されます。
変数の型は、C#がフレームワークとして提供する基本的な型の他、クラスや構造体のように開発者が型宣言をして作成した型を指定します。
使用する状況や開発環境であるC#のバージョンによって使用できるキーワードが異なっているため、自分が使用しているフレームワークのバージョンに注意をする必要があります。
それでは、C#における変数宣言において、各項目について説明します。
アクセス修飾子について
アクセス修飾子とは、宣言された変数のプログラム内での使用範囲(スコープ)について指定するために使用されます。
一般に変数宣言でアクセス修飾子を指定する場合は、以下の4種類とその組み合わせを設定することができます。
・クラスの内外で無制限のアクセスができます。
・同一アセンブリ、プロジェクト内でならpublicと同等です。
・protected : クラス内ではprivateですが、継承されたクラスからはアクセスできます。
・private : クラス内でのみアクセス可能です。
C#での変数宣言において、アクセス修飾子を使用するのはクラスや構造体内で使用する変数に、その変数をどの範囲でアクセスさせるのかを決定する際に使用します。
ローカル変数(メソッド内で使用される変数)では、自然と変数のスコープが決定されるため使われることはありません。
1
2
3
4
5
6
7
8
9
10
11
12
|
例: クラス内でのアクセス修飾子を用いた変数宣言の例
public class AccessTestClass {
// クラスの外からアクセス可能
public int val1;
// 同一プロジェクト内であれば、publicと同等
internal int val2;
// クラス内または、このクラスを継承したクラス内でアクセス可能
protected int val3
// クラス内からのみアクセス可能
private int val4;
}
|
変数の型について
変数の型には、大きく分けて値型と参照型があります。
これらの違いは、宣言された変数が実際に変数内にデータが格納されるか、それともそのデータへの参照(データへのアドレス)が渡されるかの違いになります。
よく使われる値型や参照型には以下のようなものがあります。
値型
・整数型(byte, sbyte, ushort, short, uint, int, ulong, long)
・浮動小数点型(float, double)
・ブール型(bool)
・列挙型
・構造体型(charを含む)
1
2
3
4
|
C# 9.0以降
・nint, nuint
C# 7.0以降
・タプル型
|
参照型
・文字列型(string)
・デリゲート型
・dynamic型
・classで宣言される型
1
2
|
C#9.0以降
・レコード型
|
配列の宣言
配列は、ある特定の型を複数個含む変数のことです。
C#では、一次元配列・多次元配列・ジャグ配列の3種類があります。C言語や、C++言語のようなプログラミングと違い、C#では配列は種類に関係なくすべて参照型となります。
各配列の変数宣言には、変数型に続いて、[]キーワードを使用して変数宣言を行います。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
一次元配列の宣言
int[] numbers = new int[10];
多次元配列の宣言
int[,] grid = new int[10, 10];
ジャグ配列の宣言
int[][] jaggedArray = new int[3][]
{
new[] { 1, 2, 3 },
new[] { 1, 2, 3, 4, 5 },
new[] { 1 },
};
|
変数名について
変数名には、使用する目的や状況によってプログラマー自身が自由につけることができますが、C#を含む.Net APIでは、その全体で使用される変数名の命名規則というものがMicrosoftによって定められています。
C#を使用したフレームワークで開発するにあたり、一貫性のある名前付けを行うことは、チームで仕事をする上での生産性にも大きく関わる部分になります。
C#での変数宣言の際の名前付けの規則としては、Pascal形式やキャメル形式などがあります。
Pascal形式 | キャメル形式 |
---|---|
PascalCasing | pascalCasing |
CamelCasing | camelCasing |
表のようにPascal形式では、単語ごとの先頭を大文字にするのに対し、キャメル形式では先頭の単語を小文字に、次の単語をつなげる際には大文字から始まるようにして変数名を命名します。
型推論とはなにか
varによる型推論での変数宣言
varキーワードは、C#3.0から追加された型推論と呼ばれる機能を使用したものになります。
varキーワードを使用した変数は、その初期化される値に応じてコンパイラが型を推論して決定してくれます。
1
2
3
|
var val1 = 1; // int型
var val2 = "Hello World"; // string型
|
JavaScriptの経験がある方は、このvarキーワードによる変数宣言には馴染みがあるかもしれません。しかし、一見同じように使われているので誤解されることがあるのですが、先にも述べたとおりC#は静的型付けがされるプログラミング言語である(コンパイル時に使用する変数の型が決定される)ため、JavaScriptと同じように動作はしません。
varで変数宣言したものに異なる型の値を代入した場合、コンパイルエラーが発生します。
1
2
3
|
例:
var val1 = 10;
val1 = "Hello World!"; // JavaScriptでは動くが、C#ではコンパイルエラーとなる。
|
varを使うべきかどうか?
varによる型推論は開発者にとって便利で強力な機能ではありますが、乱用される恐れもあるため注意が必要です。特にプログラミングでは、デバッグ、リファクタリング、機能修正のような作業も多く、コードを書くことよりも読むことの方に時間を使う傾向にあります。
この傾向を考えると、varを多用することはコードを読む人間にとっては使用されている変数の型をコードを見るごとに自分で考えなければならないため、結局は時間がかかってしまうことになりますので、どこでもvarを使って変数宣言をするのはやめましょう。
ただし、いくつかの点でvarキーワードを使用した変数宣言をしたほうが良い場合もあります。
1
2
3
4
5
6
7
8
9
10
|
使ったほうが良い例
// string型であることがわかる。
var val1 = "Hello World!";
// int型であることがわかる。
var val2 = 1;
// 右側から型名が明らかであるとき
var numList = new List();
|
その他の状況でvarが必要となるのは、匿名型と呼ばれる型を使用する際になります。
匿名型はその名前が示すとおりに実際に型名を書くことがきませんので、このような場合にはvarを使う必要があります。(C#3.0でvarキーワードが追加されたのはこのためです。)
- システム
エンジニア - C#の変数宣言についてよく理解できました。
- プロジェクト
マネージャー - 基本を守ることで仕事の生産性もアップしますよ。
C#における変数宣言のまとめ
C#の基本である変数宣言について、以下のことを説明しました。
アクセス修飾子 変数の型名 変数名 (= 初期化したい値);
主な注意点としては以下のとおりです。
・アクセス修飾子は、クラスや構造体内での宣言時に使われます。
・変数の型名には、値型と参照型があり、変数に格納されるデータが違うので注意が必要です。
・変数名は、開発チーム内で規約がない限りは、.Netのルールに則った形式を守ります。
・コンパイラが型を推論してくれるvarキーワードは、コードを書く側には便利な機能ですが、乱用するとその後の可読性を損なうので使用には注意が必要です。
プログラミング言語において、変数の宣言や変数の命名は、基本でありながら開発者としてのスキルや経験が出る場所です。基本を守ることでチームでの仕事の生産性の向上にもつながりますのでしっかりと押さえていきましょう。
FEnet.NETナビ・.NETコラムは株式会社オープンアップシステムが運営しています。
株式会社オープンアップシステムはこんな会社です
秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
数多くのエンジニアが集まります。
-
スマホアプリから業務系システムまで
スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。
-
充実した研修制度
毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。
-
資格取得を応援
スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。
-
東証プライム上場企業グループ
オープンアップシステムは東証プライム上場「株式会社オープンアップグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
株式会社オープンアップシステムに興味を持った方へ
株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。
C#新着案件New Job
-
システム開発/東京都新宿区/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円東京都新宿区(新宿駅) -
システム開発/東京都新宿区/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円東京都新宿区(新宿駅) -
デバック、テスト項目の作成/神奈川県横浜市/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円神奈川県横浜市(桜木町駅) -
デバック、テスト項目の作成/神奈川県横浜市/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円神奈川県横浜市(桜木町駅) -
基幹システム開発導入/東京都新宿区/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円東京都新宿区(西新宿駅) -
基幹システム開発導入/東京都新宿区/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円東京都新宿区(西新宿駅)