C# 验证和撤消类的构造函数

C# 验证和撤消类的构造函数,c#,C#,我在构造函数中应用验证逻辑,如果失败,则返回。但是,仍然创建了实例。如何确保如果逻辑失败,ctor不应该创建实例 class Car { public readonly int maxSpeed; private int currSpeed = 99; public Car(int max) { if (max > 50) return; } public Car() { max

我在构造函数中应用验证逻辑,如果失败,则返回。但是,仍然创建了实例。如何确保如果逻辑失败,ctor不应该创建实例

class Car
{
    public readonly int maxSpeed;
    private int currSpeed = 99;
    public Car(int max)
    {
        if (max > 50)
            return;
    }
    public Car()
    {
        maxSpeed = 55;
    }
}

如果验证失败,则应在构造函数中引发异常


各种框架类都可以这样做,例如,看看or构造函数。

如果验证失败,您应该在构造函数中抛出一个异常

public static Car GetInstance(int max)
{
    if (max > 50)
        return null ;

    return new Car(max); 
}

各种框架类都可以这样做,比如or构造函数。

我更喜欢Falcon在构造函数中抛出异常的回答,但是如果您想避免抛出异常,可以这样做:

public static Car GetInstance(int max)
{
    if (max > 50)
        return null ;

    return new Car(max); 
}
public static bool TryGetInstance(int max, out Car instance)
{
    instance = null;
    if(max > 50)
    {
        return false;
    }

    instance = new Car(max);
    return true;
{

我更喜欢Falcon关于在构造函数中抛出异常的回答,但如果您想避免抛出异常,可以这样做:

public static bool TryGetInstance(int max, out Car instance)
{
    instance = null;
    if(max > 50)
    {
        return false;
    }

    instance = new Car(max);
    return true;
{

通常,您可以使用以下选项之一(这些是我知道的…)

0-因为构造函数不能返回值,所以创建一个公共变量并使用它来指示对象的状态。(这一行是根据下面的反馈编辑的)

1-在构造函数中引发异常(由于几个原因不是很好)

2-使用工厂为客户端创建类

另外,请参见此线程:


通常,您可以使用以下选项之一(这些是我所知道的…)

0-因为构造函数不能返回值,所以创建一个公共变量并使用它来指示对象的状态。(这一行是根据下面的反馈编辑的)

1-在构造函数中引发异常(由于几个原因不是很好)

2-使用工厂为客户端创建类

另外,请参见此线程:


嗯……该死的……我在WPF项目中使用了类似的方式……我猜继承会给我带来损失;-)对不起,我忘了说谢谢。您是继Jon Skeet之后我RAM中的第二个用户;-)@Pankaj Upadhyay:谢谢你的荣誉!虽然这可能有点太荣幸了。嗯……狗屎人……我在WPF项目中使用了类似的方式……我猜继承给我带来了损失;-)对不起,我忘了说谢谢。您是继Jon Skeet之后我RAM中的第二个用户;-)@Pankaj Upadhyay:谢谢你的荣誉!虽然这可能有点太荣幸了。我不知道为什么-1来自某人。虽然这不是一种工厂模式,但我通常在某些应用程序中使用这种模式是可以接受的,在这些应用程序中,故障原因并不重要,但大量故障是常见的。我没有使用-1,但我不建议使用这种方法。我更喜欢从不从函数返回null的想法,这违反了这一点。如果经常出现大量故障,因此希望避免出现异常,我更愿意将其改写为
公共静态bool TryGetInstance(int max,out Car instance)
,因为它更显式,而且是惯用的C#。我不确定为什么-1来自某个人。虽然这不是一种工厂模式,但我通常在某些应用程序中使用这种模式是可以接受的,在这些应用程序中,故障原因并不重要,但大量故障是常见的。我没有使用-1,但我不建议使用这种方法。我更喜欢从不从函数返回null的想法,这违反了这一点。如果大量的失败是常见的,因此您希望避免异常,我更愿意将其重写为
publicstaticbooltrygetstance(int max,out Car实例)
,因为它更显式,而且是惯用的C#。构造函数是否以隐藏方式返回实例??。如果是这种情况,那么返回null将是一个更好的选择。我不相信C#中的构造函数可以返回null。感谢gents指出错误,我改变了我对点0的建议。构造函数是否以隐藏方式返回实例??。如果是这样的话,那么返回null将是一个更好的选择。我不相信C#中的构造函数可以返回null。感谢gents指出错误,我改变了对0点的建议。