C#
.NET

C#の備忘録Tips

More than 1 year has passed since last update.


.NET Core 導入で気を付けること


コンソールの文字化け対策



  1. Install-Package System.Text.Encoding.CodePages またはNugetでystem.Text.Encoding.CodePagesをインストール


  2. 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パターンを実装するために、次のような役に立つテクニツクがある。

1. Singletonパターンを利附する。典型的なアプリケーションでは、部品の集合ごとにConcreteFactoryクラスのインスタンスを1つしか必要としない。したがって、通常ではConcreteFactoryクラスをSingletonパターンを使って実装することが最良の方法になる。


つまり、AbstractFactroyパターンのConcreteFactoryに該当するクラスはSingletonでもいいよってこと。

何故なら、ConcreteFactoryクラスは状態を持たないはずだし、生成者なのでインスタンスはアプリケーション内で一人で十分だから。


参考





  1. const値はビルド時に値が読み込まれる。そのため、dllでconstを使用している場合、dllをコンパイルしなおしただけではexe側では値が更新されない(exeのリビルドが必要)