2024.02.02
【C#】基礎

UnsplashTim Stiefが撮影した写真

はじめに

例を交えてC#の基本的な文法をまとめたので、時間の無い方にもご活用いただけると思います。

ぜひご活用ください。

動作確認した環境

OS:Windows11 Home/WSL2/Ubuntu 20.04.6
SDK:8.0.101
ランタイム:8.0.1

コメント

■1行コメント

1行コメントには「//」を使います。

// この行はコメントです。

■複数行のコメント

複数行のコメントは「/* */」で囲みます。

/*
    複数行のコメント
    この行もコメントです!
*/

変数

■変数の定義

データ型 変数名 = 値;
例)string hello = "Hello World";

■変数の呼出

呼び出しは変数名だけで呼び出せます。

コンソールに出力するメソッドであるConsole.WriteLine()を使って変数を出力する例が以下です。

例)Console.WriteLine(hello);
出力:Hello World

■データ型

よく使うデータ型を以下にまとめます。

内容
booltrueまたはfalse
int整数
float小数
charシングルクオーテーションで囲まれた1文字
stringダブルクオーテーションで囲まれた文字列

 

また、以下のリンクから組み込み型のデータ型一覧を確認できます。

組み込み型のデータ型一覧:
https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/builtin-types/built-in-types

文字列の連結

「+」で文字列を連結することができます

例)string name = "Taro"
    Console.WriteLine("Hello " + name + "Yamada");

    出力:Hello TaroYamada

 

また、「+=」を使うと変数に文字列を追加することもできます。

例)string name = "Taro";
    name += "Yamada";

※上の例ではnameに「TaroYamada」が格納されます。

変数展開(文字列補間)

「$”{変数}”」のようにすると変数展開できます。

例)string name = "Taro";
    Console.WriteLine($"{name}Yamada");
    
    出力:TaroYamada

配列

配列は以下のように定義します。

■定義

データ型[] 配列名 = new データ型[要素数];
例)string[] names = new string[3];

※[]内は要素数のため、上のように書いた場合インデックス番号の範囲は0~2(=要素数3)です。

 

配列定義の際に初期値を設定する場合はこのように書きます。

データ型[] 配列名 = new データ型[]{初期値1, 初期値2};
例)string[] a = new string[]{"taro", "taku"};

■要素の取得

例)names[0] = "taro";
    names[1] = "taku";

 

Microsoft公式の解説ページのリンクを以下に記載します。
 https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/builtin-types/arrays

多次元配列

■四角形配列

多次元配列の定義方法には「四角形配列」と「ジャグ配列」2つがあります。

2次元配列の定義と要素の取得の例

//定義
データ型[,] 配列名 = new データ型[要素数, 要素数];
例)int[,] numbers = new int[2,3]

//要素の取得
例)numbers[1,2] = 3;

 

3次元配列の定義の例

//定義
データ型[,,] 配列名 = new データ型[要素数, 要素数, 要素数];
例)int[,,] numbers = new int[2,3,2]

//要素の取得
例)numbers[1,2,1] = 3;

 

初期値を設定する場合は以下のように書きます。

//2次元配列
int[,] numbers = new int[,]{
  {1, 2},
  {3, 4}
};

//3次元配列
int[,,] numbers = new int[,,]{
  {
    {1, 2},
    {3, 4},
  },
  {
    {5, 6},
    {7, 8},
  }
};

■ジャグ配列

ジャグ配列は説明を簡略化するため、例のみ記載します。

2次元配列の定義と要素の取得の例

//定義方法①
例)int[][] numbers = new int[2][];
    numbers[0] = [1, 2];    //初期化:配列を代入する
    numbers[1] = [3, 4];

//定義方法②
例)int[][] numbers = [
      [1, 2],    //初期化:配列を代入する
      [3, 4]
    ];

//要素の取得
例)numbers[0][1] = 20;

※ジャグ配列は使用前に必ず初期化する必要があります。
 配列の定義直後に初期化しておいた方が良いです。

 

3次元配列の定義の例

//定義方法①
例)int[][][] numbers = new int[2][][];
    numbers[0] = [ [1,2], [3,4] ];    //初期化:配列を代入する
    numbers[1] = [ [5,6], [7,8] ];

//定義方法②
例)int[][][] numbers = [
      [ [1,2], [3,4] ],    //初期化:配列を代入する
      [ [5,6], [7,8] ]
    ];

//要素の取得
例)numbers[0][0][1] = 20;

コレクション

C#には配列と似たようなものでコレクションというものがあります。
※違いは私もわかりません。。

C#では配列より、コレクションが多用されます。

Microsoft公式の解説ページのリンクを張っておきます。
 https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/builtin-types/collections

 

コレクションは以下のように使います。

//定義
List<データ型> コレクション名 = [値1, 値2, 値3];
例)List<int> numbers = [1, 2, 3];

//要素の取得
numbers[0] = 10;

連想配列

C#ではDictionaryクラスで連想配列を扱えます。

Dictionaryは以下のように使います。

■定義

Dictionary<データ型1, データ型2> 連想配列名 = new Dictionary<データ型1, データ型2>(){
  {キー1, 値1},
  {キー2, 値2}
};

例)Dictionary<string,int> employee = new Dictionary<string, int>(){
      {"taro", 26},

      {"taku", 32}
    };

■キーで要素を取得(値の再代入)

連想配列名.[キー] = 値;
例)employee["taro"] = 21;

■要素を追加

