使用这个结构有什么问题吗?

时间:2011-08-30 18:24:20

标签: c# .net winforms

我已经阅读了很多关于使用结构作为数据类型的危险,我想知道这个问题是否有任何问题,

List<Summarized> SummarizedList = new List<Summarized>();
    Summarized SumInfo;
    struct Summarized
    {
        public string sBrand;
        public string sModel;
        public string sCustomer;
        public int sline;
        public string sLeader;            
        public int sDesire;
        public int sReal;               
    } 

正如您所看到的,我使用了一个通用的项目列表类型SumInfo,它是结构数据类型。每当我需要更新列表中的项目时,我只需执行以下操作:

SumInfo = (Summarized)SummarizedList[CurrentPos];
            SumInfo.sDesire = DesireProd;
            SumInfo.sReal = RealProduced;                
            SummarizedList[CurrentPos] = SumInfo;

其中CurrentPos是我想要更新的项目的位置。

到目前为止一切正常,所以将来可能有什么问题吗?这个结构是可变的吗?

感谢。

5 个答案:

答案 0 :(得分:5)

  

到目前为止一切正常,所以将来可能有什么问题吗?这个结构是可变的吗?

是的,这是一个可变的结构。是的,它会起作用。

但是,我认为这个结构应该是一个类。有关原因的详细信息,请参阅Choosing Between Classes and Structures。在这种情况下,你违反了3个结构应该始终为真的情况:

  • 它逻辑上表示单个值,类似于基本类型(整数,双精度等)。
  • 实例大小小于16个字节。
  • 这是不可改变的。

这强烈建议课程更适合您的类型。它还可以简化您的代码。


顺便说一句 - 旁注,上面的代码中不需要强制转换。你应该可以写:

SumInfo = SummarizedList[CurrentPos];

答案 1 :(得分:3)

的问题:

  • 这是一个可变的结构,它们几乎总是一个坏主意(寻找“可变的结构邪恶”,你会得到大量的命中)
  • 它有公共领域 - 因此没有封装;在其实现类型的API之间没有分离
  • 公众成员不遵循正常的.NET naming conventions
  • 根据.NET design guidelines
  • ,它在逻辑上不代表单个值
  • 它大于相同指南推荐的16个字节(虽然如果其他一切都没问题,我也不会非常注意

基本上它是一个愚蠢的数据桶。有一个时间和地点,但在这种情况下,它应该总是成为一个类,我个人通常会尝试使它成为一个不可变的类型。

答案 2 :(得分:1)

你有没有理由使用结构?如果你把它作为一个类,那么List只包含引用,你的代码看起来像:

SumInfo = SummarizedList[CurrentPos];
SumInfo.sDesire = DesireProd;
SumInfo.sReal = RealProduced;  
// you're done! no need to insert it back in, you're referring to the same item

答案 3 :(得分:1)

就个人而言,我没有反对使用这个结构。它可能更多地取决于您如何使用它,是否封装了List方法等。

它的可变性取决于您是否希望在将它们添加到列表后更新任何antries。如果你不期望,那么你的STRUCT是不可变的,但你的列表不是。但是在这种情况下,您正在更新条目,因此它是。

我同意一个类可能是更好的选择。

答案 4 :(得分:0)

问题1:

是的,结构是可变的。并且它遇到了与之相关的所有问题。

SummarizedList[CurrentPos].sDesire=DesireProd;

显示为什么使用像这样的可变结构是个坏主意,因为它不会改变列表中的结构。

问题2:

您有公共可变字段。这被认为是糟糕的风格,你应该使用属性。

问题3:

您正在使用(系统)匈牙利表示法。在C#中进行开发时,请遵循.net命名约定。