最初に
本記事は「令和時代の基礎文法最速マスター Advent Calendar 2020」にてC#での基礎文法をまとめて記載した記事となります。
初心者の方の役に立てれば幸いです。
まずは基本的なコードを確認してみましょう。
usingSystem;namespaceTest{publicclassHelloWorld{staticvoidMain(string[]args){stringhello="Hello 令和のC#!";Console.WriteLine(hello);}}}
構文
コメント
プログラムの処理に関係しない、プログラムに関する説明などを記載する場合には以下のように//
もしくは/**/
を使用してソースコード内にコメントを埋め込みます。
// 1文の場合
/*
複数行のコメントの場合、/**/で囲んだ文がコメントとなる。
*/
メソッド
staticvoidMain(string[]args)
プログラムはclass内のMain
メソッドという特別なメソッドから始まります。
このメソッドは、アプリケーション起動時に必ず最初に呼び出されます。
Main
メソッド内のWriteLine()
もメソッドであり、引数として渡した文字列を表示します。
ユーザー側で定義する場合は基本的に以下のように書きます。
// アクセス修飾子 戻り値の型 関数名(引数の型 引数名)// void は結果として特に返すものはない時に使用するpublicvoidAttack(){// 何かしらの処理}publicboolIsDead(){// キャラが死んでいるかどうかを返却}privatevoidMoveForward(floatAxisValue){// 前進する処理}
クラス
publicclassHelloWorld{// メソッドや変数等}
public
やprotected
を用いて「継承」や「多態性」という機能を使用することができます。
classはcsファイル内に記述しますが、C#ではファイル名とクラス名は同一である必要性はありません。
また、1つのcsファイル内に複数のclass
を記述することも可能です。
型と変数
stringhello="Hello 令和のC#!";
予めプログラミング言語側で用意されている「組み込み型」には以下のような種類があります。
// ------------値型------------// データ型名 変数名// int(整数)intintNum=2;// float(単精度浮動小数点)floatfloatNum=1.234f;// double(倍精度浮動小数点)doubledoubleNum=1.234;// bool(論理)// true か false 又は 1 か 0 ですboolboolVal=true;// char(文字)// ローマ字一文字を``で囲みますcharc='a';// DateTime(日付)DateTimedate;// ------------参照型------------// String(文字列)// 文字列を""で囲みますStringstr="hoge";// 配列型// 詳細は後述int[]array;
また、先ほどのような自分で作成したclass
を基にした変数も使用可能です。
これを「ユーザー定義型」と呼びます。
publicclassHelloWorld{publicstringSay(){return"Welcome C# World!";}}publicclassHoge{HelloWorldhello=newHelloWorld();stringstr=hello.Say();}
四則演算
// num = 2intnum=1+1;// num2 = 0intnum2=1-1;// num3 = 3intnum3=1*3;// 小数点以下切り捨て// num4 = 0intnum4=1/2;// floatなので小数点が扱える// num5 = 0.5floatnum5=1/2;// 余りの数の求め方// num6 = 1intnum6=10%3;// 複合代入演算子// num = 2num6+=1;// num = 1num6-=1;
インクリメント/デクリメント
++
という、変数に対して1
を足す専用の演算子がインクリメント演算子
というものです。
主にループ処理などで使用されます。
インクリメント演算子
には前置インクリメント
と後置インクリメント
があります。
違いは処理にする変数にて、1を足した後の結果を使用するか、足す前の値を使用するかで違いがあります。
usingSystem;classTest{staticvoidMain(){inti=10;intk=10;// 11が表示されるConsole.WriteLine(++i);// 10が表示されるConsole.WriteLine(k++);// 以降は k の値は11となっている}}
また、変数に対して1
を足す`インクリメント演算子
に対して、変数に対して1
を引くデクリメント演算子
というのも存在しています。
使い方はインクリメント演算子
と変わりません。
usingSystem;classTest{staticvoidMain(){inti=10;intk=10;// 9が表示されるConsole.WriteLine(--i);// 10が表示されるConsole.WriteLine(k--);// 以降は k の値は9となっている}}
アクセス修飾子
publicclassHelloWorld{// メソッドや変数等}
アクセス修飾子は外部からそのclass
やメソッド、変数を見たときに、使用できるか否かを決めます。
publicclassCharacter{// 誰からも見えるし、誰でも使えるpublicGetHP();publicGetName();// このCharacterクラスの内部処理内でしか見えないし、使えないprivatevoidSetRotation();}
他にもprotected
がありますが、こちらは継承の機能を使用する際に使います。
名前空間
namespaceTest{// HelloWorldクラス等}
名前空間(namespace
)とは、同じ名前が存在する(名前衝突)現象を防ぐ役割を持ちます。
例えば以下のように書くと名前の重複でエラーが起きます。
namespaceClassA{publicclassSato{// なにかしらの処理}publicclassSato{// error!}}
しかしnamespace
を使うことによって名前衝突を防ぐことができます。
namespaceClassA{publicclassSato{publicvoidHello(){Console.WriteLine("My name is Sato! My class is A!");}}}namespaceClassB{publicclassSato{Console.WriteLine("My name is Sato! My class is B!");}}
呼び出す時は名前空間付きで呼び出しましょう。
これを「完全修飾名」と言います。
namespaceTest{publicclassHelloWorld{staticvoidMain(string[]args){ClassA.Satosato=newClassA.Sato();sato.Hello();}}}
using
というキーワードを使用することで、修飾名を省略して書くことができます。
この機能をusingディレクティブ
と呼びます。
usingClassA;namespaceTest{publicclassHelloWorld{staticvoidMain(string[]args){Satosato=newSato();sato.Hello();}}}
配列
// 型名[] 変数名;string[]array;
配列の初期化には様々な方法があります。
// 普通の配列// 変数 = new 型名[配列の長さ]intarray=newint[3];// 配列の要素ごとに値を代入array[0]=5;array[1]=10;// 初期データを指定 intarray2=newint[]{0,5,10};string[]cats={"黒猫","三毛猫","ぶち","はちわれ"};// ジャグ配列での初期化int[][]jagged=newint[][]{new[]{1,2,3},new[]{4,5,6,7}};// 四角配列での初期化int[,]grid=newint[,]{{1,1,1},{2,2,2},{3,3,3}};
if
条件分岐の処理を行う際に使用する構文です。
boolisDead=Hero.IsDead();// もし勇者が死んでいたら// if(isDead)でも可if(isDead==true){// Gameover処理}else{// 生きていたらClear処理// else if(isDead != true) や// else if(!isDead) とも書ける}
switchとenum
こちらも条件分岐などを行う際に使用すると便利な構文です。
enumとは列挙型
と呼ばれる機能で、特定の値のみを取るようなものに対して使用します。
enumDayOfWeek{Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday}
switch
文は指定した変数の値によって処理を切り替えます。
DayOfWeekday=DayOfWeek.Monday;switch(day){caseDayOfWeek.Sunday:// おやすむ処理// breakが書かれることで処理を抜けますbreak;caseDayOfWeek.Monday:caseDayOfWeek.Tuesday:caseDayOfWeek.Wednesday:caseDayOfWeek.Thursday:caseDayOfWeek.Friday:// 頑張ってお仕事するにゃんねぇの処理// caseにbreakを入れない場合は次のcaseの処理も続けて実行されますbreak;default:// defaultは変数の値がcaseで定義されている中のどれとも異なる場合に実行されます// 今回はSaturdayが対象です。break;}
C#7.0からは以下のように型による分岐もできます。
switch(obj){caseintn:// 整数だった場合の処理break;casestrings:// 文字列だった場合の処理break;caseboolb:// boolだった場合の処理break;default:// その他の場合の処理break;}
whileとfor
これはどちらもループ処理を行う際に使用する構文です。
まずはwhileから見てみましょう。
while(条件式){// ループ処理}
例えば条件式の部分にtrue
と書くとどこかでbreak
を書かなくては無限ループとなります。
inti=0;while(i<10){++i;// 何か処理if(i==5){// while文から抜けるbreak;}}
次にfor文です。
こちらは、ループ処理に使用する変数の宣言・初期化と条件式、変数の値の更新をセットにして書くことができます。
for(初期化式;条件式;変数の更新式){// ループ処理}
例えば、以下のように配列の要素を参照するときなどに使用できます。
int[]array={0,5,10};for(inti=0;i<array.Length;i++){if(array[i]==0){// continueを書くとここでループ処理が中断され、変数の更新後ループ処理の頭から再度開始しますcontinue;}array[i]+=10;}// arrayの中身は 0, 15, 20となる
foreach
foreach
を使うと、配列の各要素にアクセスして処理を行うのが楽になります。
int[]array={0,5,10};// foreach(変数宣言 in ループ処理したい配列)foreach(intnuminarray){num+=10;}
例外処理
例外を投げる場合にはthrow
を使用します。
thrownewException("not found!");
また、その例外を処理するにはtry ~ catch
を使用します。
try{// 例外が発生する可能性のある処理}catch(Exceptione){// 例外に対応した処理}
最後に
更に詳しくC#について知りたい方は以下のスライドを見てみてください~
https://speakerdeck.com/rossam/shi-te-wakaru-c-number-7-dot-1madefalseyan-yu-ji-neng
また、私の心の中で密かに師匠と崇めている岩永さんの技術ブログも非常におすすめです。
それでは良きC#ライフを!