【发布时间】:2013-02-04 07:31:46
【问题描述】:
好的,这比实际要求更多的是好奇心。
假设我有这个课程:
public sealed class Entity
{
int value;
Entity()
{
}
public static implicit operator Entity(int x)
{
return new Entity { value = x };
}
}
我不希望这个类在类之外被实例化,这很有效。但是这里Entitys 将被引用而不是像值类型一样被复制。这个类太小了,我希望它表现得像值类型。另外,如果我比较Entitys 的两个实例,例如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
基本上接近枚举的行为。我当然可以没有它,只是学习。
【问题讨论】:
-
您的意思是没有覆盖类上的“Equals”方法或“==”运算符来执行所需的比较?
-
@DavidW 是的,这是可能的。但它仍然不会为类提供值类型语义,或者换句话说,我的要求 1。
标签: c# reference struct value-type default-constructor