繁体   English   中英

C#类设计-公开变量以供读取但不设置

[英]C# class design - expose variables for reading but not setting

我有一个多边形类,它存储Microsoft.Xna.Framework.Vector2的列表作为多边形的顶点。 创建多边形后,我希望其他类能够读取顶点的位置,但不能更改它们。

我目前正在通过此字段公开顶点:

/// <summary>
/// Gets the vertices stored for this polygon.
/// </summary>
public List<Vector2> Vertices
{
    get { return _vertices; }
}
List<Vector2> _vertices;

但是,您可以使用以下代码更改任何顶点:

Polygon1.Vertices[0] = new Vector2(0, 0);

要么

Polygon1.Vertices[0].X = 0;

如何限制其他类只能读取这些顶点的属性,而不能在列表中设置一个新的顶点? 我唯一想到的就是将副本传递给要求它的类。

请注意,Vector2是XNA框架的一部分,我无法对其进行更改。

谢谢。

在您的类型上有一个只读接口(但是,因为它是内置类型),并在其中提供了一个ReadOnlyCollection版本。

public ReadOnlyCollection<IReadOnlyVector2> Vertices
{
    get { return (from v in _vertices 
                  select new DerivedVector2 { WrappedVector2 = v })
                 .Cast<IReadOnlyVector2>().ToList().AsReadOnly(); 
     }
}
List<Vector2> _vertices;

interface IReadOnlyVector2 {
 .. only RO getters and no setters
}

class DerivedVector2 : IReadOnlyVector2{
    public Vector2 WrappedVector2 { get; internal set;} 
.
.
.

}

像XNA Framework经常做的那样:

private List<Vector2> myVectors = new List<Vector2>();

public Vector2[] Vertices { get { return myVectors.ToArray(); } }

只是想提供Preets答案的一种变化。

public IEnumerable<IReadOnlyVector2> Vertices
{
    get
    {
        return from v in _vertices 
               select (IReadOnlyVector2)new DerivedVector2(v);
    }
}

返回IEnumerable<>本质上是只读的,因为客户端只能枚举,不能更改。 同样,简化的LINQ表达式删除了imo多余的三个附加步骤。

值得一提的是.ToList()的效果。 它将创建List<>的新实例,并将所有向量复制到该列表中。 这样做的副作用是,存储引用的客户端将拥有一个与原始列表实际上不同步的列表。 另一方面,如果我们直接返回LINQ表达式,则枚举返回的引用将始终枚举内部列表。

另一个变化,使用yield:

List<Vector2> _vertices;
public IEnumerable<Vector2> Vertices
{
    get
    {
        foreach (Vector2 vec in _vertices)
            yield return vec;
    }
}

尽管我可能会说Krisc的答案是最好的...

当然_vertices.AsReadOnly()旁边:D

暂无
暂无

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

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