我有以下类,在我的应用程序中使用非常广泛:
public class ResultStatus
{
public Int32 Id {get; protected set}
public ErrorCode ErrorCode {get; protected set;}
List<string> UserMessages {get; protected set;}
protected ResultStatus (Int32 id, ErrorCode errorCode, List<string> userMessages)
{
Id = id;
ErrorCode = errorCode;
UserMessages = userMessages;
}
public static ResultStatus Success (int32 id, ErrorCode errorCode, IEnumerable<string> userMessages)
{
ResultStatus resultStatus = new ResultStatus (id, errorCode, userMessages.ToList());
return resultStatus;
}
}
我关注从IEnumerable类型的参数到List()的转换,我想将属性UserMessages类型从List更改为IEnumerable以避免强制转换。 但是,在使用此类的项目中,有时会应用Count或直接通过索引访问列表。所以我通过避免演员获得的东西,我通过使用IEnumerable的Count来解除整个集合中的迭代。这样做的好方法是什么?保持这样,List类型属性 - 从IEnumerable到List的参数转换或更改属性的类型而不关心几个Counts?
答案 0 :(得分:1)
要在内部存储使用List<T>
或类似结构所需的信息。你不能只保存你传入的IEnumerable<T>
。一旦函数返回,可枚举可能无效,或者它可能只允许迭代一次,......
至于我喜欢使用ReadOnlyCollection<T>
的公共属性类型。
答案 1 :(得分:0)
我会将所有内容更改为IEnumerable<string>
,或者如果您需要通过索引使用IList<string>
来访问错误消息。
答案 2 :(得分:0)
使用像List&lt;&gt;这样的calss是可以的在你班级的领域内部。
但建议避免在类公共API中明确暴露这种类型。相反,请使用满足您需求的最通用界面。所以该属性应该是IEnumerable&lt;&gt;或IList,如果您需要允许访问Count或索引访问。
此外,您应该考虑是否允许该类用户修改该属性。
目前,您正在提供对List本身的引用。意味着有人可以这样做:
ResultStatus myResult = GetSomeResult();
myResult.UserMessages.Clear();
如果您希望避免此类行为,可能需要更改属性以返回内部列表字段的副本。
答案 3 :(得分:0)
要构建@CodeInChaos答案,我会将UserMessages
属性更改为ReadOnlyCollection<string>
并将Success
方法的签名更改为
public static ResultStatus Success(int32 id, ErrorCode errorCode, List userMessages)
这样,转换为List<string>
将被卸载到调用方法 - 该方法可能已使用List,而UserMessages属性不能用于修改基础集合。
public class ResultStatus
{
public Int32 Id {get; protected set}
public ErrorCode ErrorCode {get; protected set;}
ReadonlyCollection<string> UserMessages {get; protected set;}
protected ResultStatus (Int32 id, ErrorCode errorCode, List<string> userMessages)
{
Id = id;
ErrorCode = errorCode;
UserMessages = userMessages.AsReadOnly();
}
public static ResultStatus Success (int32 id, ErrorCode errorCode, List<string> userMessages)
{
ResultStatus resultStatus = new ResultStatus (id, errorCode, userMessages);
return resultStatus;
}
}