簡體   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