Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 此特定情况下的结构或类_C# - Fatal编程技术网

C# 此特定情况下的结构或类

C# 此特定情况下的结构或类,c#,C#,就目前我所掌握的所有知识而言,我无法决定在我的用例中使用哪个 下面是struct的示例 第一个类如下所示: class Owner { public A[] Kids; public Owner(int count) { Kids = new A [count]; // If I would use classes I would need to create new class for each item, right? // It would look

就目前我所掌握的所有知识而言,我无法决定在我的用例中使用哪个

下面是struct的示例

第一个类如下所示:

class Owner
{
  public A[] Kids;

  public Owner(int count)
  {
    Kids = new A [count];

    // If I would use classes I would need to create new class for each item, right?
    // It would look like below and my worries are memory impacts because of new A()
    // for(int i = 0; i < count; Kids[i++] = new A());
  }
}
class Node
{
  private Owner o;
  private int num;
  private A[] kids;

  public Node(Owner o, int num)
  {
   this.o = o;
   this.num = num;
  }

  public A[] Kids
  {
    get
    {
      this.kids = o.Kids[num].NextList;
      return this.kids;
    }
  }
}
A型看起来像这样

<struct or class> A
{
  public int Value;
  public A[] NextList;
}
A
{
公共价值观;
公开[]下一个列表;
}
现在的问题是,什么时候使用结构访问会比使用类时运行得更快吗

因为我需要初始化每个类,所以在使用类时会产生内存开销吗

在使用类时,我是否需要消除引用

在这种情况下,你会用哪种人


我道歉,如果这是一个重复或如果我做错了什么。请先告诉我我做错了什么,然后再把问题降级。我对这个论坛还是新手。

TL;DR:使用一个类。

由于您使用的是阵列,并且担心内存问题,因此有一件事需要记住:

如果您有一个结构数组,那么为该数组分配的总字节数将是
sizeof(您的结构)*元素数

如果您有一个类数组,那么为该数组分配的总字节数将是
sizeof(reference)*元素数
(其中引用的大小对于x86为32位,对于x64为64位)

在某些情况下,这可能会产生很大的不同

如果数组的总大小超过85000字节,那么它将被放置到大型对象堆中。否则,它将进入正常堆。这可能意味着使用struct将导致某些数组超过85000字节的阈值,而如果改用类,它们将无法达到该阈值

在垃圾收集(*)期间,大型对象堆上的项不会被压缩,因此如果有太多大型对象,可能会出现内存碎片问题

请注意,这也适用于许多其他集合(例如
List
),因为它们在实现中使用数组

在大多数情况下,使用类而不是结构的开销可以忽略不计,而且在任何情况下,如果您认为这会导致问题,您都应该插入代码以确保其正确性

因此,您通常应该只使用一个类

还有一件事需要注意:

如果有一个结构列表,则在不使用更新的元素替换整个元素的情况下,无法更改列表中各个元素的属性

所以这是不可能的:

List<MyStruct> list = new List<MyStruct>();
... init list
list[0].Value = 1; // Compile error for structs, no error for classes.
List List=新列表();
... 初始化双链表
列表[0]。值=1;//结构的编译错误,类的编译错误。
但这不应该是一个问题——因为您的结构总是不可变的,所以您不会首先尝试这样做,对吗?;)


(*)这已经不是严格意义上的事实了。NET4.51引入了一种允许下一次垃圾收集移动大型对象的方法,但这必须通过编程来实现


一个
A
是否曾经发生过变异,或者它是以不变的方式使用的?关于你关于参考资料的问题,你所需要做的就是“放开”它们,这样它们才有资格进行垃圾收集。我倾向于发现,即使在结构可能稍微好一点的情况下,类也是足够的。如今,我越来越没有理由为
struct
之类的东西操心了。我认为你高估了使用类的影响。我建议您选择一个最有意义的方法,只在出现性能问题时处理。正如Donald Knuth所说,“过早优化是万恶之源”。如果你真的那么关心优化这个,我会分析它。测试两个场景并测量时间。关于使用类或结构的优点有很多争论,几天前我因为建议使用结构而被否决,这样我就可以理解你的紧张情绪。我认为答案将是“视情况而定”,并取决于许多因素。我现在通常使用类,但我怀疑实际的差异可以忽略不计。默认值:如果不能决定类和结构,那么就使用类。@devhedgehog另一条经常表达的建议是使
struct
类型不可变。我也倾向于这样做。在这个实例中,坚持使用一个类。是的,在类、所需的引用空间和GC方面存在“开销”,但CLR针对这些任务进行了优化——这些是CLR的基本任务(它做得很好)。我没有结构列表,只有数组。正如您在我的示例中看到的,给定Node类包含子类。如果我把它做成一个结构,我就不在乎释放引用了,对吧?。如果我选择structs,对Node.Kids的访问会更快吗?@devhedgehog您也不关心类的“释放引用”。当您无法从任何地方访问某个对象时,该对象将自动符合垃圾收集条件。@downvoter:请解释错误所在;否则,下一票就毫无意义了。当我在节点中不需要所有者时,我需要将所有者设置为null。否则,节点将始终保持在那里,因为所有者是主类。不管我是否不再使用节点,它都会留在那里。据我所知。看看我的例子。我在节点中持有所有者的实例。当不再需要节点时,我应该释放实例,对吗?@devhedgehog是的,但我以为你说的是名为
A
的类型-这就是你想创建结构的类型,对吗<代码>所有者已经是类类型。