2

私が持っているとしましょうList<Objects>。オブジェクトのリストを 1 つのメソッドで定義し、それらを他のいくつかのメソッドで使用したいと考えています。

これが私が思いついた方法であり、それを行うためのより多くの方法または正しい方法を探しています。

  1. List<Objects>それを使用するすべてのメソッドで 定義できます。
    • 長所:それは動作します。間違った変数を取得する可能性はありません。
    • 短所: コードの重複。
  2. クラスで定義されたプライベートを使用して、List<Objects>それを更新することができます(ref ListObjects)
    • 長所: 定義する必要があるのは 1 回だけです。
    • 短所:面倒で悪い習慣だと思います。
  3. List<Objects>それを使用するメソッドにパラメーターとして 渡すことができます。
    • 長所: コードの重複を防ぐ
    • 短所: populate 関数が関数を返すようにし、他のメソッドにパラメーターを追加する必要があります。イベントと競合する可能性はありますか?

それが私が思いついたものです。どちらを使用するか、またはこれを行うためのより良い方法があるかどうかは本当にわかりません。考え?

編集: 要求に応じていくつかのコードを含めます。

private List<MedicalPlan> medicalPlansList;

これがリストです。データベースから情報を取得するリストです。

private void BindMedicalList()
{
   medicalPlansList = new MedicalPlanRepository().RetrieveAll().Where(x => x.Year == year).ToList();
}

次に、そのリスト内のオブジェクトを検索するために使用されます。

var result =
                    medicalPlansList.FirstOrDefault(
                        c => c.CoverageLevels.Any(p => p.Id == id));
4

4 に答える 4

2

これは、一般的に、私が行う方法です。リストで常に同じ一連の関数を使用する場合は、それを処理する連鎖関数を作成することを検討してください。(リストを返す限り) 他の関数呼び出しの 1 つの内部で関数呼び出しを直接渡すこともできますが、それは面倒に見える傾向があります。

public List<int> DoSomethingWithList(List<int> list)
{
    //do stuff
    return list;
}

public List<int> DoSomethingElseWithList(List<int> list)
{
    //do other stuff
    return list;
}

public void SomeOtherFunction(string[] args)
{
    var list = new List<int>() { 1, 2, 3, 4 }; //create list
    list = DoSomethingWithList(list); //change list
    list = DoSomethingElseWithList(list); //change list further
}

フィールドを持つオブジェクトを操作している場合は、次のList<T>ようにします。

public class MyBigClass
{
    private List<int> myList;
    public MyBigClass()
    {
        //instantiate list in constructor
        myList = new List<int>() { 1, 2, 3, 4 }; 
    }

    public void PublicListAdder(int val)
    {
        myList.Add(val);
    }

    private void PrivateListCleaner()
    {
        //remove all even numbers, just an example
        myList.RemoveAll(x => x % 2 == 0);
    }
}

refC# ではポインタが自動的に処理されるため、ほとんど使用する必要はありません。(通常) 構造体を渡すのではなく、オブジェクト参照 (基本的にはポインター) を渡します。

于 2012-07-27T17:46:02.150 に答える
0

ほとんどの場合、私はおそらくアンダースの答えに行きます. 状況に応じて、検討する価値のある別の方法は、List の拡張メソッドを記述することです。

namespace ExtensionMethods
{
    public static class MyExtensions
    {
        public static object DoSomething(this List<T> list)
        {
            //do the something with list
        }
    }   
}

そして、次のように使用できます。

var list = new List<int>();
list.DoSomething();

その例でlistは、拡張メソッドにパラメーターとして渡されます。

于 2012-07-27T17:55:07.997 に答える
0

あなたの#1と#2は本当に意味がありません:

  1. それを使用するすべてのメソッドで異なるリストを定義すると、毎回異なるリストを使用していることになります。これはリストを共有していません。これは機能しません。「それを使用する各メソッドからリストを作成するメソッドを呼び出す」ことを意味する場合でも、同じことが当てはまります。毎回異なるリストを使用しています。
  2. ref ListObjectsプライベート メンバーを更新するために使用する必要はありません。プライベート メンバーは、その名前だけでアクセスされます。これは悪い習慣ではありません。これは標準的なオブジェクト指向の実践です。
  3. 必要なすべてのデータパラメーターとしてメソッドに渡すと、メソッドが属するクラスへの結合が減るため、メソッドは本質的に再利用しやすくなります。

要するに、コードの再利用性が向上するため、#3 はある程度良い方法です。ただし、#2 の使用は、基本的に、オブジェクト指向プログラミングを使用する理由です。すべてのメソッドにパラメーターを繰り返し渡す必要がないようにするためです。これはまさにプライベート フィールドが設計されたものです。

于 2012-07-27T17:48:40.087 に答える
-1

ゲッターが読み取り専用リストを返すように設計されていない限り、通常はList<T>インスタンスの状態に属して公開されるべきではありません。あなたの設計がそのような可能性を明確に許容しない限り、それが発生する可能性があります。私の回答は、あなたの質問に対する答えではありませんが、良いオブジェクト指向設計の提案にすぎません。誰かがすでに私よりもはるかに優れていると示唆しているように、各メソッドを前後にリストを渡し、直接変更することができます。

于 2012-07-27T17:46:17.580 に答える