C#访问者和集合

时间:2010-12-23 16:25:39

标签: c# collections

在定义类时,我将类成员公开为以下行:

class ClassA
{
    private String _Name;

    public String Name
    {
        get { return _Name; }
        set { _Name = value; }
    }
 }

关于访问者,在类中处理集合的最佳做法是什么

因此,如果将类扩展为类似:

class ClassA
{
    private String _Name;
    private List<String> _Parts = new List<String>();

    public String Name
    {
        get { return _Name; }
        set { _Name = value; }
    }
 }

如何公开下一个项目?

8 个答案:

答案 0 :(得分:4)

公开集合的只读实例。请注意,内容不是只读的,但引用是。

public IList<String> Parts { get; private set; }

答案 1 :(得分:2)

我遇到的命名惯例建议

private String _name;

此外,您可以使用生成与您编写的相同代码的自动属性

public string Name {get; set;}

对于集合,我不喜欢公开实际的集合,而是公开它的方法。

public void Add(...
public void Remove(...

否则你可以使用自动属性

进行只读
public IList<string> Parts {get; private set;}

答案 2 :(得分:1)

这取决于您对封装数据存储方式的严肃程度。如果你正在做一个轻量级的课程,而你只是提供存储但是想要完全取决于你的类的消费者的访问决定,你只需将其暴露为标准属性或使其成为自动属性。

public List<String> Parts { get; private set; }

如果您想确保变量永远不为null,请继续使用您的私人支持字段并添加支票。

private List<String> _Parts;
public IList<String> Parts
{
    get
    {
        if (_Parts == null)
            _Parts = new List<String>();
        return _Parts;
    }
    private set
    {
        if (value != null)
            _Parts = value;
    }
}

但是,如果您想要控制同步或其他任何类型的同步,那么您将公开对您正在进行的操作具有逻辑性的方法。

public void AddPart(String part);
public void RemovePart(String part);
public String GetPart(int index);
public IEnumerable<String> GetAllParts()
{
    foreach(String part in _Parts)
        yield return part;
}

答案 3 :(得分:1)

我不知道是否有专门的最佳实践,但有几件事需要考虑。基本方法与其他人所说的相同:

public List<String> Parts
{
    get { return _Parts; }
    private set { _Parts = value; }
}

这里重点是确保_Parts永远不会null。这导致了微妙而难以发现的错误。

但是,如果您需要在添加和删除元素时发送事件,则只有两个选项:

  • 使用适当时发送事件的List子类
  • 根本不公开List,只展示AddPart()RemovePart()ListParts()(返回当前列表的副本)。

如果您的需求很简单,只需公开该属性(但保护它不被分配null)。否则你将不得不更加花哨。

答案 4 :(得分:0)

难道你不能这样做 - 但列表?

public List<String> parts
    {
        get { return _Parts; }
        set { _Parts = value; }
    }

答案 5 :(得分:0)

我也会公开属性

public List<string> Parts { get; set; }

答案 6 :(得分:0)

您有很多选项,这实际上取决于您希望打开类的公共API的操作类型。最常见的方法是:

  • 提供readonly属性以返回具有相同类型信息的实际集合实例。
  • 提供一个只返回IEnumerable接口的readonly属性。
  • 提供readonly属性,该属性返回集合的ReadOnlyCollection包装。

同样,它实际上取决于您希望如何公开集合,但上述3个选项在大多数情况下都能正常工作。如果您有更多专门的要求,例如允许从公共API添加到集合中,同时禁止删除,那么事情会变得更复杂。

答案 7 :(得分:0)

我们通常会执行以下操作:

private Collection<String> _parts = new Collection<String>();
public Collection<String> Parts {
  get { return _parts; }
}

这可确保在创建对象时实例化集合,并使_parts集合的基础引用只读。这意味着您可以添加/删除部件,但不能更改属性指向的部分。