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();
   }
}

当我从库中调用我的方法返回时,我认为filters.gradingServiceId应该为 0,但它又返回为 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
  • 为值类型和引用类型制作了一个副本。
  • 在值类型的情况下,实际值被复制并且是该方法的本地值。您所做的任何更改在方法之外都是不可见的。
  • 但是在引用类型的情况下,地址是一个副本。所以只有一个对象,但是地址的两个副本。您通过方法内部的本地副本对对象所做的任何更改在外部都是可见的。
于 2012-09-30T17:59:15.497 回答