所以问题是: 我们可以在构造函数中断创建对象吗? 即。
//Code
SomeClass someClass = new SomeClass(someCriteria);
因此,如果someCriteria没有回答我们的要求,我们不应该创建一个对象,而应该返回null,而不是新对象。
是否可以在C#中实现它?
答案 0 :(得分:21)
最好的方法是工厂级,但如果你的班级很小,你可以使用它:
class SomeClass
{
private string _someCriteria;
private SomeClass(string someCriteria)
{
_someCriteria = someCriteria;
}
public static SomeClass CreateInstance(string someCriteria)
{
if (someCriteria.Length > 2)
{
return new SomeClass(someCriteria);
}
return null;
}
}
class Program
{
static void Main(string[] args)
{
// returns null
SomeClass someClass = SomeClass.CreateInstance("t");
// returns object
SomeClass someClass2 = SomeClass.CreateInstance("test");
}
}
答案 1 :(得分:9)
如果someCriteria无效,您可能希望使用创建SomeClass实例的工厂类返回null。
答案 2 :(得分:5)
通常检查构造函数参数是否有效。如果没有,你通常会抛出异常。
我还阅读了一个很好的建议,提供用于验证构造函数参数的静态方法。这使您的类的用户可以检查他在构造函数中传递的内容是否成功。那些确定参数正常的人(他们做了某种验证)将直接使用构造函数。
还要考虑类的用户可能使用 null 而不是对象(如果使用某种工厂类)。这通常会导致下一行出现NullPointerException吗?通常最好尽快停止错误的事情,在这种情况下抛出异常并完成。它比返回null更清晰,如果有人真的想要(这绝不是最佳实践),他仍然可以捕获这个异常...
答案 3 :(得分:2)
如果构造函数的参数无效,请考虑抛出ArgumentException或其后代类之一(例如ArgumentOutOfRangeException
)。
答案 4 :(得分:1)
那是可能的。另一种方法是在创建对象之前进行检查。像这样
SomeClass someClass = null;
if (someCriteria == VALID)
{
someClass = new SomeClass(someCriteria);
}
希望这有帮助。
答案 5 :(得分:0)
不可以直接。
您可以抛出异常并添加所需的代码以检查异常并为变量赋值null。
更好的解决方案是使用Factory,如果某些条件失败,将返回null。
var someClass = SomeClassFactory.Create(someCriteria);
if(someClass != null)
{
}
答案 6 :(得分:0)
new
构造确保返回一个对象(或抛出异常)。因此,当bleeeah推荐时,工厂或类似的概念将允许您应用您的逻辑。