2009-07-22 14 views
4

デフォルトでは、メッセージボックス、ラベルなどを介して画面に出力される文字列がある場合、コードで文字列定数を使用します。私は実行時にこれらの文字列を変更したくないので、誰も実際に触れることはありません。文字列定数または文字列リテラルを使用する必要があります

私の質問は:

ビューのメモリの観点から、このアプローチは、その生涯文字列リテラルは、より効率的なようで、より迅速に処分されるのに対し、GBによって決定されるオブジェクトを作成しているようです。私はこれがルーキーの質問であることを知っていますが、リテラルを定数で使用する場合、またはそのようなシナリオで定数を使用する必要がある場合は、(わずかに関係なく)利点があります。

私のアプリでは目立った違いはありませんが、私は開発者としての自分自身を改善し、妥当な時間を保つ標準を構築しようとしています。 :o)

+0

多分私の英語は十分ではありませんが、 "文字列定数"と "文字列リテラル"の違いは何ですか?彼らは同じではありませんか? –

+1

文字列リテラルは、引用符( "foo")の間の部分です。定数は、名前にリテラルを代入するときです(const string FOO = "foo")。私はJasonがリテラルを言うときには、リテラルのインライン(MessageBox.Show( "foo"))を使用することを意味すると思います。 –

答えて

12

どちらもありません。 AFAIKは、リソースファイルを使用することをお勧めします。

+0

私は同意します。リテラルと定数を忘れてしまいます。間違いなく、リソースファイルを使用してください。そうすれば、文字列は外部に保持され、言語に依存しません。 –

+0

もちろん、文脈にもよる。 SOFT_CODEする必要はありません:http://en.wikipedia.org/wiki/Softcoding =) –

3

文字列リテラルに対する文字列定数を使用することをお勧めしますが、パフォーマンスを向上させるのではなく、コードをメンテナンス可能にすることがその理由です。

+1

Amen。メンテナンス性は、OPによって提案されたものと同じように、マイクロ最適化よりも10倍以上の利益を得ることになります。 – JohnFx

3

"string interning"を調べてください。基本的に、ソースファイル内の一意の文字列リテラル(定数またはインライン)はすべて、特別なテーブルに格納されます。彼らはガベージコレクションされることはありませんし、再利用の恩恵を受ける可能性があります。

あなたが今までに(国際化など)を再コンパイルしたいことなく、それらの文字列を変更する場合は、リソースファイルを使用してに見たいと思うかもしれません

+1

文字列インターンションの成功は、最も保守性の高いものを実行することです。 –

+0

文字列インターンは、4.0のC#のデフォルトです。私は、コンパイラが定数(および列挙型)の代わりにリテラルをコードに挿入する場合もそうだと思います。つまり、実装から定数を分離すると、バージョン管理の問題が発生する可能性があります。上のRobに同意すると、最も保守的なことをするべきですが、その文を文字列インターンに限定しないでください。 – Sprague

1

それはあなたがローカライズかでないと、これらの文字列を必要とするかどうかに依存します。ソフトウェアを他の言語に翻訳する機能が必要な場合は、リソースファイルと同じようにエンドユーザーに表示される文字列を配置します。ローカリゼーションが必要ない場合や、問題の文字列がエンドユーザーに表示されない場合は、定数を使用します。あなたの文字列が複数のクラス間で共有されている場合は、パブリック定数として提供される共通の文字列をラップするクラスを作成します。これらの文字列をアセンブリ外で使用する必要がある場合を除き、可能な限り低いプライベート(プライベート、保護、内部)レベルに保ちます。

1

国際化の目的で、受け入れられたベストプラクティス/推奨事項はリソースファイルのセットであることは事実です。

私は自分のクラスで文字列定数を使うのと同じパターンに従っています。私は、Webアプリケーション全体の複数のページで使用されるconstを作成する方が簡単だと分かります。プレースホルダを持つconstでも役立ちます!

//{1} for the user's full name for example 
const string SOME_LABEL = "Thanks for purchasing {0} products, {1}!"; 
関連する問題