什么时候结构太大了?

时间:2011-05-03 00:07:26

标签: c# class struct

  

可能重复:
  Structure Vs Class in C#

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

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

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。

4 个答案:

答案 0 :(得分:7)

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

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

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

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

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

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

希望这有帮助!

答案 1 :(得分:4)

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

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

你能否定义“速度”?

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

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

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

使用Struct if

  1. 对象很小。
  2. 逻辑上不可变。
  3. 如果我是你,我宁愿使用分析器来准确知道程序运行速度的确切位置。

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