はじめてのC#【 01_変数 】


##    はじめに

  __<font color="blue">　【C#(シーシャープ)】</font>__ はMicrosoft社が開発した
　　　プログラミング言語で、C++やJavaに似た構文を持ち
　　　.NET Framework上で稼働するWindowsアプリの開発や
　　　Webアプリケーション開発のためのフレームワークである
　　　ASP.NETが使用可能なプログラム言語です。

##### このメモは、C#の基本的な記載方法のまとめです。

### [動画も作成しました](https://youtu.be/_7NypzNE_i4?si=Th4TMR8IQO0km6pz)。

![01_はじめてのCシャープ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1214133/adee3983-bdff-b3d2-db1f-8c3e1c7b297c.jpeg)




###### 以下のサブ垢記事のリンクもご参考までに。

https://qiita.com/nekoozi/items/33057a27b09213618c85


------------------------------------------------

## <font color="green">プリミティブ型</font>
#### 基本データ型：値そのものを保持（直接的値保持※1）

##### ※1 直接的値保持とは
  ・C#のプリミティブ型（組み込みの値型）は、
変数そのものが値を直接メモリに保持します。
これにより、変数に代入された値へ直接アクセスすることが可能です。

-----------------------------------------------------

##### 01.　int ･･･ [32ビット整数](https://scrapbox.io/nano357/32%E3%83%93%E3%83%83%E3%83%88%E6%95%B4%E6%95%B0%E3%81%A8%E3%81%AF)(4バイト)

```csharp
          例: int number = 10;

        範囲: -2,147,483,648 ～ 2,147,483,647

````
###### 整数値を直接保持し、変数を通してアクセスします。

-----------------------------------------------------

##### 02.　uint ･･･ 32ビット整数(4バイト)
```csharp
          例: uint unsignedInt = 3000000000; 

        範囲: 0 ～ 4,294,967,295

````
###### 符号なしのため、負の値は扱えませんが、正の値の範囲が広がります。

-----------------------------------------------------
##### 03.　long ･･･ 64ビット整数(8バイト)
```csharp
          例: long largeNumber = 33293304432234523L;

        範囲: -9,223,372,036,854,775,808 ～ 9,223,372,036,854,775,807

````
###### 大きな整数値を保持します。

-----------------------------------------------------
##### 04.　ulong     ･･･ 64ビット整数(8バイト)
```csharp
          例: long largeNumber = 33293304432234523L;

        範囲: 0 ～ 18,446,744,073,709,551,615

````
###### 大きな整数値を保持し、符号がないため、負の値は使用できず、正の値の範囲が広がります。

-----------------------------------------------------
##### 05.　short ･･･ 16ビット整数(2バイト)
```csharp
          例: short smallNumber = 32000;

        範囲: -32,768 ～ 32,767

````
###### 小さい整数値を保持します。

-----------------------------------------------------
##### 06.　ushort ･･･ 16ビット整数(2バイト)
```csharp
          例: ushort smallUnsignedNumber = 60000;
 
        範囲: 0 ～ 65,535

````
###### 小さい整数値を保持し、符号なしのため、負の値は扱えませんが、正の値の範囲が広がります。

-----------------------------------------------------
##### 07.　sbyte ･･･ 8ビット整数(1バイト)
```csharp
          例: sbyte signedByte = -100;

        範囲: -128 ～ 127

````
###### 符号があるため、負の値を扱う代わりに、正の値の範囲が狭まります。

-----------------------------------------------------
#####  08.　byte ･･･ [8ビット](https://scrapbox.io/nano357/%EF%BC%98%E3%83%93%E3%83%83%E3%83%88%E3%81%AF%EF%BC%91%E3%83%90%E3%82%A4%E3%83%88%E3%81%A8%E3%81%AF)整数(1バイト)
```csharp
          例:byte unsignedByte = 200;

        範囲:0 ～ 255
````
###### 符号がないため、負の値は使用できず、正の値の範囲が広がります。

-----------------------------------------------------
##### 09.　float ･･･ 32ビット[単精度浮動小数点](https://scrapbox.io/nano357/%E5%8D%98%E7%B2%BE%E5%BA%A6%E6%B5%AE%E5%8B%95%E5%B0%8F%E6%95%B0%E7%82%B9%E3%81%A8%E3%81%AF)(4バイト)
```csharp
          例: float floatValue = 5.99f;

        範囲: 約 ±1.5 × 10⁻⁴⁵ ～ ±3.4 × 10³⁸
        精度: 約7桁の有効数字
````
###### 浮動小数点数を保持します。

-----------------------------------------------------
##### 10.　double ･･･ 64ビット倍精度浮動小数点(8バイト)
```csharp
          例: float floatValue = 5.99f;

        範囲: 約 ±5.0 × 10⁻³²⁴ ～ ±1.7 × 10³⁰⁸
        精度: 約15～16桁の有効数字
