dotnetfiddle.net用にC# Consoleのテンプレートを作ってみた
2016/11/20: 更新
またまた、ご無沙汰です。
社内教育のネタ作りで、ちょっとしたテストコードを書く機会があって、オンラインコンパイラを試してみた。
開発環境のトラブルでOSクリーンインストールをするのに嫌気を指していて、MSDNサブスクリプションを利用して、仮想環境を構築している話を以前の記事に書いた。
ホストOSにはVS Codeぐらいしか入れておらず、コンパイラが入っていないので、仕様書作成メインの作業をやっているときにイチイチ仮想環境を起動するのもダルいというのが、そもそもの動機。
試した中で気に入ったのが、dotnetfiddle.netだったので、そこで作ったテンプレートを紹介しようと思う。
他にもオンラインコンパイラはあるが、紹介記事や比較記事については検索したら色々あるので参照されたし。
概要
dotnetfiddle.netにアクセスしたところ。
気の利いた紹介文句など一切ない。
使ってみて分かったところは・・・
Sign up/Log inしなくても取り敢えず使用できる
一番最初のSign upは、.NET Fiddleアカウントで行う (これ重要)
最初にSign upしたときじゃないと、気の利いた紹介が表示されない!! (これ重要)
Log inして出来ること
- Save/Edit/Delete
- 作成したコードのパーマネントリンクの公開
- 他の人が公開したパーマネントリンクのFork
Cookieが有効なら、ブラウザを閉じて、次アクセスしたときもエディタの状態が端末のキャッシュに残っている
- リセットされたり(後述)、応答がなくなって残っていないときもあるので、忘れずにSaveしよう!!
構文チェックはリアルタイム
Auto Run機能はOn/Off可能
- 編集して構文チェックが通ったら、すぐに実行する機能
- 修正が多い場合は切った方が良い
インテリセンスがある程度効く
環境は.NET Framework 4.5
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 更新)
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の精度や丸めについて確認する。