什么时候结构太大了?

可能重复:
C#中的结构Vs类

很抱歉,如果这是一个开放式问题,但我只是想知道我的结构是否太大了。 我想要使​​用结构的原因是因为我已经知道它们比类更快,我认为我真的需要速度。

我发现如果你的结构太大,它实际上会减慢你的程序,所以我想知道这个的指导方针以及我的结构是否需要转换为类。

public struct Tiles { public Rectangle rect; //i know this wont run with them being initalized like this but if i change to a class this will //stay like this and im in the middle of deciding what to do Bitmap currentPic = new Bitmap(50, 50); ImageAttributes imgAttr = new ImageAttributes(); float[][] ptsArray; ColorMatrix clrMatrix; public void setTiles(int i, int k, int width, int height) { Rectangle temp = new Rectangle(i, k, width, height); rect = temp; float[][] ptsTemp ={ new float[] {1, 0, 0, 0, 0}, new float[] {0, 1, 0, 0, 0}, new float[] {0, 0, 1, 0, 0}, new float[] {0, 0, 0, .9f, 0}, new float[] {0, 0, 0, 0, 1}}; ptsArray = ptsTemp; clrMatrix = new ColorMatrix(ptsArray); currentPic = The_Great_Find__Dig_Deeper.Properties.Resources.darknessflashlight; } public void setTransperancy(float value) { clrMatrix.Matrix33 = value; } public void drawRect(Graphics g) { imgAttr.SetColorMatrix(clrMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap); g.DrawImage(currentPic, rect, 0, 0, currentPic.Width, currentPic.Height, GraphicsUnit.Pixel, imgAttr); } bool blackened { get; set; } } 

我应该把它换成课吗? 它对我来说有点臃肿。 我正在使用Visual Studio 2008。

给非黑带程序员的建议:不要优化你的代码。

对黑带程序员的建议:稍后优化您的代码。

认真地建议你留意这个建议!

为了给你一些更相关的解释,你应该知道,与类不同,结构是在堆栈上分配的,而不是在堆上。 堆栈分配稍微便宜一些,但通常只适用于短期或通过值传递或将存储在大型数组中的小型对象。

如果您不知道通过值传递的内容,则意味着只要将整个结构作为参数传递给方法,就会复制整个结构。 如果您的结构不是很小,这很快就会变得非常昂贵。 如果您不理解这种区别,它还可能导致意外行为:对方法中的参数所做的更改对方法调用者是可见的; 对方法中的struct参数所做的更改对方法调用者可见(因为该方法正在更改原始数据的副本)。

重申我的第一点:除非你确定你知道你在做什么,否则不要使用结构。

希望这可以帮助!

大小不是在类上选择结构的原因。 如果您想要值语义,请仅使用struct ONLY。 想想一个int; 5是5是5,参考无所谓。 结构总是通过复制传递。

在需要值语义时使用结构。 否则,请使用课程。

抢先优化是万恶之源。 或者说谚语。 构建您的应用程序,只有在遇到性能问题时才尝试修复它们。 例如,一个方法的运行速度可能是另一个方法的两倍,但您可以将第一个方法并行化并一次运行4个方法。 因此第一种方法实际上更快。 在修复之前,您必须完全了解性能问题。

回答你的问题:从我记得的一个大小为16字节或更大的结构比传递给方法时的类慢。

你能说出“速度”吗?

如果程序使用类在10秒内运行,并且相同的程序使用结构需要9.4秒,它会加速程序还是可以想象的速度?

您还必须记住,与引用类型相比,struct的复制时间会更长。

您可以准确地确定结构或类是否符合您的目的。

使用Struct if

  1. 对象很小。
  2. 逻辑上不可变。

如果我是你,我宁愿使用分析器来确切知道程序运行速度的确切位置。

据我所知,你无法使用struct而不是class来实现可想象的改进。