````
###### 　☆C#でのデフォルトの浮動小数点型はdoubleで、
###### 浮動小数点数を保持します。

-----------------------------------------------------
##### 11.　decimal ･･･ 128ビット高精度浮動小数点(16バイト)
```csharp
          例: decimal moneyValue = 100.25m;

        範囲: ±1.0 × 10⁻²⁸ ～ ±7.9 × 10²⁸
        精度: 28～29桁の有効数字
````
###### 　☆非常に高い精度を持ち、floatやdoubleよりも大きなメモリを使用しますが、精度が必要な場面で有用です。
###### 高精度の浮動小数点数を保持します。

-----------------------------------------------------
##### 12.　char ･･･ 16ビット(2バイト)
```csharp
          例:char character = 'あ'; または  '1';

        範囲:Unicodeでの文字コード（\u0000 ～ \uffff）
````
###### 　☆[Unicode](https://scrapbox.io/nano357/Unicode%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E6%95%B0%E5%AD%97%E3%81%AE%E8%A1%A8%E7%8F%BE%E3%81%A8%E3%81%AF)という文字コード規格での数字を表す（数字でも文字でもある）。
###### 文字または数値を保持し、文字コードとしての意味を持ちます。

-----------------------------------------------------
##### 13.　boolean ･･･ 8ビット整数(1バイト)
```csharp
          例:boolean isTrue = true; または  boolean isFalse = false;

        範囲:true（真）または false（偽）のみを保持
````
###### 　☆C#では論理値リテラル = true「真」　, false「偽」の値のみを持つことができます。空リテラル = nullは代入できません。
###### 直接的に論理値を保持し、状態を明確に示します。



  ・※2　補足、C#のbool型とBoolean型の主な違い
[C#のbool型とBoolean型の違いをわかりやすく解説](https://trends.codecamp.jp/blogs/media/difference-word5#:~:text=C%23%E3%81%AEbool%E5%9E%8B%E3%81%AF%E5%9F%BA%E6%9C%AC%E7%9A%84%E3%81%AA%E3%83%87%E3%83%BC%E3%82%BF%E5%9E%8B,%E3%81%A8%E3%81%AA%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82)

-----------------------------------------------------
##### 14.　nint / nuint ･･･ 組み込みの値型
C# 9.0 以降、新しいプラットフォーム依存の値型である nint と nuint が追加されました。
| 型 | 説明 | CLR 型 |
| --- | --- | --- |
| nint | 符号付き 32 または 64 ビット整数 | System.IntPtr |
|||
| nuint | 符号なし 32 または 64 ビット整数 | System.UIntPtr |

__ネイティブサイズの整数__
プラットフォームに依存して、32ビットプロセスで実行される場合は32ビット整数、64ビットプロセスで実行される場合は64ビット整数として振る舞います。

```C#
// 符号付きのプラットフォーム依存整数
nint platformSpecificInt = -100;
// 32ビット環境ではint (4バイト)、
// 64ビット環境ではlong (8バイト)


// 符号なしのプラットフォーム依存整数
nuint platformSpecificUnsignedInt = 200;
// 32ビット環境ではuint (4バイト)
// 64ビット環境ではulong (8バイト)
````

-----------------------------------------------------
  ##### スコープとメモリの関係
  ・スコープとは、変数やメソッドと呼ばれる特定の処理を実行するためのコードの塊で、呼び出すことで再利用できる機能が使える範囲のことです。

  ・スコープはこの変数がどこで使用可能なのかなどを決めるルールのことを指します。

###### スコープを正しく使うことで、プログラムが安全になり、ミスを減らせます。
-----------------------------------------------------
  ##### スコープの基本：ブロック
  ・C#では、「波カッコ {}」で囲まれた部分を「ブロック」と呼びます。
その中で宣言された変数は、ブロック内だけで使えます。

```csharp
{
    // ここが「ブロック」
    int number = 10;
    // number は、この範囲だけで使用可能
}
````
-----------------------------------------------------
__スコープの種類__

###### 01.　ローカルスコープ

  ・特定のメソッドやブロック内でのみ使用できる変数の範囲です。



```C#
void DisplayNumber() {
    int number = 10; // この変数 "number" は メソッド内だけ
    Console.WriteLine(number);  // number を画面に出力
}
// ここで "number" を使おうとするとエラーになる
````
__ローカル変数__

  ・上記のように、プリミティブ型のローカル変数はスタックという高速なメモリ領域に格納され、スコープを抜けると自動的に解放されます。

-----------------------------------------------------
###### 02.　クラススコープ
  ・クラス内で宣言された変数がクラスのすべてのメソッドからアクセスできる範囲です。

