我正在阅读现有代码。我注意到有许多数据对象文件,它们有一个struct和一个类来定义一个数据对象。如下所示:你认为这是一种好的风格吗?
In ONE file:
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct LaneDataStruct
{
public ushort red;
public ushort yellow;
public ushort green;
public ushort blue;
public ushort orange;
}
public class LaneData
{
private LaneDataStruct laneDataStruct;
public LaneData(ushort red, ushort yellow, ushort green, ushort blue, ushort orange)
{
this.laneDataStruct.red = red;
this.laneDataStruct.yellow = yellow;
this.laneDataStruct.green = green;
this.laneDataStruct.blue = blue;
this.laneDataStruct.orange = orange;
}
public LaneData(ushort[] values)
{
this.laneDataStruct.red = values[0];
this.laneDataStruct.yellow = values[1];
this.laneDataStruct.green = values[2];
this.laneDataStruct.blue = values[3];
this.laneDataStruct.orange = values[4];
}
public LaneData(LaneDataStruct laneDataStruct)
{
this.laneDataStruct = laneDataStruct;
}
public LaneDataStruct getLaneDataStruct()
{
return this.laneDataStruct;
}
public string toString()
{
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.Append("LaneData.red=" + this.getLaneDataStruct().red + "\n");
stringBuilder.Append("LaneData.yellow=" + this.getLaneDataStruct().yellow + "\n");
stringBuilder.Append("LaneData.green=" + this.getLaneDataStruct().green + "\n");
stringBuilder.Append("LaneData.blue=" + this.getLaneDataStruct().blue + "\n");
stringBuilder.Append("LaneData.orange=" + this.getLaneDataStruct().orange);
return stringBuilder.ToString();
}
}
答案 0 :(得分:3)
事实上,它是一个带有公共字段的可变结构,这一点很糟糕。
我不能说我已经看过它,我不想真的。
答案 1 :(得分:0)
C#中的结构是POD类型 - 语义略有不同。 MSDN says this:
结构类型适合 表示轻量级对象 作为点,矩形和颜色。 虽然有可能代表一个 作为一个类,结构更多 在某些情况下有效率。
即使没有这种区别(C ++),最好使用单独的关键字来区分POD类型。
答案 2 :(得分:0)
我只会在异国情调的P / Invoke场景中称之为好习惯,即便如此,这也是值得怀疑的。
首先,结构设计很差,因为它是可变的。有关详细信息,请参阅this question。
该类似乎是为了解决这样一个事实,即在C#中,没有确定性的方法来初始化结构。您不能为结构提供默认构造函数,也不能导致调用非默认构造函数。所以看起来类包装结构并保证结构将初始化为某种状态。但是,它没有验证,所以我强烈怀疑它是否有任何价值。
如果LaneDataStruct
表示用于P / Invoke的结构(LayoutKind属性是一个提示,这可能是真的)并且不能具有某些值,那么这只会是“有用的”。最好给它执行验证的属性并使字段成为私有。通常情况下,P / Invoke代码是在一个单独的层中编写的,在这个层中可以认为它具有“确保在创建一个结构后初始化该结构”之类的瑕疵。
答案 3 :(得分:0)
我以这种方式使用Struct的唯一原因,特别是对于StructLayout属性,如果我正在对第三方或传统C DLL进行PInvoke,我必须通过这个结构进行编组,或者如果我是通过线路进行某种串行通信协议,我希望我的结构与我发送/接收的数据包完全匹配。