C#の基本について

投稿第二回目となる今回のテーマはC#の基本についてです。
備忘録として残していますが、参考にされたい方は是非どうぞ。
(参考にした結果、エラーが起きたとか言われても知らんけど)
環境はVisual Studio 2022 Communityを使用しています。
今回はコンソールアプリで行ってみましょう。

# コンソールアプリの作成方法
## コンソールアプリの場合
1. Visual Studioを起動
2. 新しいプロジェクトの作成
3. コンソールアプリを選択(.Net FrameWorkと書いていないもの)
4. 次へをクリック
5. プロジェクト名を入力して次へ
6. フレームワークで.Net 6.0を選択して作成ボタンをクリック(この部分に関しては.Net Core3.1や.Net 5.0を選択しても変わらないかも)


```C#:コンソールアプリの初期コード
// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");
```

## コンソールアプリ(.Net Framework)の場合
1. Visual Studioを起動
2. 新しいプロジェクトの作成
3. コンソールアプリを選択(.Net FrameWork)を選択
4. 次へをクリック
5. プロジェクト名を入力して、フレームワークは.Net framework 4.8を選択して作成ボタンをクリック


```C#:コンソールアプリ(.Net FrameWork)の初期コード
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Program //internal class Programが初期コードになっている場合もある、というか僕はinternalがついています。
    {
        static void Main(string[] args)
        {
        }
    }
}
```
見比べてみるとお分かりかと思いますが、コンソールアプリには後ほど出てくる「ステートメント」が、
.Net Frameworkで作成したコンソールアプリには「メソッド」、「クラス」などが追加されていますね。
ちなみに後者はこのままでは動きません(正確には動きますが、ステートメントがないため何も表示してくれません。)
[※internalキーワードMS公式ドキュメント](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/internal)


# C#のプログラムの構成
基本的にはどの言語にも共通していることかと思いますが、ステートメントやメソッドなどの集まりで構成されています。

## ステートメント
変数宣言、メソッドを使用する命令文
C#では「;(セミコロン)」で終わる
```c#:例
int i = 10; //ステートメント：int型の変数iを宣言してそのiに10を代入
Console.WriteLine(i); //ステートメント：コンソールにiの値を表示
Console.WriteLine("Hello World"); //ステートメント：コンソールにHello Worldの文字列を表示
```
ここまでであればコンソールアプリ(.Net FrameWorkと書いていないもの)でも可能かと思います。
※僕自身が初心者のためひとまずこの表現でご勘弁を


## メソッド
命令文(ステートメント)のまとまりのこと
Methodを使ったステートメントだけで、メソッド内にまとめられたステートメントが全て処理される
```c#:例
static void Method(string[] args) //メソッド「Method」をインスタンス生成無、戻り値無で宣言
{   //上記のステートメントをメソッドとしてまとめる
    //ここから↓
    int i = 10;
    Console.WriteLine(i);
    Console.WriteLine("Hello World");
    //ここまで↑が全て実行される
}
```



## クラス
関連するメソッドをまとめる
クラスの名前は名前空間と呼ばれるルールに従って命名する(クラスの命名はルールがありますよ)
```c#:例
class Class //クラス「Class」を宣言
{     //メソッドをクラス内にまとめることでClass.Method()という形で呼び出すことができる
    static void Method(string[] args)
    {
        int i = 10;
        Console.WriteLine(i);
        Console.WriteLine("Hello World");
    }
}
```
※多分このままコピペしても動きません。なぜなら…下記の通りです。

## ソースファイル
その名の通りソースコードが記述されたファイル

# 色々解説？
## using
```C#:コンソールアプリ(.Net FrameWork)の初期コード
using System;
using System.Collections.Generic;
//...以下略...
```
[usingキーワード(公式MS公式ドキュメント)](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/using)
現時点での僕の理解では、「usingキーワード」はPythonでいう「import ライブラリ名」や、VBAの外部参照にあたるものなのかなと思っています。
このソースコードでは.Net Framework固有(？)のライブラリである、SystemやSystem.Collections.Genericなどを使いますよ〜という宣言(ステートメント)みたいな(違っていたらご指摘お願いします。)
コード内の"using System;"という部分に焦点を絞って考えてみると、Systemというライブラリを使うことで、"System.Console.WriteLine()"と明記する必要はなく、"Console.WriteLine()"と省略して使えるようになるのかなと。
このusingを使わないのであれば「ライブラリ名.クラス名.メソッド名()」という形になります。(きっと)
※ちなみにここまでライブラリと言っていますが、正しくは「名前空間」です。

## namespace
```C#:コンソールアプリ(.Net FrameWork)の初期コード
namespace ConsoleApp1
{
    class Program //internal class Programが初期コードになっている場合もある、というか僕はinternalがついています。
    {
        static void Main(string[] args)
        {
        }
    }
}
```

[namespaceキーワードMS公式ドキュメント](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/namespace)
このnamespaceですが、実際よくわからんです。直訳すると名前空間なので、先ほどのusingで使えるようになるかと思いますが、そうはいかないようです。
これには.Net Framework固有の名前空間であるかどうかが関係しているのかと推測しています。
このnamespaceで宣言した名前空間はusingで宣言した名前空間とは別に新たに生成されるのですが、別のソースファイルで使う場合にはインスタンスが必要になります。
インスタンスに関しては今の僕にはややこしいため、別の記事で取り上げます。(いやもっと前からややこしいよ！と思っている方、僕も同じ仲間です。一緒に勉強していきましょう。)

## static void Main(string[] args)
上記記載のメソッドの宣言部分です。先ほどの「動きません」の理由が明らかになります。
その理由はMain()メソッドが最初に実行されなければいけないから。
C#のプログラムには必ず１つ(それ以上でもそれ以下でもなく)のMain()メソッドが必要になります。
それではひとつひとつ単語を見ていきましょう。

### static
[staticキーワードMS公式ドキュメント](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/static)
インスタンス化を省略するキーワードです。また出ましたね、インスタンス。インスタンスについては別の記事で。
とりあえずMain()メソッドには"static"が付いてないといけないということは覚えておいてください。

### void
[voidキーワードMS公式ドキュメント](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/builtin-types/void)
このメソッドは値を返さないということを明示するキーワードです。直訳すると「空(から)」という意味です。
処理は実行されますが、値は返さないということです。
初心者にはなんのこっちゃって感じですよね。
でもこの解説をそのまま受け取ってください。値は返ってこないのです。
値を返すための方法もあります。

### Main(string[] args)
Mainメソッドを呼び出すためのパラメーターです。引数(ひきすう)です。
この場合、「string型の配列をargsという名前で受け取ります(必要です)」という意味になります。
* string = 値のデータ型
* [] = 配列
* args = このメソッド内でのstring型配列変数の呼び名

# 最後に
結構ふわふわした感じで曖昧ですが、現時点でこの範囲の僕の理解度はこんな感じです。
有識者の方、ご覧いただけたらご指摘などのコメントお待ちしております。(柔らかい言い方でお願いしますね笑)
血迷って僕の記事をご覧になった初心者の方、一緒に頑張りましょう。
いずれインスタンスについてもお伝えしていきます。
オブジェクト指向型言語なので、そもそもわかりやすく一般的な定義をお伝えできるかどうか不安です。
次は多分データ型についてかなぁと考えておりますが…