什么时候应该在C#中使用struct而不是class?我的概念模型是当项只是值类型的集合时使用结构.一种逻辑上将它们组合在一起形成一个有凝聚力的整体的方法.
我在这里遇到了这些规则:
这些规则有效吗?结构在语义上意味着什么?
这个问题已在C#/ .Net的背景下提出.
现在我想学习C++中结构和类之间的区别.请讨论技术差异以及在OO设计中选择其中一个的原因.
我将从一个明显的区别开始:
public:or private:,则结构的成员默认是公共的; 默认情况下,类的成员是私有的.我确信在C++规范的模糊角落中还有其他差异.
MSDN说你应该在需要轻量级对象时使用结构.当结构比类更可取时,还有其他任何情况吗?
有些人可能忘记了:
我理解结构和类之间的技术差异,我只是对使用结构时没有很好的感觉.
在.NET中,值类型(C#struct)不能包含没有参数的构造函数.根据这篇文章,这是CLI规范要求的.会发生什么,对于每个值类型,都会创建一个默认构造函数(由编译器?),它将所有成员初始化为零(或null).
为什么不允许定义这样的默认构造函数?
一个微不足道的用途是有理数:
public struct Rational {
private long numerator;
private long denominator;
public Rational(long num, long denom)
{ /* Todo: Find GCD etc. */ }
public Rational(long num)
{
numerator = num;
denominator = 1;
}
public Rational() // This is not allowed
{
numerator = 0;
denominator = 1;
}
}
Run Code Online (Sandbox Code Playgroud)
使用当前版本的C#,默认的Rational 0/0并不是那么酷.
PS:默认参数是否有助于解决C#4.0或者是否会调用CLR定义的默认构造函数?
Jon Skeet回答道:
要使用您的示例,当有人执行时您希望发生什么:
Run Code Online (Sandbox Code Playgroud)Rational[] fractions = new Rational[1000];它应该通过你的构造函数1000次?
当然应该,这就是我首先编写默认构造函数的原因.当没有定义显式默认构造函数时,CLR应该使用默认的归零构造函数; 这样你只需支付你使用的费用.然后,如果我想要一个1000个非默认Rational的容器(并希望优化1000个结构),我将使用一个 …
我知道.NET中的结构不支持继承,但不清楚为什么它们以这种方式受限.
什么技术原因阻止结构继承其他结构?
请帮助我们解决"几乎"的争议一切都是一个对象(Stack Overflow问题的答案作为一个新手,在学习C#之前有什么我应该注意的吗?).我认为就是这种情况,因为Visual Studio中的所有内容至少都显示为结构体.请张贴参考文献,以免它变成"现代傻瓜"(This American Life).
请注意,这个问题涉及C#,不一定是.NET,以及它如何处理引擎盖下的数据(显然它都是1和0).
以下是"一切都是对象"的评论:
对象的定义:"对象"作为类System.Object的继承者与"对象"作为类型与"对象"作为引用类型的实例."
你认为这个问题的面试最佳答案是什么?
我想我在这里找不到这个副本,如果有的话请链接.
只是想知道为什么我们需要struct如果类可以做所有结构可以和更多?我认为,在类中放置值类型没有副作用.
编辑:看不到使用struct的任何强有力的理由
结构类似于类,具有以下主要区别:
当需要值类型语义时,使用结构而不是类.结构的好例子是数字类型,其中赋值复制值而不是引用更自然.因为struct是值类型,所以每个实例都不需要实例化堆上的对象.在创建类型的许多实例时,这很重要.
在阅读"C#in Depth"时,我正在阅读"引用类型存活在堆上,值类型存在于堆栈中"部分.
现在我能理解的是(主要用于ref类型):
class Program
{
int a = 5; // stored in heap
public void Add(int x, int y) // x,y stored in stack
{
int c = x + y; // c stored in stack
}
}
Run Code Online (Sandbox Code Playgroud)
只想澄清我的假设是否正确.谢谢.编辑:我应该使用差异变量,我认为它造成了混乱.所以我修改了代码.
编辑:是的,正如乔恩所说 - 这是一个神话,我应该提到这一点.我道歉.
我有三种情况来测试类的相对性能,具有继承性和结构的类.这些将用于紧密循环,因此性能很重要.Dot产品被用作2D和3D几何中的许多算法的一部分,我在实际代码上运行了分析器.以下测试表明我见过的真实世界性能问题.
通过循环和点积的应用得到的结果为1亿次
ControlA 208 ms ( class with inheritence )
ControlB 201 ms ( class with no inheritence )
ControlC 85 ms ( struct )
Run Code Online (Sandbox Code Playgroud)
测试正在运行,没有打开调试和优化.我的问题是,在这种情况下,类是什么导致它们如此缓慢?
我假设JIT仍然可以内联所有的调用,类或结构,所以实际上结果应该是相同的.请注意,如果我禁用优化,那么我的结果是相同的.
ControlA 3239
ControlB 3228
ControlC 3213
Run Code Online (Sandbox Code Playgroud)
如果重新运行测试,它们总是在彼此相差20ms内.
using System;
using System.Diagnostics;
public class PointControlA
{
public double X
{
get;
set;
}
public double Y
{
get;
set;
}
public PointControlA(double x, double y)
{
X = x;
Y = y;
}
}
public class Point3ControlA : PointControlA
{
public double …Run Code Online (Sandbox Code Playgroud) c# ×7
struct ×6
.net ×4
oop ×2
c++ ×1
c++-faq ×1
class ×1
destructor ×1
finalizer ×1
inheritance ×1
jit ×1
object ×1
performance ×1