8

私は:を公開する次のパブリックプロパティを持っていますArraylist

public ArrayList SpillageRiskDescriptions
        {
            get
            {
                return _SpillageRiskDescriptions;
            }
            set
            {
                _SpillageRiskDescriptions = value;
            }
        }

私が呼んでいる他の場所

SpillageRiskDescriptions.Add("VENTILATE AREA");
SpillageRiskDescriptions.Add("DO NOT ALLOW SPILLAGE TO ENTER MAINS");

これらは(プロパティを介して)プライベートArrayListに要素を追加しているようですが、_SpillageRiskDescriptionsこれが問題を引き起こすと予想していました。したがって、プロパティは元の変数への参照を返し、で渡さないと考えるのは正しいですか?これArrayListは参照型だからですか?int同じことが(たとえば)でも起こりますか?

4

6 に答える 6

13

技術的には常に価値によるものですが、何が渡されているかを理解する必要があります。これは参照型であるため、参照を返します(ただし値によって)。

それが理にかなっていることを願っています。常に結果を値で返しますが、型が参照である場合は、参照を値で返します。つまり、オブジェクトを変更することはできますが、参照するオブジェクトを変更することはできません。

于 2011-03-11T15:28:34.713 に答える
9

他の回答はあなたの主な質問に正しく答えています:参照型のプロパティの参照型のインスタンスへの参照です。

より大きな質問は「今、あなたはそれについて何をしますか?」です。おそらく、リストを取得できるコードでリストを変更できるようにしたくないでしょう。

ここにはいくつかのオプションがあります。

まず、何をするにしても、今すぐArrayListの使用をやめ、リストを格納するためのより現代的で安全な型の使用を開始することをお勧めします。List<string>すぐに頭に浮かぶ。

第二に、物件のセッターは公開する必要がありますか?誰でもそのリストを変更できるようにしたいですか?それとも、タイプ自体が何らかの形でそれを更新する責任があるべきですか?セッターをプライベートにすることを検討したいと思います。

第三に、「些細な」プロパティのよりコンパクトな構文があります。あなたは言っているかもしれません

public List<string> SpillageListDescriptions { get; private set; }

コンパイラがバッキングフィールドを生成します。

List<string>それでも突然変異を許可することに注意してください。

クライアントが気にするのは、一度に1つずつリストを反復処理できることだけである場合は、次のようにすることができます。

private List<string> descriptions = whatever;
public IEnumerable<string> SpillageListDescriptions 
{ 
    get 
    {
        if (descriptions == null) yield break;
        foreach(var description in descriptions) 
            yield return description;
    }
}

そして今、あなたが彼らに与えているのはリスト自体へのアクセスではなく、それに対するイテレータであるため、発信者がリストを変更することは不可能です。

または、次のことができます。

private List<string> descriptions = whatever;
public IList<string> SpillageListDescriptions 
{ 
    get 
    {
        return new ReadOnlyCollection<string>(descriptions); 
    }
}

そして今、呼び出し元はリストの読み取り専用ビューを持っており、それを変更しようとすると例外をスローします。

于 2011-03-11T15:51:29.310 に答える
2

C#は、参照によってオブジェクトを返します。

値で返されないものだけが次のとおりです。

プリミティブ型。
構造体タイプ。
列挙型。

于 2011-03-11T15:27:05.420 に答える
1

それ自体が財産であるかどうかとは何の関係もありません。プロパティのデータ型です。この場合、ArrayList参照によって渡されるクラスであるwhichを使用しています。プロパティがとして入力された場合、int値によって渡されます。

于 2011-03-11T15:26:47.230 に答える
0

プロパティとは何の関係もありません。

この場合、値で配列リストへの参照を渡します。

あなたが次のようなことをするなら

      void AddSomethingToArrayList(ArrayList spillageRiskDescriptions){
           spillageRiskDescriptions.Add("Something");
      }

次に、配列リストへの参照が変更されます。

あなたが次のようなことをするなら

      void ReassignArrayList(ArrayList spillageRiskDescriptions){
           spillageRiskDescriptions = new ArrayList();
           spillageRiskDescriptions.Add("Something");
      }

その場合、配列リストへの元の参照はまったく変更されません。

ただし、次のように参照によって参照を渡す場合:

      void ReassignArrayListByRef(ref ArrayList spillageRiskDescriptions){
           spillageRiskDescriptions = new ArrayList();
           spillageRiskDescriptions.Add("Something");
      }

その場合、プロパティは単一のアイテムを含む新しい配列リストになります。

于 2011-03-11T15:35:20.540 に答える
0

プロパティは、実際には、セッターとゲッターの2つのメソッドのペアです。バッキングフィールド(またはソース/宛先として使用されるもの)の値をそのまま渡します。したがって、参照型の場合は参照が渡され、値型の場合は値が渡されます。

// this is how the getter method looks like
public ArrayList get_SpillageRiskDescriptions()
{
    return _SpillageRiskDescriptions;
}

// this is how the setter method looks like
public void set_SpillageRiskDescriptions(ArrayList value)
{
    _SpillageRiskDescriptions = value;
}

プロパティにインスタンスを割り当てることにより、ArrayList基本的に、バッキングフィールドが指すインスタンスを置き換えることに注意してください。ArrayList

特定の質問に答えるには:

したがって、プロパティは元の変数への参照を返し、で渡さないと考えるのは正しいですか?

いいえ、ゲッターを使用しても、_SpillageRiskDescriptionsフィールドへの参照は取得されません。(動的に割り当てられた)インスタンスへの参照であるフィールドのを取得します。ArrayList

これArrayListは参照型だからですか?

はい、ArrayListは参照型であるため、特定のArrayListインスタンスへの参照を受け取ります。

int同じことが(たとえば)でも起こりますか?

はいといいえ。はいintフィールドの値を受け取ります。また、nointは値型であるため、明示的に設定し直さずに値を変更しても、基になるフィールドは影響を受けません。

于 2011-03-11T15:28:12.747 に答える