基本的に、ここには1つの利点がありますが、それが悪い設計上の決定であるとは信じていません。内部的には文字も整数です。等価テーブルに基づく数値と文字の間の変換は、エンコーディングと呼ばれます。
ただし、.NETでは、文字と文字列はUnicodeでエンコードされます。Unicodeの最初の128文字は、以前のASCIIエンコーディングと同じです。
文字列を数値(またはその逆)に変換する場合、文字も数値であると想定すると、これは非常に簡単に実行できます。次のようなものを想像してみてください。
char c = '1';
int i = Convert.ToInt32(c);
数字と数値表現の間のオフセットは常に0x30です。内部的には、次のようなものを書くことが可能になりました。
int result = c - 0x30;
if (result < 0 || result > 9)
throw new InvalidCastException();
1文字は1つの数値リテラル(0から9)しか保持できないため、この例は文字に対して機能することに注意してください。文字列の場合は、文字のインデックスに10と結果を掛けて、全体の結果値に追加する必要もあります。
もちろん、これは「内部」で機能するのとよく似ています。ただし、実際にはoperator+
、文字列または文字に(またはマイナス)を使用するのは不適切な設計です。これには別の理由もあります。次のコードを想像してみてください。
string s1 = "Hello";
string s2 = " ";
string s3 = "World";
string helloWorld = s1 + s2 + s3;
電話をかけるとoperator+
、次のことが起こります。
- 文字列1の長さと文字列2の長さのメモリを割り当てます。
- 文字列1を新しく割り当てられた配列の前にコピーします。
- 文字列2を新しく割り当てられた配列の後ろにコピーします。
- 新しい文字列のインスタンスを返します。
これは2回発生するため、ガベージコレクターにストレスを与える一時的な文字列インスタンスが作成されます。この例は非常に単純なので、それほど多くはないかもしれませんが、このような多くのコードサンプルのような文字列も見つかりました。
string sql = "SELECT " + c1 + ", " + c2 +
" FROM " + table +
" WHERE " + c1 + " = " + condition + ";";
たぶんコンパイラはこのコードを最適化するでしょう、しかしあなたは彼に頼ることはできません。この場合、ラッパーを使用するStringBuilder
か、少なくともString.Format
内部でを使用するラッパーを使用しStringBuilder
ます。
結論として、文字から整数への暗黙の変換は、エンコードを単純化するのに役立ちますが、文字列または文字を作成する場合は、プラスまたはマイナス演算子を使用しないでください。