1

.NET Framework 2.0を使用していますが、次のようなクラスがある状況があります。

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

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

このクラスが存在する唯一の理由は、コードのある時点で、を追跡する必要があるためList<MyThing>です。ただし、MyThingデータを1つのメソッドにまとめる場所以外の本当の目的はないため、このためのクラスを作成するのは醜い感じがします。List<List<object>>これも醜いので、私は作成したくありません。

別の方法はありますか?

4

5 に答える 5

5

class(またはおそらく)を使用することstructは間違いなく正しい方法です。なぜ醜いと思うのかわからない。それが目的です。それは「何か」を定義し、この場合、何かがあなたがリストを保持したいそれらの3つの値によって表されるものであるということです

于 2012-05-11T19:45:10.397 に答える
3

なぜ醜いのですか?これは完全に正常です。

しかし、正しいクラスアーキテクチャを使用することで、メソッド間の引数としてのみクラスを渡すことを回避できるはずであることに同意します。

于 2012-05-11T19:44:06.270 に答える
3

他の人が示唆しているように、クラスは正しい道です。

さらに、これらのプロパティをグループ化するためだけにクラスを作成したくない場合は、Tupleクラス[MSDN]を確認することをお勧めします。.NET 4.0で導入されましたが、.NET2.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 に答える
1

「MicrosoftAllRules」を使用してFxCopでコードをテストする場合は、クラスを使用するのが唯一の正しい方法です。

なぜなら

  1. List <List<oject>>は警告を生成します
  2. タプルも良い習慣ではありません。タプルのItem1、Item2が何を示しているのかわかりません。また、そのタイプのIntelliSenseを取得することはできません。
  3. どちらの方法でも、パフォーマンスに変化がないように参照型を作成しています
  4. MainClassとinsideクラスには'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 に答える