在类中正确使用自定义变量类型(结构)
本文关键字:类型 变量 结构 自定义 | 更新日期: 2023-09-27 18:00:12
我正在尝试实现一个新类,但我有一个不确定是好是坏的想法。我想创建一个类来保存设备设置(例如,英寸与公制)以及与设置相对应的代码。我认为有这样的代码会很好:
Device myDevice = new Device();
myDevice.units = Device.Inches;
myDevice.MoveTo(1,2,3, Device.Rapid);
设备类文件为:
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结构:
public struct DeviceMovement
{
public string gcode;
public DeviceUnit(string code)
{
gcode = code;
}
}
我担心的是,我最终可能会对我使用的结构数量"大材小用"。我已经在想我应该做另一个来存储增量(G90)与绝对(G91)定位。我想让它变得灵活,这样将来我就可以从XML配置文件中加载gcode
字符串,这样我就可以为新的机器配置快速创建新的XML文件。
对于这个任务来说,使用多个结构是不是太过分了
我应该以某种方式将结构组合在一起吗?
如果结构具有表示复杂对象的多个属性,那么它就有意义。
我发现你的结构体DeviceUnit和DeviceMovement只是字符串类型的一个属性,为什么是结构体?
let DeviceUnit,DeviceMovement字符串属性。但是等待:)
Q: Is using multiple structs too overkill for this task?
A: 不,如果Struct用于描述一个具有许多属性的对象(可能是复杂的设备属性),那么它就不算过分了。
示例:
public struct Dimension
{
//avoid using constructor. You can initialize with object initializer
public int x;
public int y;
public int z;
}
例如:窗口的所有设备都存储在WMI类中,如Win32_Printer WMI,它有40多个属性,并且大多数属性都是一个复杂的对象。
q: Should I combine the structs together somehow?
A: 只需定义一个名为Device的类,该类具有属性和方法。如果其中一个属性是复杂对象,则其类型应为struct或class。您为设备构建对象模型,因此请仔细选择属性的类型。但是在你的代码中,实际上你根本不需要结构,使用简单的属性,比如:
public static string Inches {get;set;} = "G21"; // in c#6 you can initialize properties
我的问题:为什么是静态属性?
我的问题:为什么用默认值初始化属性。
A: 您可以为每个设备创建xml文件,并在对象实例化期间加载它,这为您提供了更多功能:
使用一个类(或多个专用类)来表示您的设备您可以将以下方法添加到设备类中:
public LoadDevice(string xmlFilename)
{
// read xml file , e.g Linq to xml
// set properties
}
Here your ceiling is the sky :)
顺便说一句,如果结构有构造函数,则应该使用new关键字。所以它应该:
public static DeviceUnit Inches = new DeviceUnit("G21"); //:)