2011-02-07 30 views
16

Giả sử tôi có một lớp Person và có những điều sau đây:ref cho các biến không tham số trong chức năng

Person A = new Person("Tom"); 
Person B = A; 

Có cách nào tôi có thể thay đổi nó để nếu tôi gán một mới Person-B, B = new Person("Harry"), A sẽ đề cập đến cùng một ví dụ? Tôi biết bạn có thể làm điều đó trong một nhiệm vụ tham số ref trong một hàm.

+1

Tôi lấy quyền tự do xóa thẻ VB. Bạn không chắc chắn cách áp dụng ở đây ngoại trừ trong tiêu đề ban đầu của bạn. –

Trả lời

34

Tính năng bạn muốn được gọi là "người dân địa phương tái tục" và tính năng này không được hỗ trợ trong C#.

CLR hỗ trợ tạo mã có chứa người dân địa phương và vài năm trước, tôi đã viết phiên bản thử nghiệm C# có tính năng bạn muốn, chỉ để xem tính năng này có hoạt động hay không. Bạn có thể làm điều gì đó như:

Person a = whatever; 
ref Person b = ref a; 

và sau đó như bạn nói, thay đổi thành "b" sẽ thay đổi nội dung của "a". Hai biến trở thành bí danh cho cùng một vị trí lưu trữ.

Mặc dù đó là một tính năng nhỏ và hoạt động tốt nhưng chúng tôi quyết định không mang nó cho C#. Có thể nó vẫn có thể xảy ra trong một phiên bản tương lai giả định của ngôn ngữ, nhưng tôi sẽ không cảm thấy phấn khích về nó trong sự mong đợi; nó có lẽ sẽ không xảy ra.

(Hãy nhớ rằng tất cả các suy nghĩ của Eric về các phiên bản tương lai giả định của bất kỳ sản phẩm nào của Microsoft đều chỉ dành cho mục đích giải trí.)

+0

Có sử dụng cho mục đích này không? Tôi không thể nghĩ ra bất kỳ lúc nào ngoại trừ nếu chúng ta muốn gây nhầm lẫn cho người đọc ... – configurator

+7

@configurator: Một số thuật toán trở nên dễ dàng hơn để viết nếu bạn có thể tạo bí danh cho biến và thay đổi biến mà nó đề cập đến. Và cũng có những tình huống mà bạn có thể tăng tốc độ của mã nhạy cảm với hiệu suất nhất định. –

4

Không thể không có mã an toàn (ngoài các thông số chức năng của ref). Trong mã không an toàn, bạn có thể sử dụng con trỏ để đạt được điều đó, nhưng tôi không nghĩ đó là một ý tưởng hay.

A chứa tham chiếu đến "Tom" làm giá trị. Bạn cần tham chiếu đến A để thay đổi vị trí của nó.

Nếu chúng ta xem xét mã tương tự như trong một ngôn ngữ trong đó sử dụng một cách rõ ràng con trỏ thay vì mặc nhiên điều trị các trường hợp của các lớp học như tài liệu tham khảo:

Person* A=new Person("Tom"); 
Person* B=A; 
B=new Person("Harry");//Changes only B 
Person** C=&A; 
(*C)=new Person("John");//Now A changes 

Vì vậy, bạn cần một con trỏ đến một con trỏ để thay đổi A. Nếu bạn chuyển nó sang C#, bạn cần tham chiếu đến biến cục bộ. Và chúng chỉ có sẵn ở dạng thông số chức năng ref. Điều này tránh một số vấn đề về tuổi thọ do tham chiếu đến biến cục bộ không thể tồn tại một cách an toàn so với biến cục bộ đó.

Nếu đây không phải là biến riêng tư, bạn có thể biến B thành thuộc tính để sửa đổi A trong trình thiết lập.

Person B{get{return A;} set{A=value;}} 
+0

Cũng giống như một lưu ý: C# DOES hỗ trợ con trỏ VERY tương tự như mẫu của bạn. Chúng không được sử dụng rộng rãi (như tôi đã viết trong câu trả lời của tôi). – Foxfire

+0

Có C# nó hỗ trợ con trỏ trong một số ngữ cảnh giới hạn. Nhưng nó không sử dụng một ký pháp rõ ràng cho các tham chiếu/con trỏ trong ngữ cảnh này. Nếu bạn khai báo 'Person' như là một biến kiểu của kiểu của nó thì được xử lý ngầm như một con trỏ/tham chiếu. – CodesInChaos

2

Không có cách nào trực tiếp để thực hiện việc đó.

Bạn có thể tham gia một cách tiếp cận mã nguồn như:

A = B = new Person("Harry") 

Hoặc sử dụng một kiểu generic. Một cái gì đó như:

var A = new ReferenceHolder<Person> (new Person("Tom")); 
var B = A; 

Trong C# bạn cũng có thể sử dụng con trỏ (về cơ bản là kiểu ref) nhưng cách tiếp cận này không được xác minh tĩnh và không được đề xuất.

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