好吧,這是比實際需求更好奇。有沒有一種方法可以防止結構被檢測或我可以有一個類將被複制?
比方說,我有這個類:
public sealed class Entity
{
int value;
Entity()
{
}
public static implicit operator Entity(int x)
{
return new Entity { value = x };
}
}
我不希望這個類給類以外的實例化,這工作做。但是這裏的Entity
將被引用,而不是像值類型那樣被複制。這個類很小,我希望它表現得像值類型。另外,如果我比較Entity
的兩個實例,如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
基本上接近枚舉的行爲。我當然可以沒有它,只是學習。
你的意思是短重寫「等於」方法或類上的「==」操作符來執行,只要你想的比較? – 2013-02-19 15:02:32
@DavidW是的,這是可能的。但它仍然不會給類的價值類型語義,或換句話說我的要求1. – nawfal 2013-02-19 15:09:37