2012-03-02 11 views
1

ローカル時間からUTCに変換して戻す2つの拡張メソッドを書きました。これは私が持っているものです:タイムゾーンを変換するためのC#拡張メソッド

私はこれら2つを私のアプリケーションで頻繁に使用しています。スレッドセーフであるかどうかは疑問でした。また、抽象クラスにこれらの2つのメソッドを配置し、その後、この抽象クラスから継承する時間操作を含むすべてのクラスを持つことには利点がありますか?

この時間変換トピックに関するご意見ありがとうございます。

+0

私は通常、すべての拡張メソッドを1つのクラスに入れ、拡張メソッドが必要な場所にその名前空間を含めます。こうすることで、この拡張が必要な​​DateTimeオブジェクトにアクセスできます。私は実行時に "混在"することができるので、このために基本クラスを焼くのは嫌です。 –

答えて

3

はい、スレッドセーフです。彼らは変数ネーミング(なぜ "The"の前に、そしてなぜPascalケーシングなのか?)とDateTime.SpecifyKindの使用を検討すべきですが、共有状態では何もしません... TimeZoneInfoにスレッドがない限り安全上の問題は、それはうまくいくはずです。 (TimeZoneInfoが実際にスレッドセーフであることが保証さが、それも不変であることを指摘しています。私はそれは、スレッドセーフであることを期待したいインスタンスメンバーがないことを指定します。)

あなたは間違いなくshouldn」 tは、これを抽象クラスに基本クラスとして入れます。これは継承の悪用になります。 は実際にはではありません。あなたが専門化したい抽象概念を表していますか?拡張メソッドはここで合理的です。

また、あなたがあいまいなまたは無効なコンバージョンの場合に動作する第一の方法でコードをしたいかについて非常に慎重に検討する必要があります。たとえば、クロックが午前2に午前1時に進む場合は、午前1:30その日のそのタイムゾーンでは無効です。同様に、午前2時から午前1時に戻ると、午前1時30分が2回発生します。 TimeZoneInfo.GetUtcOffsetのドキュメントをチェックして、返された値がそれらの状況で必要なものであることを確認してください。

最後に、私の代わりとなる.NETの日付/時刻APIを使用することをお勧めします。

(私はAPIのために考えてきた選択肢の面で、blog post about this very topic先日書きました。フィードバックを歓迎します。)

+0

よろしくお願いします。あなたのスレッドの安全入力と、拡張メソッドをそのままにしておくことをお勧めします。このタイムゾーンの考え方は本当に混乱しています!タイムゾーンを切り替えるためのネイティブの.net機能があることを望みます。datetimeとtimezoneを提供し、datetimeを取得します。表記法に関しては、オブジェクトのインスタンスを扱っているときにTheを置きます。他の人たちは_myVariableを書いています。私が思うようなスタイルのもの。 – frenchie

+0

@frenchie:これはちょっと冗長なようです。特に、1回のメソッド呼び出しで "The"を何回か使用する場合は特にそうです。 「タイムゾーンを切り替えるネイティブの.NET機能」については、「TimeZoneInfo.ConvertTime」の機能とまったく同じですが、使い方を慎重にする必要があります。これは 'DateTime'が根本的に壊れているからです。http://noda-time.blogspot.com/2011/08/what-wrong-with-datetime-anyway.html –

+0

@JonSkeetそれは私だけかもしれないが、SourceForge Noda時間リンクは404ingです。 – cadrell0

1

私たちは同じ言葉を話していることを確認します。 Thread Safetyは、コードの一部が、それだけで、同時に複数のスレッドによって安全な実行を保証するようにして共有データ構造を操作する場合は、スレッドセーフである

あります。スレッドセーフなデータ構造

あなたが来て、クラスのメンバーまたはパラメータを変更している場合、それはスレッドセーフされない唯一の方法である、あなたの方法を見てみるを作るための様々な戦略があります。

ので、これらのメソッドは静的なので、スレッドセーフであるクラスのメンバーを変更することはできません。

メソッドに入ってくるオブジェクトを変更すると、次のスレッドの安全性に違反する可能性があります。

あなたのコードでは、あなたがそのルート上でうまくいく変数を変更していないので。また、あなたが使用していたタイプによって伝えることができます。文字列はimmutableなので、常にスレッドセーフです。 DateTimeは、スレッドセーフであるstructです。

関連する問題