![](/img/trans.png)
[英]Using ReadOnlyCollection<T> vs List<T> vs array for return types
[英]Private List<T> with public IEnumerable<T> vs ReadOnlyCollection<T>
考慮以下類:
public abstract class Token
{
private List<Token> _Tokens { get; set; }
// ReadOnly public is mandatory. How to give protected add-only, index-based access?
public ReadOnlyCollection<Token> Tokens { get { return (this._Tokens.AsReadOnly()); } }
// AddOnly for derived classes.
protected Token AddToken (Token token) { this._Tokens.Add(token); return (token); }
}
public class ParenthesesToken: Token
{
// This method is called frequently from public code.
public void Parse ()
{
// Good enough.
base.AddToken(...);
// Is a call to List<T>.AsReadOnly() necessary?
// Add-only, indexed-based access is mandatory here. IEnumerable<T> will not do.
foreach (var token in this.Tokens) { /* Do something... */ }
}
}
有沒有關於List和ReadOnlyCollection實現的接口允許單向類型轉換而不是重新創建列表到其他具體實現?
目標是允許公共只讀訪問,但也保護對派生類的僅添加,基於索引的訪問。
public abstract class Token
{
private List<Token> _tokens { get; set; }
public IEnumerable<Token> Tokens
{
get { return _tokens; }
}
protected Token AddToken (Token token)
{
_tokens.Add(token);
return token;
}
protected Token GetTokenAt(int index)
{
return _tokens[index];
}
}
我不喜歡返回只讀集合,因為IEnumerable
是一個只讀接口,它隱藏了消費者的實現。 有人可能會爭辯說,消費者可能會將IEnumerable
投射到列表並添加新項目,但這意味着兩件事:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.