C# 场相关性质

C# 场相关性质,c#,properties,visual-studio-2015,null,C#,Properties,Visual Studio 2015,Null,我正在为设备SDK编写一个包装类,以使大型项目更容易处理它(例如,在getParameter(string parameter)中不要键入字符串,并简化为我们的目的而调用的方法)。设备有一些属性,我可以获取和设置,但是只有在设备已连接的情况下才可以(因此属性取决于设备字段是否为空且未连接),我无法理解如何处理它。我读到在getter中抛出异常可能是个坏主意。我可以使该属性为空,但我怀疑问题出在设计中 class MyClass { private Device device; //SDK

我正在为设备SDK编写一个包装类,以使大型项目更容易处理它(例如,在
getParameter(string parameter)
中不要键入字符串,并简化为我们的目的而调用的方法)。设备有一些属性,我可以获取和设置,但是只有在设备已连接的情况下才可以(因此属性取决于
设备
字段是否为空且未连接),我无法理解如何处理它。我读到在getter中抛出异常可能是个坏主意。我可以使该属性为空,但我怀疑问题出在设计中

class MyClass
{
    private Device device; //SDK device

    public string Name
    {
        get //set is pretty much the same
        {
            if (!device.IsConnected)
                //return null and have nullable property? throw NotConnectedException?
            return device.getParameter("Name");
        }
    }
}

我可以将属性转换为方法,并抛出异常,但我的导师更喜欢将它们作为属性。有人能给我指出正确的方向吗?

我会提取连接到另一个类的逻辑,这样以后您就可以很容易地更改它,这样您就不会在(!device.IsConnected)…
检查时重复编写许多

例如,如果您现在只能使用已连接且具有
ErrorStatus
=0的设备,该怎么办。你会改变每一处房产的每一个条件吗

我会这样写:

class DeviceWrapperFactory
{
    public static DeviceWrapper Connect(Device device)
    {
        if (!_device.IsConnected)
        {
            // assume trying to reconnect here if possible
            // like "if (!device.TryToConnect())"
            throw new DeviceConnectionFailedException();
        }

        return new DeviceWrapper(_device);
    }
}

class DeviceWrapper
{
    private Device device;

    DeviceWrapper(Device device)
    {
        _device = device;
    }

    public string Name
    {
        get
        {
            return device.getParameter("Name");
        }
    }
}
这样,您将能够:

try
{
    Console.WriteLine(DeviceWrapperFactory.Connect(usbDevice).Name);
    // or
    var usbDeviceWrapper = DeviceWrapperFactory.Connect(usbDevice);
    Console.WriteLine(usbDeviceWrapper.Name);
    Console.WriteLine(usbDeviceWrapper.AnotherProperty);
}
catch (DeviceConnectionFailedException dcfe)
{
    // ...
}
您可能还希望创建设备对象池,而不是factory或其他任何您想要的。这个例子正好说明了这个想法

它还取决于您的体系结构和
设备
类的默认行为。如果它始终处于连接状态,除非出现异常技术问题,否则应使用异常。如果您的设备可以连接或不连接,并且机会均等,那么您需要使用布尔值或空值


一般来说,几乎不可能说哪种体系结构或方法更好。我们需要学习整个系统来做出这样的决定。您需要尝试。

不确定您真正想要的是什么,但您可以先将所有依赖于设备的处理放在一个类中,然后围绕这个类进行异常处理,之后您可以使getter和setter独立于设备-谁知道您可能需要在将来动态更改设备字符串默认为空。如果您只使用字符串进行操作,请不要急于返回null。恐怕还有一些属性是int、double和enum,但是对于字符串属性的建议很好,谢谢@serup你的意思是说也要包装设备,让我的包装器有一个devicewrap的实例吗?精彩的解释和示例。我将尝试以类似的方式实现它。谢谢