在类中正确使用自定义变量类型(struct)

时间:2016-08-04 21:42:15

标签: c# struct

我正在努力思考我正在尝试实施的新课程,并且有一个我不确定是好还是坏的想法。我想创建一个包含设备设置的类(例如英寸与公制)以及与设置对应的代码。我认为拥有如下代码会很好:

Device myDevice = new Device();
myDevice.units = Device.Inches;
myDevice.MoveTo(1,2,3, Device.Rapid);

,Device类文件为:

class Device
{
    public static DeviceUnit Inches = DeviceUnit("G21");
    public static DeviceUnit Metric = DeviceUnit("G20");

    public static DeviceMovement Rapid = DeviceMovement("G00");
    public static DeviceMovement Feed = DeviceMovement("G01");

    public DeviceUnit units;
    public Device()
    {
        // Default to metric system
        units = Device.Metric;
    }
    public Device(DeviceUnit customUnit)
    {
        units = customUnit;
    }

    public MoveTo(float x, float y, float z, DeviceMovement movement)
    {
        string command = string.Format($"{units.gcode} {movement.gcode} ");
        command += string.Format($"X{x} Y{y} Z{z}\r\n");
        Debug.Write(command);
    }
}

设备单元结构:

public struct DeviceUnit
{
    public string gcode;
    public DeviceUnit(string code)
    {
        gcode = code;
    }
}

DeviceMovement struct:

public struct DeviceMovement 
{
    public string gcode;
    public DeviceUnit(string code)
    {
        gcode = code;
    }
}

我担心的是,我可能最终对我使用的结构数量“过度杀伤”。我已经在想我应该制作另一个存储增量(G90)和绝对(G91)定位。我想使其灵活,以便将来我可以从XML配置文件加载gcode字符串,以便我可以快速为新机器配置创建新的XML文件。

对于这项任务,使用多个结构是否过于苛刻? 我应该以某种方式将结构组合在一起吗?

1 个答案:

答案 0 :(得分:1)

如果 struct 具有表示复杂对象的多个属性,则 struct 具有意义。

我发现你的struct DeviceUnit,DeviceMovement只是string类型的一个属性,为什么要结构?

让DeviceUnit,DeviceMovement字符串属性。但等等:)

Q: Is using multiple structs too overkill for this task?

答:不,如果用于描述具有许多属性的对象(可能是复杂的设备属性),则Struct不会过度。

示例:

  public struct Dimension
 {
   //avoid using constructor. You can initialize with object initializer
  public int x;
  public int y;
  public int z;  
}

例如:Windows的所有设备都存储在WMI类中,如Win32_Printer WMI,它具有40多个属性,并且大多数属性都是复杂对象。

q: Should I combine the structs together somehow?

答:只需定义一个名为Device的类,它具有属性和方法。 如果其中一个属性是复杂对象,则它应该是struct或class类型。 您为设备构建对象模型,因此请仔细选择属性的类型。 但是在你的代码中,你根本不需要结构,使用简单的属性,如:

 public static string Inches {get;set;} = "G21"; // in c#6 you can initialize properties

我的问题:为什么静态属性?

我的问题:为什么用默认值初始化属性。

答:您可以为每个设备创建xml文件并在对象实例化期间加载它,这样可以提供更多功能:

使用一个类(或更专业的类)来表示您的设备 您可以将以下方法添加到设备类中:

 public LoadDevice(string xmlFilename)
  {
     // read xml file , e.g Linq to xml 
     // set properties
  }

Here your ceiling is the sky :)
顺便说一下,如果struct有构造函数,你应该使用new关键字。所以它应该:

public static DeviceUnit Inches = new  DeviceUnit("G21");  //:)