向属性的属性添加功能

本文关键字:属性 功能 添加 | 更新日期: 2023-09-27 18:12:09

我有一个名为Graph的对象

我在图类的顶点列表。类看起来是这样的。这是一个。net 2.0代码。

public class Graph
{
    public List<Vertex> Vertices 
    {
        get{ return _vertices}
    }
} private List<Vertex> _vertices;
这是我的问题。我想在将顶点对象添加到图形对象之前验证它(通过调用Vertex. isvalid()方法)。

最好的方法是什么?我喜欢在属性的getter块中添加代码的方式。有类似的方法吗?

我有变通办法,但希望以最好的方式做到这一点。

向属性的属性添加功能

最好的解决方案是不将顶点列表公开为可变列表。相反,如果您需要一个Vertices属性,让它返回一个只读数据结构。然后,只需包含一个Add()方法,并验证您想要的所有内容:

public ReadOnlyCollection<Vertex> Vertices
{
    get { return _vertices.AsReadOnly(); }
}
public void Add(Vertex vertex)
{
    if (vertex.IsValid())
        _vertices.Add(vertex);
}

对于类似的情况,我的解决方案是添加一个辅助方法来向Graph添加顶点对象,如下所示:

public void AddVertex(Vertex vertex)
{
    if (vertex.IsValid())
        _vertices.Add(vertex);
}

如果你没有大量的图形对象,图形通常有顶点,我会预先分配列表集合,所以它总是空的,永远不会空(我认为在这种特殊情况下,这可能是一个好主意)。否则,你的AddVertex方法将不得不检查_vertices是否为空并分配List。在这种情况下,我通常会创建CreateVertices()方法,如果List为null,则该方法会分配List,这样它也可以在必要时在类的其他方法中使用,甚至可以由类的用户使用。最简单的方法是总是预先分配集合,但我个人避免这样做,如果有大量的类实例,并且集合通常可以不使用。

当然,这个解决方案并不完美,因为List不是不可变的——类的用户可以使用Vertices属性来获取列表,并对其直接执行Add()操作。对此,我唯一的解决方案是提供文档——比如在Vertices属性上添加注释标签,说明添加的正确方法。c#可以从将返回集合标记为只读的方法中获益。如果您迫切需要这样做,您可以包装List并创建一个只读集合,该集合可以从普通List复制构造自己,然后返回带有属性的不可变列表。

可以尝试这样做,一个伪代码:

编辑

扩展方法
    public static class MyCoolVertex
    {
        public static void AddVertexAndValidate(this List<int> list, Vertex value)
        {
            if(value.IsValid())
                list.Add(value);
        }
    }

之后使用AddVertexAndValidate法。

Good:基本上你完成了

Bad:你不能阻止某人调用列表上的Add,这样就违反了你的工作流程。