2017-12-02 17 views
2

私は他の定数文字列を連結することによって、新しい定数文字列を作成することができることを知っている:C#でstring定数とint定数を連結して文字列定数を作成できますか?

const string a = "A"; 
const string ab = a + "B"; 

は一定のint型に基づいて一定の文字列を作成することが何とか可能ですか?たとえば、次のようにコンパイルされません。MyClass.DeviceInfoに割り当てられ

const int Dpi = 300; 
const string DeviceInfo = "<DeviceInfo><Dpi>" + Dpi + "</Dpi></DeviceInfo>"; 

式は定数でなければなりません。定数2番目の文字列を追加すること

私は

  1. は(私はint型の値を必要なときにそれをINGのとint.ParseDpi代わりにint型の文字列を作ることによってこの問題を回避できることを知って、
  2. DpiString(したがって、DRYに違反している)、
  3. DeviceInfostatic readonlyフィールドの代わりにconstフィールドを使用してください。

いいえ、文字列定数である表現することはできません...

+1

intを文字列に変換するのはフォーマットプロバイダを使用するため、現在の式はconst式ではありません。実行時にのみ利用可能です –

+0

'string + object'は' object'に対して文化依存変換を使用しますか? [ドキュメント](https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/addition-operator)は残念なことに、それについてはあまり明確ではありません。 – Heinzi

答えて

4

を私はオプション3で行くつもりです、しかし、私は逃した他のいくつかのオプションがある場合は好奇心から、私が思っていました実行時に評価されます。

次の変換は、定数式で許可されている:

  • アイデンティティ変換
  • 数値変換
  • 列挙変換
  • 定数式の変換
  • 変換のソースがNULL値と評価される定数式である場合は、暗黙的および明示的な参照変換です。

ボクシング、アンボクシング、非ヌル値の暗黙的な参照変換を含む他の変換は、定数式では許可されません。これはToString()メソッドへの呼び出しを必要とするので、許可されない「他の変換」でstringフォールズintを変換

実際には、G10数値形式を使用するように定義されたint.ToString()への呼び出しが必要です。これは現在の文化のNumberFormatInfo.NegativeSignに依存するため、原則として変更することができます。私は\u002dハイフン - マイナス文字以外の負の記号に何かを使用する既定の文化を認識していませんが、世界が燃えているのを見たい場合は、実行時に設定することができます。

+0

本質的に、 'string + object'は' object'のカルチャーセンシティブ*変換を実行するので、コンパイル時には実行できません。 – Heinzi

+1

@Heinzi、いいえ、標準では許可されていないため、コンパイラには必要なロジックが組み込まれていないため、実行できないと言っています。すべての機能が存在しないようになっています。この作業には、誰かにコードを書かせて作業させる必要があります。 – Ben

+0

実際には、 'int.ToString()'は現在のカルチャを使用するように定義されています:https://msdn.microsoft.com/en-us/library/6t7dwaa5(v=vs.110).aspx異なって定義されています。 – Ben

0

このケースを処理するには、2つのオプションがあります。

1)Dpiは(それが一定であるため)常に同じである場合、2つの異なる文字列連結必要はありません。文字列自体に直接値を書き込むことができます。

2)Dpiが定数でない場合。次に、String.formatを試してください。

+0

1)[DRY](https://en.wikipedia.org/wiki/Don%27t_repeat_yourself)に違反している、2)も動作しません。 – Heinzi

+0

Device Infoのモデルクラスを作成し、後でXMLにシリアル化することもできます。 –

1

constでそれを行うことはできません。しかし、あなたの主な関心事は何ですか?値が決して変更されないことを確認したいのですか、コンパイル時に値を使用できるようにしますか?

あなたはそれが決して変わらないことを確認したい場合は、これらのいずれかを使用できます。

  1. 読み取り専用フィールド
  2. フィールドでReadOnlyプロパティ、シングルトンクラスにカプセル化の両方。
  3. ReadOnlyプロパティが

静的読み取り専用フィールド

  • 実行時に文字列を連結しかし、いくつかのユースケースでは、あなたがコンパイル時に可能な値を持っている場合があります。その場合は、オプション1と2で説明したように、整数をconst文字列にする必要があります。

  • 関連する問題