Class + Struct是一种很好的编码风格?

时间:2010-02-22 14:21:04

标签: c#

我正在阅读现有代码。我注意到有许多数据对象文件,它们有一个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();
    }
}

4 个答案:

答案 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,我必须通过这个结构进行编组,或者如果我是通过线路进行某种串行通信协议,我希望我的结构与我发送/接收的数据包完全匹配。