C#入門してみた!!

今回はc#について勉強したこと、開発で学んだことを書きたいと思います！

### C#とは？

マイクロソフト社が2002年に出したプログラミング言語です。
C#は、オブジェクト指向プログラミング（OOP）を基盤とし、モダンで安全性、効率性、柔軟性を備えた言語です。

### 基本的な書き方
Hello Worldを出力してみます
```c#
using System;

public class Hello {
    public static void Main() {
       // プログラムの開始点
        Console.WriteLine("Hello World");
    }
}

```
実行すると文字列HelloWorldが出力されます！
構文がJavaにていますよね！
ここから各行について詳しく解説していきます

```c#
using System;
```
- using: このキーワードは、名前空間（namespace）をプログラム内で使用できるようにインポートするために使います。
- System: SystemはC#の標準ライブラリで、多くの基本的なクラスやメソッドを提供しています。この行は、Consoleクラスなどを使用するために必要です。

```c#

public class Hello{}
    
```
public: アクセス修飾子で、クラスHelloが他のクラスからアクセス可能であることを意味します。
class: クラスを定義するためのキーワードです。C#では、すべてのコードはクラス内に存在します。
Hello: ここで定義されるクラスの名前です。このクラス内にMainメソッド（プログラムの実行開始点）が含まれます。クラス名は任意ですが、一般的には大文字で始めることが推奨されています（C# の命名規則に従っています）。

```c#
    public static void Main(){}
```
public: Mainメソッドが外部からアクセスできるようにするためのアクセス修飾子です。
static: Mainメソッドがクラスのインスタンスを作成せずに呼び出せることを示します。プログラムの最初に実行されるメソッドであるため、staticが必要です。
void: このメソッドが値を返さないことを示します。Mainメソッドは通常、何も返さないため、voidです。
Main: C#プログラムが最初に実行を始めるメソッドの名前です。C#のエントリーポイントです。

```c#
Console.writeLine("Hello World);
```
Console: System名前空間にあるクラスで、コンソール（ターミナル）に出力するための機能を提供します。
WriteLine: Consoleクラスのメソッドで、引数に指定された内容をコンソールに表示し、改行を追加します。
"Hello World": コンソールに表示する文字列です。このプログラムでは、Hello Worldという文字列を出力します。
C#ではConsole.WriteLineがPythonのprintのようにコンソールに出力するためのメソッドです
### C#の強み

1. クロスプラットフォーム対応
- C#は.NET Coreを使うことで、Windowsだけでなく、LinuxやmacOSでも動作します。これにより、アプリケーションはさまざまなプラットフォームで実行できるようになります。

2. 高いパフォーマンス
- C#は、コンパイル型の言語であるため、実行速度が速いです。また、JITコンパイラ（Just-In-Timeコンパイラ）やガーベジコレクションの技術によって、メモリ管理が効率よく行われます。

3. オブジェクト指向とモダンな構文
- C#は完全にオブジェクト指向の言語であり、クラスや継承、インターフェース、ポリモーフィズム（多態性）など、オブジェクト指向の概念に基づいた開発が可能です。

- 近年では、非同期プログラミング（async/await）やLINQ（Language Integrated Query）などの機能が追加され、コードが簡潔で読みやすくなっています。

4. コミュニティとサポート
- Microsoftが開発していることもあり、ドキュメントが豊富で、Microsoft Learnなどの学習リソースが充実しています。
また、世界中にC#の開発者がいるため、質問や問題解決がしやすいという点も大きなメリットです。

たくさん強みがありますが６番目の強みが一番うれしいですね！

ここからは気になる部分を調べてみたので詳しく解説していきます

### .NET Core
.NET Coreは、Microsoftが開発したオープンソースのクロスプラットフォームフレームワークです。これにより、C#を用いたアプリケーションはWindows、macOS、Linuxなど、複数のプラットフォームで動作可能となり、幅広い環境で利用できるようになりました。


### ガーベジコレクション
プログラムが動的に確保したメモリ（ヒープメモリ）を不要になったとき自動的に解放する仕組みのことです。これにより、プログラマが明示的にメモリ管理を行う必要がなくなり、メモリリークやダングリングポインタ（解放後のメモリにアクセスしてしまうこと）などのエラーを防ぐことができます。

### オブジェクト指向
オブジェクト指向は、現実世界のオブジェクトを模倣する設計方法です。オブジェクトは状態（属性）と振る舞い（メソッド）を持ち、クラスからインスタンス化されます。これにより、再利用性や保守性が高まり、コードの管理がしやすくなります。

- クラス（Class）:
クラスはオブジェクトの設計図のようなもので、オブジェクトを生成するためのテンプレートです。クラスは、オブジェクトの属性（状態）やメソッド（振る舞い）を定義します。
例: 車の「クラス」では、色や速度などの属性や、「走る」や「停止する」などのメソッドを定義します。実際の車（オブジェクト）は、このクラスから生成されます。

- インスタンス（Instance）:
インスタンスは、クラスを基に生成された実際のオブジェクトです。クラスから生成された「実体」で、クラスの定義に従った状態（データ）を持ち、メソッドを実行します。

- カプセル化（Encapsulation）:
カプセル化は、データ（状態）とその操作（振る舞い）をオブジェクトの内部に隠し、外部からはアクセスできないようにする技術です。これにより、オブジェクトの内部構造を変更しても、外部のコードに影響を与えず、セキュリティや保守性が向上します。
アクセス制御修飾子（public、privateなど）を使って、データやメソッドへのアクセスを制限します。

- 継承（Inheritance）:
継承は、あるクラス（親クラス）の属性やメソッドを別のクラス（子クラス）が引き継ぐことができる仕組みです。これにより、コードの再利用性が高まり、共通の機能を親クラスで定義し、個別の機能を子クラスで追加・変更することができます。
例: 「車」クラスがあり、「電気自動車」や「ガソリン車」がその子クラスとして定義される場合、共通の機能（走る、停止する）を親クラスで定義し、子クラスで特定の動作（充電する、給油する）を追加することができます。

- ポリモーフィズム（Polymorphism）:
ポリモーフィズムは、「多態性」とも呼ばれ、同じメソッド名や操作が異なるオブジェクトで異なる動作をすることを指します。これにより、同じ操作をしても、異なる種類のオブジェクトが異なる方法で処理されます。
例: 「車」という親クラスに「走る」というメソッドがあり、子クラスで「電気自動車」は「充電して走る」、また「ガソリン車」は「給油して走る」といったように、メソッドの実行内容がオブジェクトの種類によって変わります。

- 抽象化（Abstraction）:
抽象化は、複雑なシステムの詳細を隠して、重要な部分だけを表現する手法です。オブジェクトの詳細な実装を隠し、外部には必要なインターフェースだけを提供することで、プログラムの理解と管理が容易になります。
例: 「車」クラスが「走る」というメソッドを抽象化し、その具体的な実装は「ガソリン車」「電気自動車」クラスに任せるといった形です。

 ### 記事のまとめ
 C#はモダンで強力な言語であり、クロスプラットフォーム対応のフレームワークである.NET Coreを活用することで、より多くの環境でアプリケーション開発が可能になる。