通过引用静态方法传递的变量?

时间:2012-09-30 17:50:16

标签: c# asp.net .net

我有一些代码表现得像我的变量在我认为不应该通过引用传递时。

在类库中我有

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

}

在页面的页面中,我称之为:

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

修改

感谢Jon的链接。所以听起来像在.net中所有用户创建的类都是引用类型,即使按值传递,您实际上并不是发送对象的副本,而是指向其在内存中的位置的指针。

如果是这种情况,我如何将我的过滤器对象的副本传递给方法,这样我就可以搞乱这些值并让它们在调用它的代码中不受影响?

4 个答案:

答案 0 :(得分:5)

所有参数都按值传递。 ListingFilters是一个引用类型,它指向堆内存中的对象,因此它的“值”是一个内存地址。当您将函数作为参数传递给函数时,参数的“值”是对同一对象的引用。

答案 1 :(得分:2)

您已经概念化了通过引用传递或通过C#方式传递的值。如果您阅读规范:

  

值参数用于输入参数传递。值参数对应于一个局部变量,该局部变量从为参数传递的参数中获取其初始值。对value参数的修改不会影响为参数传递的参数。

     

值参数可以是可选的,通过指定默认值,以便可以省略相应的参数。

     

参考参数用于输入和输出参数传递。为参考参数传递的参数必须是变量,并且在执行方法期间,引用参数表示与参数变量相同的存储位置。使用ref修饰符声明引用参数。以下示例显示了ref参数的使用。

这里可能让您感到困惑的是,当您将引用类型作为值参数传递时,对象的副本不会生成指向该对象的指针的副本。因此,如果您对方法内的对象进行修改,它将在实际对象上而不是副本。为什么这被认为是值传递的是指针是传递的值。但是,如果您将参数重新分配给另一个对象(即更改指针),除非使用ref关键字声明参数,否则这将不会在方法外保留。

答案 2 :(得分:1)

无论是静态,非静态泛型方法,C#中的参数都是通过值传递的。 引用也按值传递。 由于ListingFilters是一个对象,如果有意义的话,它会通过值引用传递。因此,您将覆盖值作为参考参数传递给有效的内存位置。

答案 3 :(得分:0)

  • 同时为值类型和引用类型创建一个副本。
  • 如果是值类型,则复制实际值并将其作为本地值 方法。您在方法外部看不到任何更改。
  • 但是在参考类型的情况下,副本由地址组成 只有一个对象,但是地址的两个副本。通过方法内部的本地副本对对象进行的任何更改都在外部可见。