2

単なる好奇心から...

Char 型を使用すると厄介な副作用があることを発見したので、なぜ設計者が同様の動作を選択したのか疑問に思いました。暗黙的な変換により、以下が有効です。

int x = 'A';

ただし、誤解を招きやすいため、以下は少し混乱します。

int y = 'P' + 'Q';

文字列は文字で構成されており、文字列の「合計」は別の文字列を生成するのに、なぜ文字の「合計」が異なる何かを与える必要があるのでしょうか?

さらに悪いことに:

string s1 = 'H' + "ello"; //yields "Hello"
string s2 = 'H' + 'e' + "llo";  //yields "173llo"

それはすべて、暗黙の変換によるものです。ユーザーに明示的に文字を整数に「キャスト」するように強制するのではなく、そうすることの利点を知りたいです(逆の場合も同様です)。

おそらく私の盲目ですが、メリットよりもデメリットの方が多く見られます。

ちなみに、この件に関しては既に質問が出ているのですが、「そう判断した」「悪くない」以外に正当な理由を言う人はいなかったようです。

C# での暗黙の型キャスト

よろしくお願いします。

4

2 に答える 2

1

基本的に、ここには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. 文字列1の長さと文字列2の長さのメモリを割り当てます。
  2. 文字列1を新しく割り当てられた配列の前にコピーします。
  3. 文字列2を新しく割り当てられた配列の後ろにコピーします。
  4. 新しい文字列のインスタンスを返します。

これは2回発生するため、ガベージコレクターにストレスを与える一時的な文字列インスタンスが作成されます。この例は非常に単純なので、それほど多くはないかもしれませんが、このような多くのコードサンプルのような文字列も見つかりました。

string sql = "SELECT " + c1 + ", " + c2 + 
    " FROM " + table + 
    " WHERE " + c1 + " = " + condition + ";";

たぶんコンパイラはこのコードを最適化するでしょう、しかしあなたは彼に頼ることはできません。この場合、ラッパーを使用するStringBuilderか、少なくともString.Format内部でを使用するラッパーを使用しStringBuilderます。

結論として、文字から整数への暗黙の変換は、エンコードを単純化するのに役立ちますが、文字列または文字を作成する場合は、プラスまたはマイナス演算子を使用しないでください。

于 2013-02-11T11:13:41.467 に答える
0

「なぜ暗黙的に 32 ビットに昇格するのか」という部分に答えてみてください。とにかく、CPU はレジスタ内の 32 ビットまたは 64 ビットの整数で動作します。これは、ハードウェアが暗黙的な昇格を行うことを意味します。この言語は、ハードウェアを抽象化しすぎないようにしています。

そうは言っても、それは迷惑かもしれません。

于 2013-02-11T11:21:28.697 に答える