.NET中struct和class之间有什么区别?
我正在通过C#由Jeffery Richter阅读CLR,它说结构是一种值类型,不能继承.
有任何技术或哲学原因吗?
我现在已经读过几个地方,结构的最大实例大小应该是16个字节.
但是我看不出这个数字(16)来自哪里.
浏览网络,我发现一些人认为这是一个近似的数字表现良好,但微软说这是一个很难的上限.(例如MSDN)
有没有人有一个明确的答案为什么它是16字节?
从C#结构继承是不可能的.这对我来说并不明白为什么会这样:
我想知道这是否是CLR中的技术限制,还是C#编译器阻止你做的事情?
编辑:值类型不能有虚拟方法,我意识到这个限制排除了大多数你想要使用继承的场景.但是,这仍然会留下继承 - 聚合.想象一个Shape
带有Colour
字段的结构:我可以编写接受任何结构派生的代码Shape
,并访问其Colour
字段,即使我永远不能编写虚Shape.Draw
方法.
我可以想到一个会被非密封值类型破坏的场景.值类型都应该落实Equals
和GetHashCode
正确; 即使这两个方法System.Object
都是虚拟的,它们也会在值类型上被非虚拟地称为.即使值类型没有被密封,编写从另一个派生的结构的人也无法编写自己的这两种方法的实现,并期望正确调用它们.
我应该指出,我并不是说我应该能够从我自己的代码中继承结构.但是,我想要做的是猜测为什么.NET禁止这种特殊代码气味.
编辑2:我刚刚发现了这个非常相似的问题,其答案实际上是"因为那时价值类型的数组不起作用".
结构可以从c#中的类派生吗?
如果没有,为什么原始数据类型(如int)可以从类中派生出来object
?由于数据类型int基本上是结构类型(值类型).
这仅仅是规则的例外吗?
我有一个问题,抓住结构的概念,没有人能回答我的问题.我知道它"像"一个对象,你可以有方法和领域.我不明白的是为什么他们被密封了.为什么缺乏继承和多态性限制了他们的能力.结构体是否真的有很多现实世界的使用,我知道它们比一个对象小,我找不到任何真正的例子来帮助我理解它的好处.谢谢.
假设我有两个KeyValuePair变量.
KeyValuePair<string, double> kv1 = new KeyValuePair<string, double>("a", 5);
KeyValuePair<string, double> kv2 = new KeyValuePair<string, double>("b", 7);
Run Code Online (Sandbox Code Playgroud)
"KeyValuePair"结构中没有+ operation的定义.
所以我想使用运算符重载!
我的目标是获得第三个KeyValuePair类型变量,如:
KeyValuePair<string, double> kv1 = new KeyValuePair<string, double>(kv1.Key + " + " + kv2.Key, kv1.Value + kv2.Value);
Run Code Online (Sandbox Code Playgroud)
结果将是:
KeyValuePair<string, double>("a + b", 12)
Run Code Online (Sandbox Code Playgroud)
但是告诉我如何使用"运营商"来做到这一点?
我试图这样做:
public partial class Form1 : Form
{
public Form1()
{
KeyValuePair<string, double> kv1 = new KeyValuePair<string, double>("a", 5);
KeyValuePair<string, double> kv2 = new KeyValuePair<string, double>("b", 7);
KeyValuePair<string, double> k = kv1 + kv2;
}
public …
Run Code Online (Sandbox Code Playgroud)