3

あるべきではないと思うときに、変数が参照によって渡されているように動作するコードがいくつかあります。

クラスライブラリで私は持っています

public class ListingHelper
{
    public static List<FilterCategory> getListingFilterCertifications(ListingCategory parentListingCategory, ListingFilters filters)
    {
       ...//Building up return object
       filters.gradingServiceId = 2;
    }

}

ページのpageLoadでは、これを次のように呼び出します。

private void BindForm()
{
   ListingFilters filters = new ListingFilters();
   filters.gradingServiceId = 0;

   if (filters.gradingServiceId > 0)
   {
       listCertification.DataSource = ListingHelper.getListingFilterCertificationById(filters.gradingServiceId);
       listCertification.DataBind();
   }
}

ライブラリ内のメソッドの呼び出しから戻ったときは0になるはずだと思っていfilters.gradingServiceIdましたが、2として戻ってきました。静的メソッドへのメソッドパラメーターは本当に参照によって渡されますか?

フィルターのリスト:

public class ListingFilters
{
    public String state { get; set; }
    public int categoryId { get; set; }
    public int gradingServiceId { get; set; }
    public int gradeId { get; set; }
}

編集

リンクジョンをありがとう。したがって、.netでは、ユーザーが作成したすべてのクラスは参照型であり、値で渡された場合でも、実際にはオブジェクトのコピーを送信するのではなく、メモリ内のその場所へのポインターを送信します。

その場合、フィルターオブジェクトのコピーをメソッドに渡して、値をいじり、それを呼び出したコードで影響を受けないようにするにはどうすればよいでしょうか。

4

4 に答える 4

6

すべてのパラメーターは値によって渡されます。ListingFiltersは参照型であり、ヒープメモリ内のオブジェクトを指しているため、「値」はメモリアドレスです。これをパラメーターとして関数に渡すと、パラメーターの「値」は同じオブジェクトへの参照になります。

于 2012-09-30T17:59:10.693 に答える
2

これで、C#での参照渡しまたは値渡しの意味を概念化できました。仕様を読んだ場合:

値パラメーターは、入力パラメーターの受け渡しに使用されます。値パラメーターは、パラメーターに渡された引数から初期値を取得するローカル変数に対応します。値パラメーターを変更しても、パラメーターに渡された引数には影響しません。

対応する引数を省略できるようにデフォルト値を指定することにより、値パラメーターをオプションにすることができます。

参照パラメーターは、入力パラメーターと出力パラメーターの両方の受け渡しに使用されます。参照パラメーターに渡される引数は変数である必要があり、メソッドの実行中、参照パラメーターは引数変数と同じ格納場所を表します。参照パラメーターは、ref修飾子を使用して宣言されます。次の例は、refパラメーターの使用法を示しています。

ここでおそらく混乱するのは、参照型を値パラメーターとして渡すと、オブジェクトのコピーが作成されず、オブジェクトへのポインターのコピーが作成されないことです。したがって、メソッド内のオブジェクトに変更を加えると、コピーではなく実際のオブジェクトに変更が加えられます。これが値渡しと見なされる理由は、ポインターが渡される値であるためです。ただし、パラメーターを別のオブジェクトに再割り当てした場合(つまり、ポインターを変更した場合)、パラメーターがrefキーワードで宣言されていない限り、これはメソッドの外部では持続しません。

于 2012-09-30T18:00:33.297 に答える
1

C#の引数は、静的メソッド、非静的メソッド、ジェネリックメソッドのいずれであっても値によって渡されます。参照も値によって渡されます。ListingFiltersはオブジェクトであるため、意味がある場合は値参照によって渡されます。したがって、渡された参照引数が有効なメモリ位置を指しているため、値を上書きしています。

于 2012-09-30T17:55:24.623 に答える
0
  • 値型と参照型の両方のコピーが作成されます。
  • 値型の場合、実際の値がコピーされ、そのメソッドに対してローカルになります。行った変更は、メソッドの外部には表示されません。
  • ただし、参照型の場合、アドレスのコピーが作成されます。したがって、オブジェクトは1つだけですが、アドレスのコピーは2つです。メソッド内のローカルコピーを介してオブジェクトに加えた変更は、外部に表示されます。
于 2012-09-30T17:59:15.497 に答える