我正在用C#创建一个类,它最终将成为其他用户可以使用的库的一部分。 此类的用户必须设置一些属性,然后使用公共方法来检索结果。当用户在没有设置所有属性的情况下调用方法时,我该怎么办?抛出异常并希望用户抓住它?
由于
答案 0 :(得分:12)
创建一个接受参数的构造函数可能会更好,这样就构建了一个处于可用状态的对象实例。
答案 1 :(得分:4)
除了提到的所有其他选项外,您还可以将属性设置为默认值。然后,如果用户不想要默认行为,则必须将它们设置为不同的东西。但是真的不知道你的代码在做什么,很难说最好的选择是什么。
答案 2 :(得分:1)
如果你不能(或者不应该)以一个已知良好的状态启动你的对象,那么我建议把一些异常抛给调用者。
答案 3 :(得分:1)
如果绝对必须设置属性,则使它们成为构造函数的必需参数并隐藏默认的无参数构造函数。
如果不是所有属性都需要设置,那么您需要依靠日志记录/例外来控制行为。
答案 4 :(得分:1)
虽然我不同意你设置属性的设计然后调用方法,但最好的选择似乎抛出异常,因为它是库。抛出异常以通知发生异常事件 - 您还可以传递一条消息,但在调用给定方法之前提及分配属性。
答案 5 :(得分:0)
好的设计很难做错事。也许在这种情况下,API应该将所有输入作为方法的参数,这可能是静态的。
答案 6 :(得分:0)
即使你说有10个属性,如果它们是必需的,给它们默认值是没有意义的,我会说把它们全部放在构造函数中。
如果其中一些可以具有合理的默认值,那么您可以将它们从构造函数中删除,并将它们设置为默认值。
如果以上都不可行,例如可能需要在知道这些属性的值之前构造对象,那么我将看到是否有必要将所需的属性作为参数传递给方法(例如,它既没有很多参数,也没有多次被调用,或者它真的响应了自己的内部状态。)
除非上述所有内容,否则应抛出异常。你还提到“抛出异常并期望用户抓住它吗?”抛出异常的目的不应该是因为您希望调用者捕获它,您应该期望它们确保该属性已设置。当它们无法合理地确定属性被设置并且他们不关心您的方法是否因此而失败时,抓住它应该是最后的手段。
答案 7 :(得分:0)
你能使用.NET 4吗?在这种情况下,如果要保持清晰,消费者可以使用命名参数。所以你可以使用以下属性:
new Class
{
Prop1 = 123,
Prop2 = 123,
...
};
使用命名参数:
new Class(
param1: 123,
param2: 123,
...
);
此外,如果您正在使用引用类型,则无论如何都要检查空值。区别在于,使用构造函数参数只检查一次,而使用属性时,每次调用方法时都需要检查。