我们可以在构造函数中断创建对象吗?

时间:2011-03-14 15:42:59

标签: c# constructor

你能帮帮我吗? 我有一个想法但不知道如何实现它。

所以问题是: 我们可以在构造函数中断创建对象吗? 即。

//Code

SomeClass someClass = new SomeClass(someCriteria);

因此,如果someCriteria没有回答我们的要求,我们不应该创建一个对象,而应该返回null,而不是新对象。

是否可以在C#中实现它?

7 个答案:

答案 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推荐时,工厂或类似的概念将允许您应用您的逻辑。