繁体   English   中英

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

[英]C# Property with hard coded getter and setter

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

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; }
} 

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

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

必须建立一个私人领域:

    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();
    }

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

您的属性在属性的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; }
} 

你应该使用私有字段来存储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; }
}

不,不是真的。

在你的代码中,当你检查if (Objs == null) - 你实际上正在使用你当前所在的get方法。所以Objs { 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();
}
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; 
   } 
}

公共场景的目的是什么?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM