C#のノート


# はじめに

AzureLearnningで学んだ内容や参考文献などをまとめてノートにする。

---

# 更新日時

2020.07.20 Mon 新規作成 Yamada
2020.07.24 Fri 演算子、インクリメントとデクリメント追加
2020.07.24 Fri .Netクラスライブラリを追加


--- 

# 参考資料

[C# の 最初のステップ(Azure Learnning) ](https://docs.microsoft.com/ja-jp/learn/paths/csharp-first-steps/)

---

# 最初のプログラム

``` cs

Console.Write("Hello,World ");
Console.Write('b');

// Hello,World b

```
---

# 基本ルール

---

## 変数の宣言
- ハッシュ記号は変数名に利用できない
- ドルマークは変数名に利用できない
- 数字で始まる変数名は宣言できない
- C#のキーワードに使われている文字列は変数に利用できない
- 変数の名前には短縮形を使わないこと
- 変数名の大文字と小文字は区別される(Value と valueは違う)
- 変数名にはキャメルケースを利用すること
- 文字列リテラルはダブルクォーテーションを扱う
- 文字リテラルはシングルクォーテーションを扱う


---

## データ型

- 文字列型
    - string 変数名 と書く

``` cs
string HelloStr = "Hello,World ";

Console.Write(HelloStr);
Console.Write('b');

// Hello,World b

```

整数型は種類がある。

- 整数型
    - int 変数名 と書く
    - decimal 変数名 と書く

``` cs

//integer 型の使用例

int firstNumber = 0;
Console.Write("firstNumber = " + firstNumber);

//firstNumber = 0

```

---

## 型変換

- 暗黙的型変換
    - 変数初期化時に代入演算された値に基づいてデータ型を変換すること
    - 宣言時は var 変数名 = 値 と書くこと
    - 宣言時には必ず変数を初期化すること

宣言時に初期化しなかった場合のエラー

```
error CS0818: Implicitly-typed variables must be initialized
```

``` cs
var HelloStr = "Hello,World ";

Console.Write(HelloStr);
Console.Write('b');

// Hello,World b

```

---

## 文字のエスケープ


|表示文字|エスケープ文字|
|:---|:--|
|改行|\n|
|タブ|\t|
|"|\"|
|バックスラッシュ|\\\\|

---

## 逐語的文字列リテラル

- エスケープしなくてもすべての空白と文字が維持される文字列
    - 「@」 をつかう。

``` cs

Console.WriteLine(@"   c:\source\repos   (this is where your code goes)");

```
---

## Unicode エスケープ文字

- \u エスケープ シーケンスに Unicode (UTF-16) の文字を表す 4 文字コードを続ける方法
    - エンコードした文字をリテラル文字列に追加することもできます。

``` cs

// Kon'nichiwa World
Console.WriteLine("\u3053\u3093\u306B\u3061\u306F World!");

```

---

## 文字列の連結

- 文字列の連結には「+」を使います。

使い方

``` cs

string firstName = "Yamada";
string message = "Hello " + firstName;
Console.WriteLine(message);

// Hello Yamada!

```

中間に変数を挟まない方法

``` cs

string firstName = "Yamada";
string greeting = "Hello ";
Console.WriteLine(greeting + " " + firstName + "!");

// Hello Yamada!

```

---
## 文字列補間

- 文字列内で変数の中身を展開する方法

``` cs
string firstName = "Yamada";
string greeting = "Hello ";
string message = $"{firstName} {greeting}!";

Console.WriteLine(message);
// Yamada Hello !

```

中間に変数を挟まない方法

``` cs
string firstName = "Yamada";
string greeting = "Hello ";

Console.WriteLine($"{firstName} {greeting}!");
// Yamada Hello !

```
---

## 文字列補間と逐語的リテラル

エスケープ文字を入れながら変数を展開する書き方
めっちゃオススメ

``` cs

string projectName = "First-Project";
Console.WriteLine($@"C:\Output\{projectName}\Data");

```

---

## 整数値の演算

- 加算には +
- 減算には -
- 掛け算には *
- 割り算には /
- 剰余には %


``` cs

int sum = 7 + 5;
int difference = 7 - 5;
int product = 7 * 5;
int quotient = 7 / 5;
int mod = 7 % 5;

Console.WriteLine("Sum: " + sum);
Console.WriteLine("Difference: " + difference);
Console.WriteLine("Product: " + product);
Console.WriteLine("Quotient: " + quotient);
Console.WriteLine("Mod: " + mod);

/*
Sum: 12
Difference: 2
Product: 35
Quotient: 1
Mod: 2
*/

```
decimal 型で計算する場合は数値の後ろに「m」をつける

``` cs
decimal decimalQuotient = 7 / 5.0m;
decimal decimalQuotient = 7.0m / 5.0m;
```

---

## 小数値の計算
integer型で計算すると小数点以下が切捨てられてしまうのでdecimalにキャストする。

``` cs

int first = 7;
int second = 5;
decimal quotient = (decimal)first / (decimal)second;
Console.WriteLine(quotient);

// 1.4

```
---

## 演算の順序



``` cs
int value1 = 3 + 4 * 5;
int value2 = (3 + 4) * 5;
Console.WriteLine(value1);
Console.WriteLine(value2);

// 23
// 35

```

---

## インクリメント

+演算子を2回続けると値を1増やすことができる。

``` cs

int value = 0;
value = value + 5;
// 初期値 5

value += 5;
Console.WriteLine(value);
// 10
value++;
Console.WriteLine(value);
// 11

```
---

## デクリメント

-演算子を2回続けると値を1減らすことができる。

``` cs

int value = 0;
value = value + 11;
// 初期値 11

value -= 5;
Console.WriteLine(value);
// 6
value--;
Console.WriteLine(value);
// 5

```

---

## 前置と後置

インクリメントとデクリメントはつける位置によって結果が変わる。

演算が前か後かの違い

``` cs

int value = 1;
value++;
Console.WriteLine("First: " + value);
Console.WriteLine("Second: " + value++);
Console.WriteLine("Third: " + value);
Console.WriteLine("Fourth: " + (++value));

/*

First: 2
Second: 2
Third: 3
Fourth: 4

*/
```

---

## 演習
華氏から摂氏に変換するコード

``` cs
int fahrenheit = 94;
fahrenheit -= 32;

Console.WriteLine("The temperature is " + (decimal)(fahrenheit) * 5/9 + " Celsius.");

// The temperature is 34.444444444444444444444444447 Celsius.
```

別の書き方

``` cs
int fahrenheit = 94;
decimal celsius = (fahrenheit - 32m) * (5m / 9m);
Console.WriteLine("The temperature is " + celsius + " Celsius.");

// The temperature is 34.444444444444444444444444447 Celsius.
```

---

# .Netクラスライブラリ

クラスライブラリを活用することで

開発に使う機能をすぐに用意できる。

データ型はクラスライブラリの一つでもある。

---

## 名前空間

データ型における苗字みたいなモノ
クラス名やデータ型が重複しないようにおける仕組み

---
## クラスライブラリの探し方

[Microsoft Docs](https://docs.microsoft.com/ja-jp/)のドキュメントを参照するのが一番

---

## クラスライブラリのメソッドを呼び出す

Randomクラスを使ったサイコロのシュミレート

``` cs

//クラス名(クラスのオブジェクト名).メソッド名

Random dice = new Random();
int roll = dice.Next(1, 7);
Console.WriteLine(roll);

```

---
## 利用しているクラス
Random,Console
名前空間はどちらもSystem

---

## メソッドの種類

- メソッド
    - ステートレス
        - アプリケーションの状態(メモリの状態)に依存しない
        - Console.WriteLine
    - ステートフル
        - アプリケーションの状態(メモリの状態)に依存する
        - Random.Next
        - 乱数生成には時刻を利用している

※ステートフルメソッドはインスタンスメソッド

※ステートレスメソッドは静的メソッド

--- 

## インスタンス

new 演算子を使うことでクラスのインスタンスを作成できる。
クラスのインスタンスすなわちオブジェクト

``` cs
Random dice = new Random();
```

---

## 何も返さないメソッド

voidメソッドと言います。

---
## メソッドに渡すモノ

引数(ひきすう)と言います。
※「いんすう」ではないです。

RandomクラスのNextメソッドでは
下限値と上限値を指定しています。

---

# おわり