LoginSignup
3
7

More than 5 years have passed since last update.

C#の備忘録Tips

Last updated at Posted at 2017-08-13

.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のリビルドが必要) 

3
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
7