将创建对象的决定留给 C# 中的构造函数

本文关键字:构造函数 创建对象 决定 | 更新日期: 2023-09-27 18:31:08

有没有办法拒绝在构造函数方法中创建对象?

我的观点是设置一个与条件相关的额外参数。例如:

public Test(Rule rule){
    if(rule == Rule.Custom)
        //DO NOT CREATE
    else{
        this.rule = rule;
    }
}
//WORK IF rule IS Custom
//I want to pass this information to user
public Test(Rule rule, string extra){
    if(rule != Rule.Custom)
        //DO NOT CREATE
    else{
        this.rule = rule;
        this.extra = extra;
    }
}

也许我可以制作一个工厂方法,但我对解决方法感到好奇。

将创建对象的决定留给 C# 中的构造函数

如果您的目的是抛出异常,而只是不创建对象,那么工厂方法是您唯一真正的选择。它有两个模型:

  1. 如果不满足条件,则返回 null。
  2. 使用 bool TryCreate(parameters ..., out Result) 签名,其中布尔值返回到表示成功或失败的调用。

当然,这些的真正问题是调用方无法知道对象创建失败的原因,并且需要查阅一些带外信息(文档)以获取更多信息。

听起来这种模式应该使用ArgumentOutOfRangeException。

更改示例代码以显示此想法:

public Test(Rule rule)
{
    if (rule == Rule.Custom)
    {
        throw new ArgumentOutOfRangeException("rule", "A custom rule is not allowed");
    }
    this.rule = rule;
}
public Test(Rule rule, string extra)
{
    if (rule != Rule.Custom)
    {
        throw new ArgumentOutOfRangeException("rule", "Only a custom rule is allowed");
    }
    this.rule = rule;
    this.extra = extra;
}

来自C++背景,我发现自己越来越多地使用参数例外,而我过去可能使用断言。

希望这有帮助,

附言从构造函数引发的异常是完全可以接受的...

您可以引发异常。 这将中止对象的创建,并向调用方发出错误信号。

public Test(Rule rule){ 
  if(rule == Rule.Custom) 
    throw new WillNotCreateException();
  else{ 
    this.rule = rule; 
  } 
} 

其中WillNotCreateException是您的自定义异常类型或常见异常类型之一(例如 System.ArgumentException