C#中的值类型类定义?

是否可以创建一个不是结构但是值类型的类,或者类似于值类型,因为它在传递时复制而不是通过引用传递。

编辑:

很抱歉在被问到后需要编辑的问题。

另外,请参阅此问题以获取更多信息。 在不存在的结构布局中循环

编辑2

现在看来,你正在寻找使用class关键字声明一个真值类型,根据定义,这是不可能的。


因为您正在寻找创建一个类似于System.String的语义的类,所以您应该反编译System.String。 它的很多魔力隐藏在CLR中,但你会看到的大部分内容都会有所帮助。

对于初学者,你肯定需要重载==!= ,并重写Equals()GetHashCode() 。 您几乎肯定也想要实现IComparableIEquatable

字符串的另一个重要方面是它们是不可变的 。 这是它们类似值的行为的重要部分,因为它保证两个相等的字符串始终相等。 如果字符串是可变的,则可以修改其中一个字符串以使其与另一个字符串不相等。

我还应该指出,虽然字符串具有使其看起来像值类型的语义,但它当然是引用类型 ,并且引用语义的某些方面是不可避免的。

如果您再发布一些关于为什么要这样做的内容,我们可以提供更具体的建议。

编辑

为了回应您的编辑,您似乎对字符串有误解。 虽然它们在某些方面的行为类似于值类型, 但它们不会在每次传递给方法时通过复制数据直接传递。 实现这一目标的唯一方法是声明一个struct 。 与所有类一样,字符串是只能通过引用访问的引用类型; 你只能直接操纵参考; 您只能将引用传递给方法。

几乎可以设计一个模仿不可变值语义的类。 System.String属于该类别。 给定一个类的实例,使一个实例与第一个实例相似但在某种程度上不同的唯一方法是根据原始实例构造一个新实例。 为了实现“几乎不可变的值语义”,类应该以这样的方式覆盖Object.Equals()Object.GetHashCode() ,使得包含相同数据的两个实例将相互比较并产生相同的哈希码。

对于模仿可变值语义的类,必须有一种方法来指定复制该类类型的字段也应该复制由此引用的对象(如果该进程需要从该对象复制任何类似声明的字段,这些字段引用的对象也必须被复制,等等。)有可能在CLR中添加对此的支持,但目前还没有这样的function。

 public struct Example { public int Property {get;set;} } 

或者,当你问一个例子时,你有什么想法?

尽管ValueType是值类型的隐式基类,但您无法创建直接从ValueTypeinheritance的类。 相反,单个编译器提供语言关键字或构造(例如C#中的struct和Visual Basic中的Structure … End Structure)以支持值类型的创建。

来源: http : //msdn.microsoft.com/en-us/library/system.valuetype.aspx