-5

次のような、いくつかのパラメーターを使用して別のメソッドを呼び出すメソッドがあるとします。

   public void SomeMethod()
   {
      List<SomeObject> TheList = SomeQueryThatReturnsTheList();

      TheList = DoSomeWorkWithList(TheList);
   }

   public List<SomeObject> WorkForList(List<SomeObject> TheListAsParameter)
   {
      foreach (SomeObject x in TheListAsParameter)
      {
          ....
      }

      return TheListAsParameter;
   }

ご覧のとおり、このメソッドWorkForListは受け取ったリストを返します。私の質問は次のとおりです。リストを返さずに署名を書き直さない場合public void WorkForList(List<SomeObject> TheListAsParameter)、C# での参照渡しは、メソッドで行われた作業で TheListSomeMethodが更新されることを意味しWorkForListますか? もしそうなら、次のコードは同じように動作します:

   public void SomeMethod()
   {
      List<SomeObject> TheList = SomeQueryThatReturnsTheList();

      DoSomeWorkWithList(TheList);
   }

   public void WorkForList(List<SomeObject> TheListAsParameter)
   {
        ....
   }

ありがとう。

4

6 に答える 6

4

refキーワードを使用しない場合、そのアドレスは値で渡されます。つまり、その要素を変更することはできますが、初期化することも、null を割り当てることもできません。例えば。メソッドで行う場合:

public void WorkForList(List<SomeObject> TheListAsParameter)
{
  TheListAsParameter = null;
} 

発信者の違いはわかりません。

次の記事を参照してください: Jon Skeet による C# でのパラメーターの受け渡し

于 2013-02-11T12:55:01.170 に答える
2

この場合、コードはあなたがやりたいことを実行しますが、2つのことに注意してください。

  • C#は「値渡し」言語です。オブジェクトのアドレスを渡すため、これは、インスタンス自体を変更するのではなく、このインスタンスを操作する場合にのみ機能します。そのためには、refキーワードを使用する必要がありますが、通常、コードが読みにくくなります。
  • オブジェクトを返すと読みやすさが大幅に向上します。これは副作用と見なされます。メソッドのユーザー(別のチームメンバー)は、リストの内容を変更していることに気付かない場合があります。
于 2013-02-11T12:57:21.130 に答える
1

はい-これはあなたが説明したとおりに動作するはずです...確かに、すでに書いたコードをテストできますか?

于 2013-02-11T12:54:33.283 に答える
1

はい、WorkForList()メソッドに次のような行がない限り:

TheListAsParameter = something;

その後、行った変更TheListAsParameterは、呼び出し元のメソッドに反映され、返されません。

ここで正確に言うと、この場合、変数を参照渡ししていません。参照型を値で渡しています。参照渡しにはref、C# でのキーワードの使用が含まれます。

于 2013-02-11T12:56:14.467 に答える
1

はい、できます。ただし、オブジェクトを返すことは、わかりやすくするため、およびメソッドの連鎖を可能にするために役立つ場合があります。

たとえば、最初のWorkForList方法では:

yourObject.WorkForList(list).DoSomethingWithTheReturnedList();
于 2013-02-11T12:53:58.423 に答える
1

foreach を使用してリストの値を変更しない限り:

  foreach (SomeObject x in TheListAsParameter)
  {
      ....
  }

コレクションの内容を変更することは許可されていないため、foreach を使用してウォークスルーしています。

于 2013-02-11T13:01:01.260 に答える