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

时间:2010-07-22 17:38:35

标签: c#

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

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

sq = new Square(rank, file);

或通过编写内部Set方法并调用Set so

sq.Set(rank, file);

我要问的是,当你在结构上使用new时,运行时是否会重新分配新内存并调用构造函数还是重用现有内存?如果它执行前者那么编写一个Set方法以避免开销会更好吗?欢呼声。

4 个答案:

答案 0 :(得分:3)

最近的传统思维是价值类型应该是不可变的,所以你不希望有一个Set方法,除非返回 new Square对象而不是改变原文。因此,

sq = new Square(rank, file);

并且

sq = sq.GenerateSquare(rank, file); // renamed Set method from original question to appease comments

最终应该执行相同的操作。

但是考虑到这种方法,GenerateSquare作为Square的静态方法也可能更好,而不是取决于任何给定的实例。 (如果在创建新实例时使用了关于现有实例的某些内容,则实例方法会更有用。)

答案 1 :(得分:2)

结构是值类型,因此一个简单的赋值将完成工作:

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

答案 2 :(得分:2)

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

答案 3 :(得分:-1)

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

注意:如果您创建一个新结构并将其分配给作为引用类型属性的变量,那么是,引用类型在堆上,但结构被复制到的内存槽是已存在的内存插槽用于已存在的引用类型,没有分配新的堆内存。并且结构独立地受垃圾收集....

但是其他人对你的设计的评论是正确的,结构通常只应该用于不可变的域对象,简单易于创建的东西(占用空间小)并且没有身份(即,一个电话号码对象设置为( 802)123-4567是等效的,可以在任何其他需要电话号码对象设置为(802)123-4567的地方使用

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