コード内の文字列"hello"
は、すべての場合において、コンストラクターの呼び出しを伴いません。"hello"
文字列のすべてのインスタンスがすべて同じオブジェクトになるように、コンパイル時に作成される定数値です。同様に、integer1
と decimal 値3.456
、およびその他の「リテラル」値は、ランタイム前、つまりコンストラクター コードが呼び出される前に存在する定数です。
new string("hello");
文字列を値として受け取る文字列のコンストラクターがないため、コードを呼び出すことはできません。ただし、に変更するとnew string("hello".ToCharArray());
、文字列オブジェクトが得られますが、文字列と同じではありません"hello"
。実際には、単純な から別のメモリ位置に新しい文字列を作成しました"hello"
。と同じ文字値が含まれているのはたまたま"hello"
です。
重要なのは、暗黙的な型変換トリックを使用すると、型に変換された 1 つの文字列リテラルが同じオブジェクトにならないということです。
class Foo
{
private string value;
public Foo(string val)
{
this.value = val;
}
public static implicit operator Foo(string value)
{
return new Foo(value);
}
}
[TestClass]
public class UnitTest1
{
[TestMethod]
public void TestMethod1()
{
Foo a = "asdf";
Foo b = "asdf";
Assert.AreNotEqual(a, b);
}
}
つまり、a.Equals(b)
false を返します。Equals メソッドが true を返すようにするには、Foo クラスで Equals メソッドをオーバーライドする必要があります。
public override bool Equals(object obj)
{
return obj is Foo && value.Equals(((Foo)obj).value);
}
しかし、他のポスターで述べたように、これは難読化です。コードの使用とデバッグが困難になります。通常の割り当てのように見えるものを完全なメソッド呼び出しに変更します。また、F12 キーを押してメソッド定義にジャンプするなど、コードを検査するために Visual Studio が提供するツールの多くが機能しなくなります。
暗黙的な型変換は、2 つの型が実際に互換性があり、機能にわずかな違いがある場合にのみ使用する必要があります。vsには追加のメソッドや関数がなく、精度を からに上げても値は変わらないため、float
型は暗黙的に に変換できます。ただし、精度が失われると表現される値が変わるため、からへの変換には明示的なキャストが必要です。double
double
float
float
double
double
float