.NET Core 導入で気を付けること
コンソールの文字化け対策
-
Install-Package System.Text.Encoding.CodePages
またはNugetでystem.Text.Encoding.CodePages
をインストール -
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
をソースに追加
C言語出身者からのC#で気を付けること
定数定義について
public
な定数については、const
を使用すべきではない。
これは、バージョン管理問題1が発生するため。
以下のように、static readonly
を使用すべき。
○ public static readonly double Ratio = 3.14
× public const double Ratio = 3.14
例外処理について
例外処理という概念そのものがC言語にないので、存在は知っていても扱いにかなり戸惑う。
こちらに移動
MultiThreadデザインパターンのC#版について
こちらに移動
このキーワードは何?
volatile
- C言語でも、マルチスレッド動作させるときによく使用するやつ。
- 最適化をさせない変数に対して宣言するというのは、C言語と同じ。
- C言語でもそうだったかわからないが、最適化させないという結果、複数スレッドでアクセスした場合は、常に最新の値が取得できることが保証されるらしい。
- なので、MSDN的には、
lock
等で排他制御をしないフィールドに対して、同期は行いたいというときに使用するべきらしい。
上記より、端的に言うと以下である。
-
lock
した場合は、排他制御あり/同期あり -
volatile
した場合は、排他制御なし/同期あり
Taskについて
Task と ThreadPool の関係
常識なのかもしれないが、Taskを使用して起動したスレッドは、内部的にはスレッドプールを使っているらしい。
Taskの挙動
面白い情報があった([.NET]複数のTaskを一度に開始しようとすると遅延が発生する)
スレッドの数を無駄に増やしてしまわないよう、
新しいスレッドが必要になった場合は、500ミリ秒に1つの割合を
超えないペースでスレッドを生成する設計だとのこと
ということで、Taskは必ずしも同時に並列で実行されるわけではないらしい。
上記の記事より、Taskはスレッドプールを使用しているといえども、複数のTaskを同時実行する要求があると、新しくスレッドを起動する仕組みみたいね。(確かめてないけど)
デザインパターンについて
状態を持つSingleton禁止
状態を持つオブジェクトに対してSingleton
パターンを適用するのはNG
- それただのグローバル変数ですから!
- テストしづらくなるだけ
- DIで渡すとかするべし
じゃあどういうときにSingleton使うのよ?
いろいろ説があるみたいだけど、一番しっくり来たのは以下。
Abstract Factoryパターンを実装するために、次のような役に立つテクニツクがある。
- Singletonパターンを利附する。典型的なアプリケーションでは、部品の集合ごとにConcreteFactoryクラスのインスタンスを1つしか必要としない。したがって、通常ではConcreteFactoryクラスをSingletonパターンを使って実装することが最良の方法になる。
つまり、AbstractFactroy
パターンのConcreteFactory
に該当するクラスはSingletonでもいいよってこと。
何故なら、ConcreteFactoryクラスは状態を持たないはずだし、生成者なのでインスタンスはアプリケーション内で一人で十分だから。
参考
-
const値はビルド時に値が読み込まれる。そのため、dllでconstを使用している場合、dllをコンパイルしなおしただけではexe側では値が更新されない(exeのリビルドが必要) ↩