2012-09-30 24 views
2

我有一些代码行为像我的变量通过引用传递时,我不认为他们应该。通过引用静态方法传递的变量?

在类库我有

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

编辑

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

如果这是我将如何通过我的过滤器的副本对象的方法的情况下,使我能与价值观混乱周围,让他们在不调用它的代码有什么影响?

+0

你是逸岸覆盖gradingServiceId 2,静态方法内 –

+0

请仔细阅读http://pobox.com/~skeet/csharp/parameters.html –

+0

貌似'getListingFilterCertifications'和'getListingFilterCertificationById'之间有些混乱。 – ladenedge

回答

1

您已经概念化了C#方式中通过引用或按值传递的内容。如果您阅读说明书:

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

值参数可以是可选的,通过指定一个缺省值,使得对应参数可以省略。

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

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

+1

你正在酝酿的概念。 ListingFilters是一个引用类型,因为它是一个类(如果它是一个结构,它将是一个值类型)。现在忽略值类型,因为它们略有不同,但在这里不相关。对象的引用默认情况下是按值传递的,但是对象并不是真的只传递给引用(即指针)的方法。所以当谈到价值传递时,你正在谈论通过价值传递的参考。这意味着,即使该指针被复制,它指向相同的内存位置,从而有效地通过引用 –

+0

谢谢,这听起来像我没有很好的理解.net如何工作的参数。 –

1

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

4

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

+0

谢谢,你能看看我编辑的问题,看看我是否正确? –

0
  • 副本两者的值类型和参考类型制成。
  • 在价值型的情况下,实际值将被复制,局部的 method.Any您所做的更改不是法外可见。
  • 但在引用类型的情况下,一份拷贝的address.So 的只有一个对象,但address.Any变化的两个副本,您对对象通过本地复制方法的内部在外面可见。