2012-05-11 11 views
1

私は、.NET Framework 2.0を使用しています、と私は私のようなクラスを持っている状況があります。ここにクラスを作成しないでください。

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

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

私のコードの中でいくつかの点で、私はを追跡する必要があるため、このクラスが存在する唯一の理由は、 a List<MyThing>。しかし、MyThingは、1つのメソッドでデータをまとめて保持する場所以外の実際の目的を持っていないため、このクラスを作成するのは醜いと感じます。これはあまりにも醜いので、私はむしろList<List<object>>を作成したいと思います。

別の方法がありますか?

+5

あなたが一緒のものを維持する目的の十分あると思いませんか? – zneak

+0

.Net 2.0では、私はそこにいるとは思わない。 .Net 4.0では多くの機会が開かれています。 –

+1

いいえ、クラスはこれを意味します。カプセル化。 – leppie

答えて

3

他の人も示唆しているように、クラスは正しい方法です。あなただけ一緒にこれらのプロパティをグループ化する目的のためにクラスを作成したくない場合は

また、あなたは[MSDN]Tupleクラスを見てみたいことがあります。これは.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(); 

これは醜いではないし、あなたの要件をsatifyingないかもしれませんが、少なくともそれは、再利用可能です。

3

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

しかし、正しいクラスアーキテクチャを持つことで、メソッド間でクラスを引数として渡すのを避けることができるはずです。

+1

+1 - 誰がダウン投票したのかわかりませんが、これは完全に有効です。オブジェクトを作成する目的は、データとビヘイビアをグループ化することです。 – Tejs

5

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

0

あなたは(関係なく、あなたは.NET 2.0をターゲットにしているかどうかの)のVisual Studio 2008またはより良いのバージョンを使用している場合は、匿名型を使用してクラスを宣言することなく、このような何かを行うことができますが:

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); 
} 
1

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

  1. 一覧<一覧< ojectは>>
  2. タプルを警告生成します

    のでまた良い習慣ではありません。あなたはタプルのItem1、Item2がどのようなものかを知らない。また、そのタイプのIntelliSenseを取得しません。

  3. どちらの方法でも、パフォーマンスに変化がないように参照型を作成しています
  4. MainClassと内部クラスには、リストリストのタプルを使用すると理解できない「has-a」関係があります。
  5. 可読性を高め、きれいなコードを保持するために、別のクラスを作成することをお勧めします。

おかげ

関連する問題