```C#
class MyClass {
    int number = 20; // クラススコープの変数

    void Printnumber() {
        Console.WriteLine(number); // クラス内のどのメソッドからもアクセス可能
    }
}
````


__インスタンス変数__
  ・クラスのフィールドとして宣言されたプリミティブ型の変数は、インスタンスの一部としてヒープに格納されます。

これは、インスタンス自体がヒープに割り当てられるためです。

インスタンスとは、クラスをもとに作られた実際のオブジェクトです。クラスは設計図のようなもので、インスタンスはその設計図を基に生成される実際のデータの塊（オブジェクト）です。

インスタンスが存在する限りその変数は保持されます。

-----------------------------------------------------
###### 03.　静的スコープ（スタティック）

  ・static キーワードを使うと、その変数やメソッドはクラスに属し、インスタンスを作成せずに直接アクセスできます。静的なメンバーはクラス全体で共有され、すべてのインスタンスから同じ値にアクセスします。
```C#
class Counter {
    static int count = 30; // 静的変数

    static void PrintCount() {
        Console.WriteLine(count);
    }
}

Counter.PrintCount(); // 直接クラスからアクセス
````

__静的変数__
  ・静的なプリミティブ型の変数は、ヒープにある静的領域へ格納されます。
プログラム全体で共有されるため、すべてのインスタンスから同じ値にアクセスできます。

--------------------------------------------------------------

__利点と注意点__

#### ローカルスコープの利点
  ・ローカル変数は外部からの影響を受けずに、独立したデータを保持できます。

#### 静的変数の利点
  ・静的変数はデータを共有したい場合に便利です。例えば、すべてのユーザーが同じ設定値を共有する場合などに使用します。

#### 注意点
  ・静的変数はプログラム全体で共有されるため、予期せぬデータ変更が起きる可能性あり、適切に管理することが重要です。
  
--------------------------------------------------------------

## <font color="green">参照型変数</font>
#### 参照型：値（オブジェクト）への参照を保持（間接的値保持）する。

##### 15.　String ･･･ 文字列型
```csharp
          例:string greeting = "Hello, World!";
````
説明:文字列データはヒープに格納され、
string型の変数はその文字列データへの参照を保持します。

stringは不変（immutable）で、
一度作成された文字列は変更できません。※3,4

-----------------------------------------------------
##### 16.　object ･･･ C#のすべての型の基底クラス
```csharp
          例:object obj = new object();
````
説明:すべての参照型と
値型はobject型に変換できます（ボックス化されます）。

-----------------------------------------------------
##### 17.　class ･･･ クラス
説明:クラスはカスタムなオブジェクトを作成するための型で、
インスタンスはヒープに格納されます。
クラスの変数は、そのクラスのインスタンスへの参照を保持します。

   ##### クラスの例
```C#

/** 'Person' クラスの定義 **/

class Person {
    public string Name; // フィールド(属性)
}

// 'Person' クラスの新しいインスタンスを作成
Person p = new Person();

// 'p' の 'Name' フィールドに 'Alice' という名前を代入
p.Name = "Alice";

// 'p' の 'Name' フィールドを出力
Console.WriteLine(p.Name);  // 出力: Alice

````

  ##### ※3
[【C#】String型は不変を実証](http://thinkingisbeautiful.cocolog-nifty.com/blog/2008/04/cstring_1c39.html)

  ##### ※4
[値型と参照型とミュータブルとイミュータブルと #C#](https://qiita.com/chocolamint/items/020143cf249505bf2ffc)

 -----------------------------------------------------
##### 18.　array ･･･ 配列 ※5,6
説明:配列は、複数の要素をまとめて扱うための型で、参照型です。
     配列自体はヒープに格納され、
     配列変数はその配列への参照を保持します。

```csharp
          例:int[] numbers = new int[] { 1, 2, 3, 4, 5 };
````

-----------------------------------------------------
##### 19.　List<T> ･･･ コレクション型 ※7
説明:C#のコレクションは、複数の要素を管理するためのクラスで、
     参照型です。これらもヒープに格納され、
     参照型変数がそのコレクションへの参照を持ちます。

```csharp
          例:List<int> numbersList = new List<int> { 1, 2, 3, 4, 5 };
````

  ##### ※5
[【C#入門】配列の使い方総まとめ(宣言/代入/初期化/要素数/コピー) ](https://www.sejuku.net/blog/45668)

  ##### ※6
[C#配列とは？宣言や初期化の方法など基礎をわかりやすく紹介](https://udemy.benesse.co.jp/development/system/c-sharp-lists.html)
 
  ##### ※7
[【C#入門】Listの使い方総まとめ(ArrayList/Add/Remove/ソート/検索) ](https://www.sejuku.net/blog/47378)

 
--------------------------------------------------------------

## 次回

https://qiita.com/nano357/items/fc89ed47d5bc0cc7603c


--------------------------------------------------------------
## 参考文献

C#関連情報サイト様

https://ufcpp.net/study/csharp/

https://csharp.sevendays-study.com/

https://qiita.com/No2DGameNoLife/items/2c42337d41db5d6b176d

--------------------------------------------------------------