ものがたり(旧)

atsushieno.hatenablog.com に続く

Thread.CurrentCulture

何でもないプロパティのように見えて、これがかなり複雑な存在だったりする。

事はまず、ThreadのインスタンスがAppDomain間で共有されることに始まる。別のAppDomainにあるスレッドを操作するためには、ThreadインスタンスがAppDomain別に生成されていたら意味がない(理論的には、managed code上ではInternalCallのみでやりくりできるのかもしれないが、現実的には後述の理由もあって出来ない)。

Threadインスタンスが同一であるためには、CurrentCultureプロパティの戻り値も同一であるべきだ。実際そうらしい。そんなわけで、CurrentCultureプロパティの返すCultureInfoは、ドメイン間で共有されるようにInternalCall経由でキャッシュされる。

ところで、CultureInfoのmanaged instanceがあるAppDomain上で破棄されたら、他のAppDomain上でも参照できなくなってしまう、というのでは困る。従って、何らかの方法でsetしたCurrentCultureはmanaged object以外の形で存在してもらわなければならない。で、MonoではBinaryFormatterを使ってこれを保持している。

ただし、CurrentCultureが手動でsetされないうちは、こんなことをしても意味がないので、get_CurrentCulture()で取得されたCultureInfoについては、binary serializationは行わない。

…これを最近僕がやっつけたRegionInfoについても同じようにせなあかんのだけど、軽ーく「やっときますわ」と言ってしまって後からびっくりだったのである。