【问题标题】:Class with proprties that haven't been set具有尚未设置的属性的类
【发布时间】:2011-02-13 19:26:49
【问题描述】:

我正在用 C# 创建一个类,它最终将成为其他用户可以使用的库的一部分。 此类的用户必须设置一些属性,然后使用公共方法来检索结果。当用户调用该方法而不设置所有属性时,我该怎么办?抛出异常并期望用户捕获它?

谢谢

【问题讨论】:

  • 取决于您与该用户的交互方式。抛出异常、记录消息、显示对话框 - 这一切都取决于您与该用户的交互。
  • 它是库,所以诸如日志消息、显示对话框气味等选项...
  • 你应该抛出异常,用户一旦调试就会注意到;)

标签: c# class oop


【解决方案1】:

创建一个接受参数的构造函数可能会更好,这样您就可以构造一个处于可用状态的对象实例。

【讨论】:

  • +1 我认为这是更好的解决方案。否则,我会扔。
  • 不幸的是,我有大约 10 个属性需要设置。我不认为向构造函数发送 10 个参数是一个好主意。
  • @koumides - 这只是一个迹象,表明您可能需要分解类或将一些参数聚合到它们自己的类中。
  • 它是一个 COM 对象的包装器。 COM 方法需要很多参数。我使用了一些默认的,但我还剩下大约 8 个。
【解决方案2】:

除了已经提到的所有其他选项,您还可以将属性设置为默认值。然后,如果用户不想要默认行为,则必须将它们设置为不同的东西。但是如果不知道更多关于你的代码在做什么,很难说最好的选择是什么。

【讨论】:

  • 这与 MS“组件”模型一致,其中组件公开配置操作的属性,然后适当的方法启动操作。各种 WinForms Dialog 组件就是一个很好的例子。这是解决缺少命名/可选参数的一种方法,因为您可以提供合理的默认值和易于阅读的类配置,而不会造成重载构造函数的混乱。
【解决方案3】:

虽然我不同意您设置属性然后调用方法的设计,但最好的选择似乎是抛出异常,因为它是库。抛出异常以通知发生了异常情况 - 您还可以传递一条异常消息,提及在调用给定方法之前分配属性

【讨论】:

  • 谢谢。当我要设置大约 10 个属性时,我还能如何设计它?
【解决方案4】:

如果您不能(或不应该)以已知良好状态启动对象,那么我建议向调用者抛出某种异常。

【讨论】:

    【解决方案5】:

    如果必须设置属性,则使它们成为构造函数的必需参数,并隐藏默认的无参数构造函数。

    如果不需要设置所有属性,那么您将需要依靠日志记录/异常来控制行为。

    【讨论】:

    • 问题是我有大约 10 个。
    【解决方案6】:

    好的设计让人很难做错事。也许在这种情况下,API 应该将所有输入作为方法的参数,这可能是静态的。

    【讨论】:

      【解决方案7】:

      即使像你说的有 10 个属性,如果它们是必需的并且给它们默认值没有意义,我会说将它们全部放在构造函数中。

      如果其中一些可以具有合理的默认值,那么您可以将它们排除在构造函数之外,并将它们设置为默认值。

      如果以上都不可行,例如,可能需要在知道这些属性的值之前构造对象,那么我会看看是否可以将所需的属性作为参数传递给方法(例如,它要么没有太多参数,要么不可能被多次调用,或者它确实在响应自己的内部状态。)

      除非上述所有情况,否则应该抛出异常。您还提到“抛出异常并期望用户捕获它?”抛出异常的目的不应该是因为您希望调用者捕获它,您应该希望他们确保设置了属性。当他们无法合理地确保设置属性并且他们不在乎您的方法是否因此失败时,捕获它应该是最后的手段。

      【讨论】:

        【解决方案8】:

        您可以使用 .NET 4 吗?在这种情况下,如果您想保持清晰,消费者可以使用命名参数。因此,对于您将拥有的属性:

        new Class
        {
            Prop1 = 123,
            Prop2 = 123,
            ...
        };
        

        并带有命名参数:

        new Class(
            param1: 123,
            param2: 123,
            ...
        );
        

        此外,如果您正在使用引用类型,则无论哪种方式都需要检查空值。不同之处在于,构造函数参数只检查一次,而属性每次调用方法时都必须检查。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-02-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-08
          • 1970-01-01
          相关资源
          最近更新 更多