わかりました、これは実際の要件よりも好奇心です。
私がこのクラスを持っているとしましょう:
public sealed class Entity
{
int value;
Entity()
{
}
public static implicit operator Entity(int x)
{
return new Entity { value = x };
}
}
このクラスがクラスの外でインスタンス化されることを望まないので、これは機能します。ただし、ここではEntity
sが参照され、値型のようにコピーされません。このクラスは非常に小さいので、値型のように動作させたいと思います。Entity
また、 sの2つのインスタンスを比較するe1 == e2
と、参照が等しくなります(オーバーロードすることはできます==
が、それはより多くの作業です)。だから私はそれを構造体にします:
public struct Entity
{
int value;
public static implicit operator Entity(int x)
{
return new Entity { value = x };
}
}
しかし今、誰かがnew Entity()
簡単にできるようになりました。
私の質問は、タイプ(構造体/クラス)を持つことができる方法があります
1)値にアクセスするたびにコピーされるため、
Entity e1 = 1;
Entity e2 = e1;
ReferenceEquals(e1, e2); // prints false, just like any value type
2)同等性を比較するときに値のセマンティクスがあります
Entity e1 = 1;
Entity e2 = 1;
e1.Equals(e2); // prints true
// this is easy though by overriding default equality.
3)次のタイプの範囲外ではインスタンス化できません。
Entity e = new Entity(); // should not compile
基本的に列挙型の動作に近いです。私は確かにそれなしで生きることができます、ただ学ぶだけです。