我有一个名为Graph的对象。
我有Graph类中的顶点列表。所以Class有点像这样。它是一个.Net 2.0代码。
public class Graph
{
public List<Vertex> Vertices
{
get{ return _vertices}
}
} private List<Vertex> _vertices;
这是我的问题。在将其添加到Graph对象之前,我想验证Vertex对象(通过调用Vertex.IsValid()方法)。
最好的方法是什么?我喜欢在属性的getter块中添加代码的方式。有没有类似的方法呢?
我有解决方法,但我希望以最好的方式做到这一点。
答案 0 :(得分:2)
最佳解决方案是不将顶点列表公开为可变列表。相反,如果您需要Vertices
属性,请使其返回只读数据结构。然后,只需添加Add()
方法,并验证您想要的所有内容:
public ReadOnlyCollection<Vertex> Vertices
{
get { return _vertices.AsReadOnly(); }
}
public void Add(Vertex vertex)
{
if (vertex.IsValid())
_vertices.Add(vertex);
}
答案 1 :(得分:2)
我对类似情况的解决方案是添加一个辅助方法来将Vertex对象添加到Graph中,如下所示:
public void AddVertex(Vertex vertex)
{
if (vertex.IsValid())
_vertices.Add(vertex);
}
如果你没有大量的Graph对象,而Graphs通常有Vertexs,我会预先分配List集合,所以它总是空的而且从不为null(我认为在这个特殊的情况下这可能是一个好主意)。否则,您的AddVertex方法必须检查_vertices是否为null并分配List。在这种情况下,我通常会创建一个CreateVertices()方法,如果它是null,则分配List,这样它也可以在必要时在类的其他方法中使用,甚至可以由类的用户使用。简单的方法是始终预先分配集合,但我个人避免,如果有大量的类实例,集合通常可以不使用。
当然,这个解决方案并不完美,因为List不是不可变的 - 类的用户可以使用Vertices属性来获取列表,并直接对其执行Add()。我唯一的解决方案是文档 - 例如Vertices属性上的备注标记,它解释了添加到它的正确方法。 C#可以从将标记返回的集合标记为只读的方式中受益。如果您迫切希望这样做,您可以包装List并创建一个只读集合,该集合可以从普通List复制构造自身,然后返回带有该属性的不可变列表。
答案 2 :(得分:1)
可以尝试这样的事情,伪代码:
修改强>
扩展方法
public static class MyCoolVertex
{
public static void AddVertexAndValidate(this List<int> list, Vertex value)
{
if(value.IsValid())
list.Add(value);
}
}
此后使用AddVertexAndValidate
方法。
好:基本上你已经完成了
错误:您无法阻止某人仅在列表中拨打Add
,这会违反您的工作流程。
希望这会有所帮助..