具有硬编码的getter和setter的C#属性

时间:2013-06-02 18:22:34

标签: c# .net

我有一个属性定义为......

public List<Obj> Objs { get; set; }

我希望能够做的是在get方法中加入一些逻辑,所以它看起来像......

public List<Obj> Objs
{
    get
    {
        if (Objs == null)
        {
            Objs = new List<Obj>();
        }
        if (Objs.Count < 1)
        {
            Objs.Add(new Obj());
        }
        return Objs;
    }
    set { Objs = value; }
} 

现在当我这样做时,我收到一个错误,告诉我函数在所有路径上都是递归的。

有没有办法在不创建私人支持字段的情况下执行此操作?

6 个答案:

答案 0 :(得分:12)

拥有来创建私有字段:

    private List<Obj> _objs;
    public List<Obj> Objs
    {
        get
        {
            if (_objs== null)
            {
                _objs= new List<Obj>();
            }
            if (_objs.Count < 1)
            {
                _objs.Add(new Obj());
            }
            return _objs;
        }
        set { _objs= value; }
    } 

为什么不可能?让我们在Java中做同样的事情:

    private List<Obj> objs;
    public List<Obj> getListObjs()
    {
        ...
        // Recursion
        return getListObjs();
    }

答案 1 :(得分:3)

没有支持领域,没有办法做到这一点。与问题无关但与情况有关。一般情况下,您不应该为集合公开一个setter,而只是暴露一个getter。如果你有一个setter,你经常暴露对象的内部状态,那就应该隐藏起来。

答案 2 :(得分:1)

您的财产在财产的get部分的定义中引用自身。这是非法的,因为它会导致吸气剂以无限循环结束。您要么具有自动实现的属性(第一个示例),要么具有支持字段的属性(由编译器为自动实现的属性自动生成)。您需要添加(首选私有)字段作为您的财产的后备存储:

private List<Obj> objs;

public List<Obj> Objs
{
    get
    {
        if (objs == null)
        {
            objs = new List<Obj>();
        }
        if (objs.Count < 1)
        {
            objs.Add(new Obj());
        }
        return objs;
    }
    set { objs = value; }
} 

答案 3 :(得分:0)

你应该使用私有字段来存储Objs列表。 你无法从get方法得到get方法的数据...... :)是递归。

private List<Obj> _objs;
public List<Obj> Objs
{
    get { 
    if (_objs== null)
    {
        _objs = new List<Obj>();
    }
    if (_objs.Count < 1)
    {
        _objs.Add(new Obj());
    }
    return _objs;
 }
    set { _objs= value; }
}

答案 4 :(得分:0)

不,不是真的。

在您的代码中,当您检查if (Objs == null)时 - 您实际上正在使用您当前所在的get方法。因此Objs { get; }调用自身,这就是为什么它总是递归的。

请记住,自动属性(get; set;)实际上只是拥有支持字段和单独的get和set方法的简写。如果没有这种魔力,您的代码将如下所示:

private List<Obj> _objs;
public List<Obj> GetObjs() { return _objs; }
public void SetObjs(List<Objs> objs) { _objs = objs; }

你在帖子中真正实现的是 - 注意GetObjs()多次调用自己。因此,每当它自己调用时,它最终会导致它再次调用自己。又一次又一次。:

public List<Obj> GetObjs() {
    if (GetObjs() == null)
    {
        SetObjs(new List<Obj>());
    }
    if (GetObjs().Count < 1)
    {
        GetObjs().Add(new Obj());
    }
    return GetObjs();
}

答案 5 :(得分:0)

private List<Obj> objs = new List<Obj>() { new Obj() };
public  List<Obj> Objs { get { return objs; } }

或者如果你想保护某人删除最后一个Obj

private List<Obj> objs = new List<Obj>();
public List<Obj> Objs 
{ 
   get 
   { 
       if (objs.Count == 0) objs.Add(new Obj());
       return objs; 
   } 
}

公共场景的目的是什么?