在实例化时按条件去除项目

时间:2017-06-28 10:24:42

标签: c# class constructor

我有这个班级

public class Item
{
    public int Prop1 { get; set; }

    public Item(string value)
    {
        int temp;
        if (int.TryParse(value, out temp))
        {
            Prop1 = temp;
        }
        else
        {
            this = null;
        }
    }
}

this = null;无法编译。有可能做出这种行为吗?

Item foo = new Item("x"); //foo == null because "x" can't be parsed into int

4 个答案:

答案 0 :(得分:2)

您可以创建静态方法来创建项目:

public class Item
{
    public int Prop1 { get; set; }

    public Item(int value)
    {
        Prop1 = value;
    }

    public static Item Create(string value)
    {
        int i;
        return int.TryParse(value, out i) ? new Item(i) : null;
    }
}

你可以打电话

Item foo = Item.Create("x");

如果您不希望用户使用int参数创建Items,那么将构造函数设为私有。这样,Item.Create(字符串值)将是用户能够创建Item实例的唯一方式。

答案 1 :(得分:1)

不,你不能。 this引用声明属性的类实例,不能使它自身为null。 如果你真的要求Prop有一个值,请创建一个带参数的构造函数,检查值是否解析为int(为什么它不能是int)并抛出异常(如果它不是

public class Item
{
   public Item(string x){
    if (!int.TryParse(value, out temp))
        {
            throw new ArgumentException("Give me an int to parse");
        }
        else
        {
            Prop1 = temp;
        }
     }
}

答案 2 :(得分:1)

不,您无法在该实例中将实例设置为null。

更好的选择可能是让另一个属性(或方法)指示您的类实例的有效性

public class Item
{
    public int Prop1 { get; set; }
    public bool IsValid{ get; set; }
    public Item(string value)
    {
        int temp;
        if (int.TryParse(value, out temp))
        {
            Prop1 = temp;
            IsValid = true;
        }
        else
        {
            IsValid = false;
        }
    }
}

答案 3 :(得分:0)

  

this = null;无法编译。是否有可能做出这种行为?

不,你不能在课堂上这样做。但是,您可以从那里设置任何属性。对于例如你可以做到

public int? Prop1 { get; set; }

并做

Prop1 = null;