Câu hỏi này là chủ đề của blog của tôi vào ngày 23 tháng 6 năm 2011 . Cảm ơn vì câu hỏi tuyệt vời của bạn!
Nhóm C # đang xem xét điều này cho C # 7. Xem https://github.com/dotnet/roslyn/issues/5233 để biết chi tiết.
CẬP NHẬT: Tính năng này đã được đưa vào C # 7!
Bạn nói đúng; .NET không hỗ trợ các phương thức trả về các tham chiếu được quản lý cho các biến. .NET cũng hỗ trợ các biến cục bộ có chứa các tham chiếu được quản lý đến các biến khác. (Tuy nhiên, lưu ý rằng .NET không hỗ trợ các trường hoặc mảng có chứa các tham chiếu được quản lý cho các biến khác vì điều đó làm phức tạp quá mức câu chuyện thu gom rác. Ngoài ra, các loại "tham chiếu được quản lý cho biến" không thể chuyển đổi thành đối tượng và do đó có thể không được sử dụng như loại đối số cho kiểu hoặc phương thức chung.)
Bình luận viên "RPM1984" vì một số lý do yêu cầu trích dẫn cho thực tế này. RPM1984 Tôi khuyến khích bạn đọc đặc tả CLI Phân vùng I Phần 8.2.1.1, "Con trỏ được quản lý và các loại liên quan" để biết thông tin về tính năng này của .NET.
Hoàn toàn có thể tạo phiên bản C # hỗ trợ cả hai tính năng này. Sau đó bạn có thể làm những việc như
static ref int Max(ref int x, ref int y)
{
if (x > y)
return ref x;
else
return ref y;
}
và sau đó gọi nó với
int a = 123;
int b = 456;
ref int c = ref Max(ref a, ref b);
c += 100;
Console.WriteLine(b); // 556!
Tôi biết theo kinh nghiệm rằng có thể xây dựng một phiên bản C # hỗ trợ các tính năng này vì tôi đã làm như vậy . Các lập trình viên tiên tiến, đặc biệt là những người chuyển mã C ++ không được quản lý, thường yêu cầu chúng tôi có thêm khả năng giống như C ++ để làm mọi việc với các tài liệu tham khảo mà không cần phải sử dụng con trỏ lớn và ghim bộ nhớ khắp mọi nơi. Bằng cách sử dụng các tài liệu tham khảo được quản lý, bạn sẽ có được những lợi ích này mà không phải trả chi phí cho việc tăng hiệu suất thu gom rác của mình.
Chúng tôi đã xem xét tính năng này và thực sự đã triển khai đủ tính năng này để hiển thị cho các nhóm nội bộ khác để nhận phản hồi của họ. Tuy nhiên tại thời điểm này dựa trên nghiên cứu của chúng tôi, chúng tôi tin rằng tính năng này không có đủ sức hấp dẫn hoặc các trường hợp sử dụng hấp dẫn để biến nó thành một tính năng ngôn ngữ được hỗ trợ thực sự . Chúng tôi có các ưu tiên cao hơn khác và thời gian và nỗ lực hạn chế, vì vậy chúng tôi sẽ không sớm thực hiện tính năng này.
Ngoài ra, thực hiện đúng cách sẽ yêu cầu một số thay đổi đối với CLR. Ngay bây giờ, CLR coi các phương thức hoàn trả là hợp pháp nhưng không thể kiểm chứng được vì chúng tôi không có máy dò phát hiện tình huống này:
ref int M1(ref int x)
{
return ref x;
}
ref int M2()
{
int y = 123;
return ref M1(ref y); // Trouble!
}
int M3()
{
ref int z = ref M2();
return z;
}
M3 trả về nội dung của biến cục bộ của M2, nhưng thời gian tồn tại của biến đó đã kết thúc! Có thể viết một trình phát hiện xác định việc sử dụng trả lại ref rõ ràng không vi phạm an toàn ngăn xếp. Những gì chúng ta sẽ làm là viết một trình phát hiện như vậy và nếu trình phát hiện không thể chứng minh được sự an toàn của ngăn xếp, thì chúng ta sẽ không cho phép sử dụng trả về ref trong phần đó của chương trình. Nó không phải là một lượng lớn công việc phát triển để làm như vậy, nhưng nó là một gánh nặng lớn đối với các nhóm thử nghiệm để đảm bảo rằng chúng tôi thực sự có tất cả các trường hợp. Đó chỉ là một điều nữa làm tăng chi phí của tính năng đến mức ngay bây giờ lợi ích không vượt quá chi phí.
Nếu bạn có thể mô tả cho tôi tại sao bạn muốn tính năng này, tôi thực sự sẽ đánh giá cao điều đó . Chúng tôi càng có nhiều thông tin từ khách hàng thực sự về lý do tại sao họ muốn nó, càng có nhiều khả năng nó sẽ biến nó thành sản phẩm vào một ngày nào đó. Đó là một tính năng nhỏ dễ thương và tôi muốn có thể đưa nó đến khách hàng bằng cách nào đó nếu có đủ sự quan tâm.
(Xem các câu hỏi liên quan cũng Là nó có thể để trở lại một tham chiếu đến một biến trong C #? Và tôi có thể sử dụng một tham chiếu bên trong một hàm C # như C ++? )