我可以避免在这里创建课程吗?

时间:2012-05-11 19:42:18

标签: c# .net

我正在使用.NET framework 2.0,我的情况是我有一个类:

class MyThing 
{
  private int val;
  private DateTime date;
  private Guid id;

  public MyThing(..) { ... }
}

这个类存在的唯一原因是因为在我的代码中的某个时刻,我需要跟踪List<MyThing>。但是,MyThing除了作为一个将数据保存在一个方法中的地方之外没有任何实际目的,因此为此创建一个类感觉很难看。我宁愿不创建List<List<object>>,因为这也很难看。

还有其他方法吗?

5 个答案:

答案 0 :(得分:5)

使用class(或者可能是struct)绝对是正确的方法。不知道为什么你觉得它感觉很难看。这就是目的。它定义了“某些东西”,在这种情况下,某些东西是由你想要保留列表的那三个值代表的东西

答案 1 :(得分:3)

为什么丑?这是完全正常的。

但我同意,通过使用正确的类体系结构,您应该能够避免仅将类作为方法之间的参数传递。

答案 2 :(得分:3)

正如其他人所说,上课是正确的方法。

此外,如果您不想仅仅为了将这些属性组合在一起来创建类,您可能需要查看Tuple {{3} } 的。它是在.NET 4.0中引入的,但在.NET 2.0中重新创建并不困难。

基本上,它是一个带有一堆重载的泛型类,它允许您以类型安全的方式将不同的对象组合在一起。像这样:

public class Tuple<T1, T2, T3>
{
    public T1 Item1 { get; set; }
    public T2 Item2 { get; set; }
    public T3 Item3 { get; set; }
} 

然后,你会像这样使用它:

Tuple<int, DateTime, Guid> myThing = new Tuple<int, DateTime, Guid>();
myThing.Item1 = 42;
myThing.Item2 = DateTime.Now;
myThing.Item3 = Guid.NewGuid();

这可能不能满足你不丑的要求,但至少可以重复使用。

答案 3 :(得分:1)

如果您使用FxCop使用“Microsoft All Rules”测试代码,那么使用类是正确的方法。

由于

  1. 列表与LT;列表与LT; oject&GT;&GT;会产生警告
  2. 元组也不是一个好习惯。你不知道Tuple中的Item1,Item2是什么意思。此外,您将无法获得其类型的智能感知。
  3. 无论哪种方式,您都在创建参考类型,因此性能没有任何变化
  4. MainClass和内部类具有'has-a'关系,如果使用列表列表的元组,则无法理解。
  5. 创建不同的类是提高可读性和保持代码清洁的最佳实践。
  6. 由于

答案 4 :(得分:0)

如果您使用的是Visual Studio 2008或更高版本(无论您是否针对.NET 2.0),您可以使用匿名类型并执行类似的操作,而无需声明类:

static List<T> CreateList<T>(IEnumerable<T> stuff)
{
    return new List<T>(stuff);
}

static IEnumerable<T> SubSet<T>(IEnumerable<T> sequence, Predicate<T> predicate)
{
    foreach (var item in sequence)
        if (predicate(item)) yield return item;
}

static void Main(string[] args)
{
    var list = CreateList(new[]
                            {
                            new {val = 1,
                                date = DateTime.Now,
                                id = Guid.NewGuid()},
                            new {val = 2, 
                                date = DateTime.Now.AddDays(1),
                                id = Guid.NewGuid()}
                            });

    var subset = SubSet(list, item=>item.val == 1);
}