0

リストに新しいアイテムを追加する必要があるときに、この状況に何度も遭遇しました。適切なコード プラクティスに従って、リストに新しいアイテムを追加する前に、リストが null かどうかを常に確認する必要があります。以下は、私の質問を明確にするためのサンプルです。ここには、何らかの条件に基づいて新しいサブジェクトを追加する関数 AddSubject() があります。ここで、Subjects フィールドが null かどうかを確認する必要があります。null の場合、新しいリストを作成する必要があります。

例:

var students = new Student(){Name="Raj Roy", Age= 23, Subjects = new List<string>()};

private void AddSubject(Student stud)
{
    if(stud.Age > 18>
        stud.Subjects.Add("NewSubjectName");
}

List フィールドが null かどうかを確認するには、次の 2 つのオプションがあります。

if(stud.Subjects == null)
    stud.Subjects = new List<string>();

また

stud.Subjects = stud.Subjects ?? new List<string>();

私は2番目のアプローチに従います。

これら2つのうちの最良のアプローチについて、または他のより良い方法があるかどうかについて、皆さんの提案が必要でした.

4

3 に答える 3

3

オブジェクトStudentがそれ自身の主題を担当するようにします:

    class Student
    {
        private readonly string name;

        private readonly int age;

        private readonly IList<string> subjects = new List<string>();

        public Student(string name, int age)
        {
            this.name = name;
            this.age = age;
        }

        public void AddSubject(string subject)
        {
            if (age > 18)
            {
                subjects.Add(subject);
            }
        }

        public IEnumerable<string> Subjects
        {
            get
            {
                return subjects;
            }
        }
    }

デメテルの法則により、stud.Subjects.Add(..).

于 2013-09-09T10:04:40.503 に答える
1

実際には、

stud.Subjects = stud.Subjects ?? new List<string>();

の単なる構文糖です

stud.Subjects = stud.Subjects == null ? new List<string>():stud.Subjects;

この構文は、もともと型のデフォルト値を提供するために導入されましたNullable<T>。したがって、これはif句を使用した前のものよりも優れていると思います。しかし、ランタイムに違いはないと思います。

編集:(@Jaroslav Kadlecへの回答)

ああ、正確に言えば、彼らの行動は異なる可能性があります. stud.Subjectsが通常のフィールドではなく属性である場合、追加の代入 whenstud.Subjects != nullは のアクセサもトリガーする可能性がありstud.Subjects、これにより全体が異なったものになります。

そのため、if を使用すると少し速くなる可能性があり、割り当てが 1 つ少なくなります。

しかし、それは VM の最適化の問題だと思います。この場合 (フィールドであると仮定します)、この割り当ては VM 内のコンパイラによって最適化されている可能性があります。しかし、彼らは何らかの理由でそうしないことを選択しました。


ただし、@topo morto が示唆したように。Studentクラスのこれらの実装の詳細を外部の世界に公開しない方がよいと思います。デフォルトでリストを初期化したくない場合でも、Studentクラスで初期化する必要があります。

于 2013-09-09T10:09:51.670 に答える
0

ご了承ください

stud.Subjects = stud.Subjects ?? new List<string>();

の構文糖衣です

stud.Subjects = stud.Subjects == null ? new List<string>():stud.Subjects;

また

if (stud.Subjects == null) {}
else {}

少なくとも 99% で。

于 2013-09-09T10:49:59.983 に答える