2013-05-10 16 views
5

Tôi tự hỏi những gì là sự khác biệt giữa các phương pháp sau đây liên quan đến cách các tham số đối tượng được tham chiếu:Sự khác nhau giữa 2 phương pháp với đối tượng ref là par và không có gì?

public void DoSomething(object parameter){} 

public void DoSomething(ref object parameter){} 

Tôi có nên sử dụng ref object parameter trong trường hợp tôi muốn thay đổi các tài liệu tham khảo đến object không ghi đè đối tượng trong cùng một tham chiếu?

+2

RTM: http://msdn.microsoft.com/en-us/library/14akc2c7.aspx –

Trả lời

8
public void DoSomething(object parameter) 
{ 
    parameter = new Object(); // original object from the callee would be unaffected. 
} 

public void DoSomething(ref object parameter) 
{ 
    parameter = new Object(); // original object would be a new object 
} 

Xem bài viết: Parameter Passing in C# by Jon Skeet

Trong C#, địa chỉ kiểu tham chiếu đối tượng được truyền theo giá trị, khi từ khóa ref được sử dụng sau đó các đối tượng ban đầu có thể được chỉ định một đối tượng mới hoặc null, mà không ref từ khóa chuyện đó không thể xảy ra được.

Hãy xem xét ví dụ sau:

class Program 
{ 
    static void Main(string[] args) 
    { 
     Object obj1 = new object(); 
     obj1 = "Something"; 

     DoSomething(obj1); 
     Console.WriteLine(obj1); 

     DoSomethingCreateNew(ref obj1); 
     Console.WriteLine(obj1); 

     DoSomethingAssignNull(ref obj1); 
     Console.WriteLine(obj1 == null); 
     Console.ReadLine(); 
    } 
    public static void DoSomething(object parameter) 
    { 
     parameter = new Object(); // original object from the callee would be unaffected. 
    } 

    public static void DoSomethingCreateNew(ref object parameter) 
    { 
     parameter = new Object(); // original object would be a new object 
    } 

    public static void DoSomethingAssignNull(ref object parameter) 
    { 
     parameter = null; // original object would be a null 
    } 
} 

Output sẽ là:

Something 
System.Object 
True 
0

Luận Đi qua ByVal: Mô tả qua các đối số theo giá trị, có nghĩa là thủ tục không thể sửa đổi các biến riêng của mình.

Đối số Truyền ByRef: Mô tả đối số truyền theo tham chiếu, có nghĩa là quy trình có thể sửa đổi biến đó.

+1

Nhưng 'đối tượng' đang chuyển trong' C# 'theo tham chiếu theo mặc định. – harry180

+0

trừ khi bạn tự tính tham chiếu là giá trị của một đối tượng? –

0

Khi bạn thấy ref object điều đó có nghĩa là đối số phải là loại object.

Bạn có thể đọc trong tài liệu:

Khi một tham số chính thức là một tham số tham khảo, lập luận tương ứng trong một invocation phương pháp phải bao gồm các từ khóa ref theo sau là một biến tham chiếu (§5.3. 3) cùng loại với tham số chính thức . Một biến chắc chắn phải được gán trước khi có thể được chuyển thành tham số tham chiếu.

1

chuyển biến bằng cách cho phép hàm thay thế biến đó thành đối tượng khác hoặc thực sự không có giá trị: ví dụ:

object parameter = new object(); 

FailedChangeRef(parameter); // parameter still points to the same object 
ChangeRef(ref parameter); // parameter now points to null 

public void FailedChangeRef(object parameter) 
{ 
      parameter = null; // this has no effect on the calling variable 
} 

public void ChangeRef(ref object parameter) 
{ 
      parameter = null; 
} 
0

Trong C#, cơ chế mặc định của đối số phương thức là Vượt qua giá trị. Do đó nếu bạn đang tuyên bố một phương pháp như thế nào,

public void DoSomething(object parameter){} // Pass by value 

Vì vậy, một bản sao mới của đối tượng được tạo ra, vì vậy những thay đổi về thông số sẽ không ảnh hưởng đến đối tượng ban đầu thông qua vào.

Tuy nhiên, khi u vượt qua các tham số của ref, nó là đèo bởi Reference

public void DoSomething(ref object parameter) // Pass by reference 

Bây giờ, bạn đang hoạt động trên địa chỉ trên đối tượng thông qua ban đầu. Do đó những thay đổi bạn đang thực hiện trên tham số bên trong phương thức sẽ ảnh hưởng đến đối tượng gốc.

Các vấn đề liên quan