在定义类时,我将类成员公开为以下行:
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; }
}
}
如何公开下一个项目?
答案 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
。这导致了微妙而难以发现的错误。
但是,如果您需要在添加和删除元素时发送事件,则只有两个选项:
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的操作类型。最常见的方法是:
IEnumerable
接口的readonly属性。ReadOnlyCollection
包装。同样,它实际上取决于您希望如何公开集合,但上述3个选项在大多数情况下都能正常工作。如果您有更多专门的要求,例如允许从公共API添加到集合中,同时禁止删除,那么事情会变得更复杂。
答案 7 :(得分:0)
我们通常会执行以下操作:
private Collection<String> _parts = new Collection<String>();
public Collection<String> Parts {
get { return _parts; }
}
这可确保在创建对象时实例化集合,并使_parts集合的基础引用只读。这意味着您可以添加/删除部件,但不能更改属性指向的部分。