不确定哪个类型用于属性IEnumerable或List

时间:2010-12-04 16:56:57

标签: c# .net

我有以下类,在我的应用程序中使用非常广泛:

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?

4 个答案:

答案 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;

 }
}