我已经阅读了很多关于使用结构作为数据类型的危险,我想知道这个问题是否有任何问题,
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是我想要更新的项目的位置。
到目前为止一切正常,所以将来可能有什么问题吗?这个结构是可变的吗?
感谢。
答案 0 :(得分:5)
到目前为止一切正常,所以将来可能有什么问题吗?这个结构是可变的吗?
是的,这是一个可变的结构。是的,它会起作用。
但是,我认为这个结构应该是一个类。有关原因的详细信息,请参阅Choosing Between Classes and Structures。在这种情况下,你违反了3个结构应该始终为真的情况:
这强烈建议课程更适合您的类型。它还可以简化您的代码。
顺便说一句 - 旁注,上面的代码中不需要强制转换。你应该可以写:
SumInfo = SummarizedList[CurrentPos];
答案 1 :(得分:3)
的问题:
基本上它是一个愚蠢的数据桶。有一个时间和地点,但在这种情况下,它应该总是成为一个类,我个人通常会尝试使它成为一个不可变的类型。
答案 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命名约定。