C#をスクリプト言語として利用する方法

# はじめに

`C#er` 諸兄は人生の中で一度は、

> `C#`をインタプリタ言語のように扱えたらどれだけよかったろう...

と考えたことがあるだろう。

それ、できますよってお話。

# 導入

## 前提

- `.NET Core 3.x` 以上が導入されていることが望ましい
    - もちろん `C#er` 諸兄は問題ないよなぁ？！

- `VSCode` が導入済み かつ `C#プラグイン` 導入済み

## dotnet-script のインストール

1. 以下のコマンドを実行する

    ```powershell:powershell
    dotnet tool install -g dotnet-script
    ```

1. 以上、終了

# 使い方

## その１：シェルで使う

サンプルは `Powershell` を利用しているが、`dotnet` コマンドが使えれば別になんでも良い。

1. 以下のコマンドを実行する

    ```powershell:powershell
    dotnet script
    ```

1. インタプリタ環境が起動するので、あとはお好みで

    ```cs:powershell
    Console.WriteLine("Hello, World!!");
    ````
    
    **実行結果**
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125601/c2fe1118-fb41-d2ed-4061-d3e422fbfe62.png)

1. ただ表示したいだけなら `Console.WriteLine()` すらいらない

    ```powershell:powershell
    "Hello, World!!"
    ````
    
    **実行結果**
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125601/44c80cb8-b1a7-1ba8-ac24-c5eecbd600f7.png)

1. もちろん変数に保存した値の確認も同様に可能

    ```cs:powershell
    var msg = "Hello, World!!";
    msg
    ````
    
    **実行結果**
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125601/72022714-e35f-6de9-074b-5f0dd9fc1799.png)

1. `.NET` と言えば `NuGet`!! もちろん対応

    ```cs:powershell
    #r "nuget: Utf8Json"
    var json = @"{ ""key"":100 }";
    var data = Utf8Json.JsonSerializer.Deserialize<dynamic>(json);
    data["key"]
    ````
    
    **実行結果**
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125601/53a22478-8cb6-8f01-4bb0-39d1fe2a098b.png)

## その２：`VSCode`で使う / 単一ファイル

1. 適当なところに `.csx` ファイルを作成して、`VSCode` で開く

    ```powershell:powershell
    New-Item main.csx
    code ./main.csx
    ```

1. とりあえず `Hello, World!!` をする

    ```cs:main.csx
    Console.WriteLine("Hello, World!!");

    // .csxだと直値を出力とかはできない. 以下はエラーとなるので注意.
    // "Hello, World!!"
    ```

1. 実行してみる

    ```powershell:powershell
    dotnet script ./main.csx
    ```

1. `NuGet` も利用可能

    ```cs:main.csx
    #r "nuget: Utf8Json"
    var json = @"{ ""key"":100 }";
    var data = Utf8Json.JsonSerializer.Deserialize<dynamic>(json);
    Console.WriteLine(data["key"]);
    ```
    **実行結果**
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125601/8d207d7b-b002-e510-9259-0bde5bb93fcb.png)

## その３：`VSCode`で使う / インテリセンスを効かせる

その２の方法でも十分と言えば十分だけれども、**`インテリセンスのない C# なんて C# じゃない！！`**
ということで、インテリセンスを効かせた方法も紹介しておく。

1. 適当なところにフォルダを作成して、`C#スクリプトプロジェクト`を作成する

    ```powershell:powershell
    mkdir ./work
    dotnet script init
    code .
    ```
    **実行結果**
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125601/ae7d5664-2dfb-f66e-7583-c05a88c78084.png)

1. インテリセンスが効く！
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125601/0e7100f6-f13e-e08f-3a90-29e930b6d702.png)

1. `NuGetパッケージ` も `VSCode` を開きなおせばインテリセンスが効くように！！

    ```cs:main.csx
    // 以下を追記して、VSCodeで開きなおす
    #r "nuget: Utf8Json"
    ```
    **実行結果**
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125601/91347a04-fdcd-bf7c-4443-20088c602837.png)
    ※インテリセンスが効き始めるまでに時間がかかる場合があります

## もっと詳しく！
**[公式サイト](https://github.com/filipw/dotnet-script)** を読み込むのだ！！

# おわりに

私は `dotnet-script` は、これでがっつり開発！というよりか、わりと断片的なコードの動作確認のために利用しています。
スクリプト利用するなら `F#` の方がかなり優秀だと思います。

ただ、実用に耐えうるレベルのものなのでドンドン使っていってもいいのでは？と思います。

以上、閉廷！！