相关疑难解决方法(0)

何时使用struct?

什么时候应该在C#中使用struct而不是class?我的概念模型是当项只是值类型的集合时使用结构.一种逻辑上将它们组合在一起形成一个有凝聚力的整体的方法.

我在这里遇到了这些规则:

  • 结构应该表示单个值.
  • 结构应具有小于16个字节的内存占用.
  • 创建后不应更改结构.

这些规则有效吗?结构在语义上意味着什么?

c# struct

1347
推荐指数
23
解决办法
26万
查看次数

C++中struct和class之间有什么区别?

这个问题已在C#/ .Net的背景下提出.

现在我想学习C++中结构和类之间的区别.请讨论技术差异以及在OO设计中选择其中一个的原因.

我将从一个明显的区别开始:

  • 如果您没有指定public:or private:,则结构的成员默认是公共的; 默认情况下,类的成员是私有的.

我确信在C++规范的模糊角落中还有其他差异.

c++ oop struct class c++-faq

427
推荐指数
11
解决办法
34万
查看次数

我什么时候应该使用结构而不是类?

MSDN说你应该在需要轻量级对象时使用结构.当结构比类更可取时,还有其他任何情况吗?

有些人可能忘记了:

  1. 结构可以有方法.
  2. 结构不能被继承.

我理解结构和类之间的技术差异,我只是对使用结构没有很好的感觉.

.net oop

295
推荐指数
9
解决办法
7万
查看次数

为什么我不能在.NET中为结构定义默认构造函数?

在.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回答道:

要使用您的示例,当有人执行时您希望发生什么:

 Rational[] fractions = new Rational[1000];
Run Code Online (Sandbox Code Playgroud)

它应该通过你的构造函数1000次?

当然应该,这就是我首先编写默认构造函数的原因.当没有定义显式默认构造函数时,CLR应该使用默认的归零构造函数; 这样你只需支付你使用的费用.然后,如果我想要一个1000个非默认Rational的容器(并希望优化1000个结构),我将使用一个 …

.net c# struct

242
推荐指数
6
解决办法
10万
查看次数

为什么结构不支持继承?

我知道.NET中的结构不支持继承,但不清楚为什么它们以这种方式受限.

什么技术原因阻止结构继承其他结构?

.net inheritance struct

120
推荐指数
6
解决办法
3万
查看次数

.NET中的所有内容都是对象吗?

请帮助我们解决"几乎"的争议一切都是一个对象(Stack Overflow问题的答案作为一个新手,在学习C#之前有什么我应该注意的吗?).我认为就是这种情况,因为Visual Studio中的所有内容至少都显示为结构体.请张贴参考文献,以免它变成"现代傻瓜"(This American Life).

请注意,这个问题涉及C#,不一定是.NET,以及它如何处理引擎盖下的数据(显然它都是1和0).

以下是"一切都是对象"的评论:

  • 呃,不,不是. - Binary Worrier
  • 我想要一个例子...... - scotty2012
  • 是不是从基类型Object派生的一切? - rizzle
  • 大多数东西都是物品... - Omar Kooheji
  • 值类型,整数,双精度,对象引用(不是它们自己的对象)等不是对象.它们可以"盒装"看起来像对象(egiToString())但实际上它们是原始类型.将条目更改为"NEVERLY everthing is a object",我将删除downvote - Binary Worrier
  • 我很欣赏澄清.我认为你可以在C#中与int进行交互的最低级别是一个结构,它不是一个对象?- http://msdn.microsoft.com/en-us/library/ms173109.aspx - rizzle
  • Int32不继承自继承自Object的ValueType吗?如果是这样,尽管有这种行为,int也是一个对象. - 克里斯农夫
  • 不,int的boxed类型继承自ValueType,它继承自Object.它们不是传统意义上的对象,因为a)int不是对int的引用,IT是int.b)int不是垃圾收集.如果你声明一个Int32,那么这个int是堆栈上的4个字节,故事结尾 - Binary Worrier

对象的定义:"对象"作为类System.Object的继承者与"对象"作为类型与"对象"作为引用类型的实例."

c# object

48
推荐指数
7
解决办法
2万
查看次数

为什么结构不能有析构函数?

你认为这个问题的面试最佳答案是什么?

我想我在这里找不到这个副本,如果有的话请链接.

.net c# struct destructor finalizer

23
推荐指数
2
解决办法
1万
查看次数

C#为什么需要struct,如果类可以覆盖它?

只是想知道为什么我们需要struct如果类可以做所有结构可以和更多?我认为,在类中放置值类型没有副作用.

编辑:看不到使用struct的任何强有力的理由

结构类似于类,具有以下主要区别:

  • 结构是值类型,而类是引用类型.
  • 结构不支持继承(除了隐式派生自对象).
  • 结构可以包含类可以包含的所有成员,但以下内容除外:
  • 无参数构造函数
  • 终结者
  • 虚拟会员

当需要值类型语义时,使用结构而不是类.结构的好例子是数字类型,其中赋值复制值而不是引用更自然.因为struct是值类型,所以每个实例都不需要实例化堆上的对象.在创建类型的许多实例时,这很重要.

c# struct

16
推荐指数
2
解决办法
5348
查看次数

引用类型存在于堆上,值类型存在于堆栈中

在阅读"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)

只想澄清我的假设是否正确.谢谢.编辑:我应该使用差异变量,我认为它造成了混乱.所以我修改了代码.

编辑:是的,正如乔恩所说 - 这是一个神话,我应该提到这一点.我道歉.

c#

14
推荐指数
2
解决办法
9599
查看次数

为什么结构比这个特定情况下的类快得多?

我有三种情况来测试类的相对性能,具有继承性和结构的类.这些将用于紧密循环,因此性能很重要.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# performance jit numerical-methods

12
推荐指数
1
解决办法
410
查看次数