連想配列名.Add(キー, 値);
例)employee.Add("hanako", 28);

■要素を削除

連想配列名.Remove(キー);
例)employee.Remove("taro");

■要素の存在確認

連想配列名.ContainsKey(キー);
例)Console.WriteLine(employee.ContainsKey("taro"));

四則演算

演算内容
int a = 6 + 3;足し算
int a = 6 – 3;引き算
int a = 6 * 3;掛け算
int a = 6 / 3;割り算
int a = 6 % 3;割り算の余り。

複合代入演算子

複合代入演算子を使うと以下のように記述を簡略化できます。

通常      :num = num + 1;
複合演算子:num += 1;

 

演算内容
num += 1;変数numに1を足す
num -= 1;変数numから1を引く

インクリメント/デクリメント

■一覧

記述例内容
++i前置インクリメント。
i++後置インクリメント。
–i前置デクリメント。
i–後置デクリメント。

■インクリメント/デクリメントとは

インクリメント/デクリメントを使うと、以下2つの処理を1行で書くことができます。

・変数に1を足す/引く
・代入する(などなど…)

具体的にはこんな感じです。

int i = 1;
num = ++i;  //「numへのiの代入 & i + 1」を1行でやっている!
Console.WriteLine(num);

出力:2

■前置/後置とは

インクリメントには「前置インクリメント」と「後置インクリメント」の2種類があります。

デクリメントにも同様に「前置デクリメント」と「後置デクリメント」が有りますが、前置・後置の考え方は同じなのでインクリメントでご説明します。

以下は前置・後置の違いです。

前置インクリメント:行の処理の最初に1を足す
例)int i = 0;
  num = ++i;
   ⇒①iに1を足す。  //最初に足す
    ②num に i を代入する
    結果:numには 1 が代入される

後置インクリメント:行の処理の最後に1を足す。
例)int i = 0;
  num = i++;
   ⇒①numに i を代入する
    ②i に1を足す。 //最後に足す
    結果:numには0が代入されている。

比較演算子

記号trueになる条件
==左辺と右辺の値が等しい
!=左辺と右辺の値が異なる
>左辺が右辺より大きい
>=左辺が右辺以上
<左辺が右辺より小さい
<=左辺が右辺以下

条件分岐

■if

if(条件1){
  //条件1がtrueの時の処理
}else if(条件2){
  //条件1がfalse、条件2がtrueの時の処理
}else{
  //条件1,条件2がfalseの時の処理
}

例)

int score = 80;
if(score == 100){
    Console.WriteLine("満点です!");
}else if(score >= 60){
    Console.WriteLine("合格です");
}else{
    Console.WriteLine("不合格です");
}

■switch

switch(変数){
    case 値1
          //変数の値が値1だった時の処理
        break;
    case 値2:
          //変数の値が値2だった時の処理
        break;
    default:
          //変数の値が値1,値2どちらでもないときの処理
        break;
}

例)

string light = "red";
switch(light){
    case "blue":
        Console.WriteLine("青です");
        break;
    case "yellow":
        Console.WriteLine("黄色です");
        break;
    case "red":
        Console.WriteLine("赤です");
        break;
    default:
        Console.WriteLine("信号ではありません");
        break;
}

繰り返し処理(ループ)

■while

条件がtrueの間処理を繰り返します。

while(条件){
  //繰り返す処理
}

例)

int i = 0;
while(i <= 3){
    Console.WriteLine(i);
    ++i;
}

■for

指定回数ループするさせることができます。

for(初期化式; 条件式; 変数の更新){
  //繰り返す処理
}

例)

for(int i = 0; i <= 10; i++){
    Console.WriteLine(i);
}

■foreach

配列の各要素についてループ処理をすることができます。

foreach(配列のデータ型 要素を格納する変数名 in 配列名){
  //処理
}

例)

int[] numbers = {1, 2, 3};
foreach(int number in numbers){
    Console.WriteLine(number);
}

次のループへ:continue / ループを抜ける:break

ループ処理の中で、特定の条件の時だけ次のループへ移ったり、ループを抜ける方法です。

■次のループへ:continue

次のループへ移動したいなら「continue;」を使います。

例)

int[] numbers = {1, 2, 3};
foreach(int number in numbers){
    if(number == 2){ continue; }    //number=2なら次のループへ移動
    Console.WriteLine(number);
}

■ループを抜ける:break

ループを抜けるなら「break;」を使います。

例)

int[] numbers = {1, 2, 3};
foreach(int number in numbers){
    if(number == 2){ break; }    //nuber=2ならループを抜ける
    Console.WriteLine(number);
}

例外処理

try{
  //例外が起きそうな処理
}catch(Exception e){
  //例外が起きた際の処理
  //e:エラーメッセージが格納される変数(変数名は任意)
}finally{
  //例外が起きても起きなくても実行する処理
}

「try{}」の中で以下のように書くと、意図的に例外を発生させることができます。

throw new Exception(エラーメッセージ);

クラス

プログラミングでは、「値を保存したいなら変数」、「処理を保存したいなら関数」を使います。

しかし、規模が大きくなってくると変数、関数が多くなり整理する必要が出てきます。

 

この「変数、関数が多くなり整理」できるのがクラスです。

役割ごとに変数、関数をクラスとまとめることでグループ化ができます。

 

詳細については文章量が多くなるので別記事でまとめています。
以下リンク先をご参照ください。

 https://tekutekku.com/csharp_basic_class/

 

C#の基礎については以上です。