【问题标题】:C# Methods vs. Properties: Exceptions May OccurC# 方法与属性:可能会发生异常
【发布时间】:2011-10-21 22:04:37
【问题描述】:

我创建了一个库类CircuitController,它通过串行端口与控制电路通信。

public class CircuitController
{
   // Enumerations.
   public enum Sensors { Sensor1, Sensor2, ..., Sensor15 };
   ...

   // Fields.
   private SerialPort serialPort;  // Set in constructor.
   private Dictionary<Sensors, Sensor> activeSensorCollection;
   ...

   // Properties.
   public Dictionary<Sensors, Sensor> ActiveSensors
   { get { return this.activeSensorCollection; } }       

   // Methods.
   public void SetSensorUnits(Sensors sensor, String sensorUnits)
   {
      // Creates serial command based off parameters, sends, receives, processes.
   }
   ...

   // Constructors.
   public CircuitController(...)
   {
      ... // Set CircuitController fields including nested classes.
      Sensor sensor1 = new Sensor(a,b,c,d,this);  // Link sensor to this controller instance.
      ... // Add sensors to dictionary.
   }          

   // Nested Classes.
   public class Sensor
   {
      // Fields.
      private CircuitController controller;   
      private String units;
      private Sensors sensorNumber;
      ...

      // Properties.
      public String Units
      {
         get
         {
            return this.controller.GetSensorUnits(this.sensorNumber);
         }
         set
         {
            this.controller.SetSensorUnits(this.sensorNumber, value);
          }
      }
      ...
   }

所以这是我的问题:允许用户通过属性获取/设置传感器设置是否可以,即使可能引发异常(例如串行通信错误)?

String sensor2Units = circuitControllerInstance.ActiveSensors[Sensor2].Units'
circuitControllerInstance.ActiveSensors[Sensor1].Units = "mm";

我觉得这比……清楚得多

String sensor2Units = circuitControllerInstance.GetSensorUnits(Sensors.Sensor2);
circuitControllerInstance.SetSensorUnits(Sensors.Sensor1, "mm");

请注意,这些是简化的示例,某些 Get/Set 方法最多有 5 个参数,重复输入会很麻烦。 :/

【问题讨论】:

    标签: c# exception methods properties


    【解决方案1】:

    我倾向于避免在设置属性时真正任何事情。而是让所有属性都设置在内存中,然后添加一个“保存”方法,将属性“保存”到串行设备。

    【讨论】:

    • 我同意。这就是要走的路。
    【解决方案2】:

    我倾向于支持那些无论对象状态如何都可以检查而没有异常风险的事物的只读属性,而无论对象状态如何,我都倾向于对可以检查或设置为任何对象值的事物的读写属性这是永远有效的(即有效值的集合不应依赖于对象状态),以及其他事物的 getter/setter 方法。设置一个读写属性可能会影响其他只读属性的值,但不应影响任何其他读写属性的值。

    在某些必须同时设置函数的许多属性的情况下,使用一对方法将对象的状态复制到结构中并从结构中读取对象的状态可能很有用。有些人似乎认为将结构用于此类目的是邪恶的,因为在如下代码中:

    结构 MyPropertyStruct { 矩形边界; ... } ... MyPropertyStruct myProperties; someObject.GetProperties(ref myProperties); myProperties.Bounds.Left += 4;

    不会影响 someObject,但只会影响存储在 myProperties 中的属性的副本,除非或直到执行“someObject.SetProperties(ref myProperties)”。我建议相反:如果 myProperties 是一个仅包含值类型或不可变引用类型的结构,那么任何有能力的程序员都会知道,根据定义,值类型不会绑定到其他任何东西。相比之下,如果 GetProperties 返回一个类类型,查看代码的程序员将无法知道更改返回的对象可能会产生什么影响。

    【讨论】:

      猜你喜欢
      • 2016-06-16
      • 2020-04-27
      • 2013-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-01
      • 1970-01-01
      • 2011-06-28
      相关资源
      最近更新 更多