C# 重新分配结构最有效的方法是什么?

C# 重新分配结构最有效的方法是什么?,c#,C#,我的程序中有一个名为Square的结构类型,用于表示棋盘上正方形的位置(int Rank,int File) 如果我用新的Square sq()指定Square;然后我想重新分配它,这样做更好吗 sq = new Square(rank, file); 或者通过编写内部Set方法并调用Set sq.Set(rank, file); 我要问的是,当在结构上使用new时,运行时是重新分配新内存并调用构造函数,还是重用现有内存?如果是前者,那么最好编写一个Set方法来避免开销,不是吗?干杯。结构是

我的程序中有一个名为Square的结构类型,用于表示棋盘上正方形的位置(int Rank,int File)

如果我用新的Square sq()指定Square;然后我想重新分配它,这样做更好吗

sq = new Square(rank, file);
或者通过编写内部Set方法并调用Set

sq.Set(rank, file);

我要问的是,当在结构上使用new时,运行时是重新分配新内存并调用构造函数,还是重用现有内存?如果是前者,那么最好编写一个Set方法来避免开销,不是吗?干杯。

结构是值类型,因此一个简单的赋值就可以了:

Square sq = new Square(rank, file);
Square anotherSq = sq;

结构是值类型,因此简单的赋值即可:

Square sq = new Square(rank, file);
Square anotherSq = sq;

现在的传统想法是值类型应该是不可变的,因此您不希望使用
Set
方法,除非该方法返回一个新的
Square
对象,并且不改变原始对象。因此,

sq = new Square(rank, file);

最终应执行相同的操作


但是如果采用这种方法,
GenerateSquare
作为
Square
的静态方法也可能比依赖于任何给定实例的方法更好。(如果在创建新实例时使用了关于现有实例的某些信息,那么实例方法会更有用。)

现在的传统思想是,值类型应该是不变的,因此,您不希望使用
Set
方法,除非该方法返回一个新的
Square
对象,并且不改变原始对象。因此,

sq = new Square(rank, file);

最终应执行相同的操作


但是如果采用这种方法,
GenerateSquare
作为
Square
的静态方法也可能比依赖于任何给定实例的方法更好。(如果在创建新实例时使用了有关现有实例的内容,则实例方法会更有用。)

在分析应用程序并知道这将是一个问题之前,您不应该担心垃圾收集或内存使用的重量。像这样的简单结构不会占用太多空间,如果您的程序确实遇到瓶颈,也不可能成为问题的原因。

在分析应用程序并知道这将是一个问题之前,您不应该担心垃圾收集或内存使用的重量。像这样的简单结构不会占用太多空间,如果您的程序遇到瓶颈,也不可能成为问题的原因。

对于结构。。。新结构的空间是在堆栈上创建的(请参见注释),而不是堆,并且不受垃圾收集的约束。如果赋值变量是结构的现有副本,则它将被覆盖。没有使用额外的内存

注意:如果创建新结构并将其分配给引用类型属性的变量,则是,引用类型位于堆上,但结构复制到的内存插槽是该已存在引用类型的已存在内存插槽,不会分配新的堆内存。并且该结构不独立地接受垃圾收集

但其他人对您的设计的评论是正确的,结构通常只应用于不可变的域对象,这些对象简单且易于创建(占地面积小),并且没有标识(即,一个电话号码对象设置为(802)123-4567等同于并可用于需要将电话号码对象设置为(802)123-4567的任何其他位置


因此,一般来说,这些对象不应该有构造函数或属性设置器,它们应该有静态工厂方法来创建它们的实例。

对于结构,在堆栈上创建新结构的空间(请参见注释),而不是堆,并且不接受垃圾收集。如果赋值变量是结构的现有副本,则会覆盖它。不会使用额外内存

注意:如果创建新结构并将其分配给引用类型属性的变量,则是,引用类型位于堆上,但该结构复制到的内存插槽是该已存在引用类型的已存在内存插槽,不会分配新的堆内存。并且该结构不独立于o垃圾收集

但其他人对您的设计的评论是正确的,结构通常只应用于不可变的域对象,这些对象简单且易于创建(占地面积小),并且没有标识(即,一个电话号码对象设置为(802)123-4567等同于并可用于需要将电话号码对象设置为(802)123-4567的任何其他位置


因此,一般来说,这些对象不应该有构造函数或属性设置器,它们应该有创建实例的静态工厂方法。

-1.糟糕的编码实践。任何名为“Set”的函数都不应该返回任何内容。请使用“GenerateSquare”这样的名称相反。@Stargazer,这很好。请记住,我使用他的代码和问题作为基础。是的,如果你完全忽略设置,只建议构造函数方法,我会给你一分。@Anthony:是的,但你改变了他使用它的方式。如果你改变动作,就改变名称。@Stargazer,注意到。我也改变了-1.糟糕的编码实践。任何名为“Set”的函数都不应返回任何内容。请使用“GenerateSquare”之类的名称相反。@Stargazer,这很好。请记住,我使用他的代码和问题作为基础。是的,如果你完全忽略设置,只建议构造函数方法,我会给你一分。@Anthony:是的,但你改变了他使用它的方式。如果你改变动作,就改变名称。@Stargazer,注意到。我也改变了我同意你的意见