【.NET】「君の名は。」をモチーフに実装してみた

# はじめに
これは、[Visual Basic Advent Calendar 2016](http://qiita.com/advent-calendar/2016/vb) の24日目の記事となります。

メリークリスマス！。今年は映画の「君の名は。」が大ヒットしましたね。

勤めている会社の近くに映画館があるので、サービスデイを選んで映画をよく観に行きます。
「君の名は。」ですがアニメという前提知識だけで監督やプロデューサーが誰とか知らないでスポーツジムで疲れた後に観ました。つまらないと寝てしまうかもと思って見始めたのですがそんなことは全く無く、むしろ観終わった後にこんな脚本を自分でも書いてみたいと思った程です。

さて、「君の名は。」の2大要素といえば、入れ替わりとタイムリープですよね。
これをモチーフにして.NETの2大言語であるVisual BasicとC#で何かしらやってみようという試みです。

# 入れ替わり
映画『君の名は。』で有名なワンシーン
「これってもしかして、俺たち・私たち、入れ替わってるー！？」

体はVisual Basicなのに、心はC＃

```csharp:VisaulBasic

Imports System
Imports Microsoft.CodeAnalysis.CSharp.Scripting

Module ModuleApp

    Sub Main()

        Dim script As String = <query><![CDATA[
		for (int i = 1; i <= 100; i++)
		{
		     if (i % 15 == 0) System.Console.Write("私俺 ");
		     else if (i % 5 == 0) System.Console.Write("俺 ");
		     else if (i % 3 == 0) System.Console.Write("私 ");
		     else System.Console.Write("{0} ", i);
		}
        System.Console.ReadLine();
        ]]></query>.Value

        CSharpScript.RunAsync(script).Wait()

    End Sub

End Module
```
```bat:結果
1 2 私 4 俺 私 7 8 私 俺 11 私 13 14 私俺 16 17 私 19 俺 私 22 23 私 俺 26 私 28
 29 私俺 31 32 私 34 俺 私 37 38 私 俺 41 私 43 44 私俺 46 47 私 49 俺 私 52 53 
私 俺 56 私 58 59 私俺 61 62 私 64 俺 私 67 68 私 俺 71 私 73 74 私俺 76 77 私 
79 俺 私 82 83 私 俺 86 私 88 89 私俺 91 92 私 94 俺 私 97 98 私 俺
```

体はC＃なのに、心はVisual Basic

```csharp:csharp
using System;
using Microsoft.CodeAnalysis.VisualBasic.Scripting;

namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            string script = @"
                For i As integer = 1 To 100
                    If i Mod 15 = 0 Then
                        System.Console.Write(""俺私 "")
                    ElseIf i Mod 5 = 0 Then
                        System.Console.Write(""私 "")
                    ElseIf i Mod 3 = 0 Then
                        System.Console.Write(""俺 "")
                    Else
                        System.Console.Write(i & "" "")
                    End If
                Next
                System.Console.ReadLine()
            ";

            VisualBasicScript.RunAsync(script).Wait();

        }
    }
}
```
```bat:結果
1 2 俺 4 私 俺 7 8 俺 私 11 俺 13 14 俺私 16 17 俺 19 私 俺 22 23 俺 私 26 俺 28
 29 俺私 31 32 俺 34 私 俺 37 38 俺 私 41 俺 43 44 俺私 46 47 俺 49 私 俺 52 53 
俺 私 56 俺 58 59 俺私 61 62 俺 64 私 俺 67 68 俺 私 71 俺 73 74 俺私 76 77 俺 
79 私 俺 82 83 俺 私 86 俺 88 89 俺私 91 92 俺 94 私 俺 97 98 俺 私
```

※[Microsoft.CodeAnalysis.VisualBasic.Scripting](https://libraries.io/nuget/Microsoft.CodeAnalysis.VisualBasic.Scripting)については、NuGetパッケージの管理の検索では見つからず、パッケージマネージャーコンソールからインストールしました。

```bat
PM>Install-Package Microsoft.CodeAnalysis.Scripting.Common -Version 1.2.0
PM>Install-Package Microsoft.CodeAnalysis.VisualBasic.Scripting -Version 1.2.0
```

# タイムリープ
2011年に隕石("Roslyn"(ロズリン))が落下してきました。[^1]

それから4年後のVisual Studio 2015に[次世代コンパイラRoslyn](http://www.buildinsider.net/enterprise/roslyn/01)改め.NETコンパイラープラットフォームとして搭載されました。
これにより前述の入れ替わり(.NET4.6以降)が出来るようになり、C#に置いていかれていた印象[^2]があったVisual Basicも機能的にはほぼ追いつきました。[^3]
Visual StudioのIDEにおいては、リファクタリング機能やインポートの整理と並び替えがC#同様に出来るようになりました。

やっと、C#に「君の名は」と尋ねることが出来るのです・・・

[^1]: Roslynは2011年に初のCTP（コミュニティ技術プレビュー版）を発表
[^2]: 大きな新機能(async, await, Task)はVS2010でC#同様に追加されたが、「yield」などはVS2012でやっと追加された。
[^3]: ラムダ式の制限が多かったり、逐語的リテラル文字列、式の途中でコメント、メソッド内のリージョンなどが出来ないなど格差がありました。

# 最後に
かなりかなり強引ではありますが、「君の名は。」を実現してみ・ま・し・た・・・。あーものを投げないで・・・！！

「君の名は。」については下記のネタでも使いました、良かったらご覧ください。
[TensorFlowコトハジメ Word2Vecで「君の名は。」と戯れてみた](http://yaju3d.hatenablog.jp/entry/2016/11/26/185236)

# 参照
* [Visual Studio 2015の新機能“Roslyn”とは](http://www.buildinsider.net/enterprise/roslyn/01)
* [Visual Basic 2010の新機能](http://www.atmarkit.co.jp/fdotnet/chushin/vb2010features_01/vb2010features_01_01.html)
* [Visual Basic Advent Calendar 2015](http://qiita.com/advent-calendar/2015/vb)
* [.NETコンパイラープラットフォームRoslynを使ってExcelをC#で操作できるように拡張する](http://mspjp.net/article/program/officeaddin/4376/)
* [システムアート研究所：NET Framework VB vs C#](http://systemartlaboratory.com/netvbvscsharp.html)