1

我正在使用 .NET 框架 2.0,并且我有一个类似的类的情况:

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

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

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

还有其他方法吗?

4

5 回答 5

5

使用 a class(或者也许 a struct)绝对是正确的方法。不知道为什么你觉得它难看。这就是目的。它定义了“某物”,在这种情况下,某物是您想要保留列表的这三个值所代表的任何东西

于 2012-05-11T19:45:10.397 回答
3

正如其他人所建议的那样,上课是正确的方式。

此外,如果您不想仅仅为了将这些属性组合在一起而创建一个类,您可能需要查看Tuple[MSDN]。它是在 .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();

这可能无法满足您不丑的要求,但至少它是可重用的。

于 2012-05-11T19:58:25.377 回答
3

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

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

于 2012-05-11T19:44:06.270 回答
1

如果您使用带有“Microsoft 所有规则”的 FxCop 测试您的代码,那么使用类是唯一正确的方法。

因为

  1. List<List<oject>> 会产生警告
  2. 元组也不是一个好习惯。您不知道 Tuple 中的 Item1、Item2 表示什么。此外,您不会获得其类型的 IntelliSense。
  3. 无论哪种方式,您都在创建引用类型,因此性能没有变化
  4. MainClass 和内部类具有“has-a”关系,如果您使用列表列表的元组,则无法理解。
  5. 创建不同的类是提高可读性和保持代码简洁的最佳实践。

谢谢

于 2012-05-11T20:56:25.123 回答
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);
}
于 2012-05-11T20:03:04.007 回答