因为结构是值类型,所以当作为参数传递到方法中时,它们的数据是复制的。示例:
int someInt = 7;
DoSomeMethod(someInt); // <-- This is passing the "value" 7.到目前为止,很容易理解,你可能在想我的问题是如何成立的.因此,请考虑以下几点:
public struct TimmysStructOfGoodness
{
public int SomeInt1;
public int SomeInt2;
public int SomeInt3;
// ... later that day ...
public int SomeInt999;
}然后,引用以下代码:
TimmysStructOfGoodness someStructOfGoodness = new blah blah blah...
DoSomeMethod(someStructOfGoodness); // <-- **HERE IS WHERE THE QUESTION APPLIES!**上面的语句是否试图分配几个内存来“复制”我的值类型(struct)?
如果答案是肯定的,那么“更快”和“更慢”之间的界线是什么时候/在哪里?
如果没有-那为什么不呢?因为我所知道的价值类型,这应该是个问题。
主要免责声明:我知道这与为什么要使用struct诗句类无关,而且我知道我永远不会用999字段创建一个结构--这只是一个内在和勇气之类的问题:)
发布于 2009-12-28 16:45:50
结构和类不仅有不同的性能,它们的行为也不同。您应该使用最适合您正在实现的类型的类型。关于何时使用其中一种或另一种的指南是在MSDN上有清晰的描述。仅在下列所有内容都适用时才使用结构:
如果要将结构传递给函数,则会得到该结构的副本。如果您的结构很大,那么它将导致复制大量数据。引用通常被实现为4个字节(在x86上),因此传递一个对象只需要复制这4个字节。
还请注意,上述指南要求结构是小的。
发布于 2009-12-28 16:51:39
结构的性能含义取决于您如何使用这些结构.。
不可能对结构比引用类型更快还是更慢做出明确的声明。这一切都取决于你如何使用它们,以及在什么环境下。
结构(值类型通常)可能最终分配到堆栈或堆上-取决于它们的声明上下文。如果您在方法的主体中声明它(并且不要显式地将它装箱),那么结构将在堆栈上结束。如果然后将该结构传递给一个按值接受该结构的方法(如您的示例中所示),那么它确实会被复制--但是在堆栈上。堆栈上的分配是一个非常有效的进程(BTW,.NET堆也非常有效)--但它是一个复制进程。
当然,您可以使用ref/out传递结构--在这种情况下不会发生复制--对struct的引用将传递给方法。这可能是可取的,也可能不是理想的,因为它将允许被调用的方法更改结构的内容。
声明为类成员的结构实际上将在堆上分配(作为类的内存布局的一部分)。如果您传递该类,结构将不会被复制,但仍然可以通过类引用访问。
还可以通过显式装箱将结构放到堆上:
object x = new MyStruct( ... ); // boxed on the heap乔恩斯基特有一个很好的关于事情在记忆中的结局的文章,你应该读。
发布于 2009-12-28 16:53:15
为了增加混乱,请记住,如果不需要传递给其他方法的副本,则可以通过引用传递结构以避免复制.
https://stackoverflow.com/questions/1970308
复制相似问题