2011-01-11 38 views
6

ai đó trong đội của tôi stumbled khi một sử dụng đặc biệt của từ khóa ref trên một loại tài liệu tham khảo"ref" loại từ khóa và tài liệu tham khảo

class A { /* ... */ } 

class B 
{  
    public void DoSomething(ref A myObject) 
    { 
     // ... 
    } 
} 

Có bất kỳ lý do một người nào đó lành mạnh sẽ làm một điều như vậy? Tôi không thể tìm thấy cách sử dụng cho điều này trong C#

+0

Xem thêm [câu hỏi này] (http: // stackoverflow.com/questions/961717/c-what-is-the-use-of-ref-for-reference-type-variables). –

+0

Thật vậy, tôi đã bỏ lỡ câu hỏi đó trong khi tìm kiếm. Tốt bắt – Luk

Trả lời

12

Hãy

class A 
{ 
    public string Blah { get; set; } 
} 

void Do (ref A a) 
{ 
    a = new A { Blah = "Bar" }; 
} 

sau đó

A a = new A { Blah = "Foo" }; 
Console.WriteLine(a.Blah); // Foo 
Do (ref a); 
Console.WriteLine(a.Blah); // Bar 

Nhưng nếu chỉ

void Do (A a) 
{ 
    a = new A { Blah = "Bar" }; 
} 

sau đó

A a = new A { Blah = "Foo" }; 
Console.WriteLine(a.Blah); // Foo 
Do (a); 
Console.WriteLine(a.Blah); // Foo 
+1

+1 cho một ví dụ rõ ràng về những gì Oded đang nói về, ngay cả khi nó đã được khá rõ ràng. –

+0

Cảm ơn rất nhiều, điều đó làm cho nó rõ ràng! – Luk

+0

@Luk: Rất vui được! :) – abatishchev

15

Chỉ khi họ muốn thay đổi tham chiếu thành đối tượng được chuyển thành myObject thành một đối tượng khác.

public void DoSomething(ref A myObject) 
{ 
    myObject = new A(); // The object in the calling function is now the new one 
} 

Rất có thể đây không phải là điều họ muốn làm và ref là không cần thiết.

0

Từ khóa ref hữu ích nếu phương pháp được cho là thay đổi tham chiếu được lưu trữ trong biến được chuyển đến phương thức. Nếu bạn không sử dụng ref bạn không thể thay đổi tham chiếu chỉ thay đổi bản thân đối tượng sẽ hiển thị bên ngoài phương thức.

this.DoSomething(myObject); 
// myObject will always point to the same instance here 

this.DoSomething(ref myObject); 
// myObject could potentially point to a completely new instance here 
0

Chẳng có gì đặc biệt với điều này. Bạn tham chiếu các biến nếu bạn muốn trả về một vài giá trị từ một phương thức hoặc chỉ không muốn gán lại giá trị trả về cho đối tượng mà bạn đã truyền vào làm đối số.

Như thế này:

int bar = 4; 
foo(ref bar); 

thay vì:

int bar = 4; 
bar = foo(bar); 

Hoặc nếu bạn muốn lấy nhiều giá trị:

int bar = 0; 
string foobar = ""; 
foo(ref bar, ref foobar); 
+0

Trên thực tế, OP đang nói về các kiểu tham chiếu, không phải kiểu giá trị, như 'int' – abatishchev

+0

Vì vậy, bạn đang nói tham chiếu không được sử dụng với các loại giá trị? – peterthegreat

+0

afaik, no. các loại giá trị được sao chép hoàn toàn mọi lúc, tức là theo giá trị. đó là lý do tại sao chúng được gọi là các loại giá trị – abatishchev

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