tmori3y2のブログ

主にWindowsのプログラムなど

dotnetfiddle.net用にC# Consoleのテンプレートを作ってみた

2016/11/20: 更新

またまた、ご無沙汰です。

社内教育のネタ作りで、ちょっとしたテストコードを書く機会があって、オンラインコンパイラを試してみた。

開発環境のトラブルでOSクリーンインストールをするのに嫌気を指していて、MSDNサブスクリプションを利用して、仮想環境を構築している話を以前の記事に書いた。

ホストOSにはVS Codeぐらいしか入れておらず、コンパイラが入っていないので、仕様書作成メインの作業をやっているときにイチイチ仮想環境を起動するのもダルいというのが、そもそもの動機。

試した中で気に入ったのが、dotnetfiddle.netだったので、そこで作ったテンプレートを紹介しようと思う。

他にもオンラインコンパイラはあるが、紹介記事や比較記事については検索したら色々あるので参照されたし。

概要

f:id:tmori3y2:20161113211238p:plain

dotnetfiddle.netにアクセスしたところ。

気の利いた紹介文句など一切ない。

使ってみて分かったところは・・・

  • Sign up/Log inしなくても取り敢えず使用できる

  • 一番最初のSign upは、.NET Fiddleアカウントで行う (これ重要)

    • Sign up/Log inは、twitter/gmail/facebookで出来るように見えるが、実は.NET Fiddleアカウントをアクティベイトした後じゃないと出来なかった・・・
  • 最初にSign upしたときじゃないと、気の利いた紹介が表示されない!! (これ重要)

    • twitter/gmail/facebookでSign upするのも含めて4回見れる??
    • 大した内容じゃないので、サクッと目を通そう!!
  • Log inして出来ること

    • Save/Edit/Delete
    • 作成したコードのパーマネントリンクの公開
    • 他の人が公開したパーマネントリンクのFork
  • Cookieが有効なら、ブラウザを閉じて、次アクセスしたときもエディタの状態が端末のキャッシュに残っている

    • リセットされたり(後述)、応答がなくなって残っていないときもあるので、忘れずにSaveしよう!!
  • 構文チェックはリアルタイム

  • Auto Run機能はOn/Off可能

    • 編集して構文チェックが通ったら、すぐに実行する機能
    • 修正が多い場合は切った方が良い
  • インテリセンスがある程度効く

    • 候補は出るが、文字を入力しても、上手く部分一致の候補が選択されないことがたまにある
  • 環境は.NET Framework 4.5

  • Optionで、LanguageをC#/VB.net/F#から選択可能

  • Optionで、Project TypeをConsole/MVC/Script/Nancy (C#/VB.net)から選択可能

  • Optionで、Compilerを.NET 4.5/Roslyn 1.0.0-rc1 (Console/MVC)から選択可能

  • Optionで、Layout Type (MVC/Nancy)を選択可能

  • Optionで、NuGet Package (C#/VB.net/F#, C#/VB.netのScriptを除く)を選択可能

  • ただし、Layout Typeを除くOptionを変更すると、エディタのコードはリセットされる

  • Console Projectはファイルを扱えないようなので、スパゲティになりがちなので注意

    • 後ろに拡張メソッドを作成しておくと良い
  • 制限事項は、Supportを参照

    • 実行時間や容量の制限があるので、大規模なものは実行できない
    • ファイルシステム/外部ネットワークなどの制限あり

最初のテンプレート

https://dotnetfiddle.net/eUNOKp

  • LinqPadっぽい拡張メソッドのDump()/DumpArray()でLinqっぽく文字列出力

  • インテリセンスが効かないが、国産オンラインコンパイラのpaiza.IOでは、gistと連携できるので、テンプレートを作るなら、gistで管理すると良い。若干C#の環境が異なるので、どちらでも動くコードがベスト。 (2016/11/20 更新)

    • paiza.IOでGitHub連携を設定

    • 一覧でGistsを選択

    • Gistに保存したテンプレートを選択

    • GitHub連携を解除して保存

      • GitHub連携を解除しないと、オリジナルのGistが更新される
    • Forkして、ファイル名をMain.csへ変更して保存

      • 変更した内容をGistに登録する場合は、GitHub連携を再設定して保存しなおす

      • Forkしないと、GitHub連携を再設定したときにオリジナルのGistにMain.csが追加される

2進数文字列化の拡張メソッドを含むテンプレート

https://dotnetfiddle.net/qTHGUs

2016/11/20: 更新 (dotnetfiddle.netがタイムアウトする場合は、必要な部分のみ使用してください)

  • Convert.ToString()による2進数文字列化の拡張メソッド

  • Convert.ToString()は、1バイト整数がunsigned、2~8バイト整数がsignedしか、サポートしていない。

    • サポートされていない整数型を使用すると、暗黙のキャストにより整数型が拡張されて意図しない結果になるので、サポートされてない場合も拡張メソッドを定義した
  • 同じサイズの整数型のキャストは、uncheckedの場合はC/C++と同じく、オーバーフロー/アンダーフローをチェックしないキャストとなるので、uncheckedを明示してキャストしている

  • Convert.ToString()の結果は上位の連続する'0'を省略しているので、足りない桁を補う処理を入れた

    • 補う桁数を指定できるようにした (2016/11/20 更新)
  • float/double/decimalは、そのままではConvert.ToString()で2進数文字列化できないので、float/doubleはunionモドキ、decimalはDecimal.GetBits()を利用して変換した

    • ビットの区切りが分かるようにセパレータを挿入できるようにした (2016/11/20 更新)

次回は、これを使用して、float/doubleの精度や丸めについて確認する。