我有一些代码表现得像我的变量在我认为不应该通过引用传递时。
在类库中我有
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中所有用户创建的类都是引用类型,即使按值传递,您实际上并不是发送对象的副本,而是指向其在内存中的位置的指针。
如果是这种情况,我如何将我的过滤器对象的副本传递给方法,这样我就可以搞乱这些值并让它们在调用它的代码中不受影响?
答案 0 :(得分:5)
所有参数都按值传递。 ListingFilters
是一个引用类型,它指向堆内存中的对象,因此它的“值”是一个内存地址。当您将函数作为参数传递给函数时,参数的“值”是对同一对象的引用。
答案 1 :(得分:2)
您已经概念化了通过引用传递或通过C#方式传递的值。如果您阅读规范:
值参数用于输入参数传递。值参数对应于一个局部变量,该局部变量从为参数传递的参数中获取其初始值。对value参数的修改不会影响为参数传递的参数。
值参数可以是可选的,通过指定默认值,以便可以省略相应的参数。
参考参数用于输入和输出参数传递。为参考参数传递的参数必须是变量,并且在执行方法期间,引用参数表示与参数变量相同的存储位置。使用ref修饰符声明引用参数。以下示例显示了ref参数的使用。
这里可能让您感到困惑的是,当您将引用类型作为值参数传递时,对象的副本不会生成指向该对象的指针的副本。因此,如果您对方法内的对象进行修改,它将在实际对象上而不是副本。为什么这被认为是值传递的是指针是传递的值。但是,如果您将参数重新分配给另一个对象(即更改指针),除非使用ref关键字声明参数,否则这将不会在方法外保留。
答案 2 :(得分:1)
无论是静态,非静态泛型方法,C#中的参数都是通过值传递的。 引用也按值传递。 由于ListingFilters是一个对象,如果有意义的话,它会通过值引用传递。因此,您将覆盖值作为参考参数传递给有效的内存位置。
答案 3 :(得分:0)