Monday, December 05, 2005

ref và out

Trong C#, các biến có kiểu value type (int, long int, float, double, ...) có thể được truyền vào method bằng tham chiếu nếu bạn sử dụng từ khóa ref hoặc out khi khai báo tham số của method.

out khác ref ở điểm: tham số nào được khai báo out thì khi truyền từ bên ngoài vào không bắt buộc phải được khởi tạo giá trị. Ví dụ:


private static void DoSomething(ref int x, out int y) {
x = 2;
y = 1;
}

public static void Main() {
int x = 1;
int y;

DoSomething(x, y);
}

Có thể bạn sẽ lo lắng vậy y không cần khởi tạo mà vẫn dùng được. Yên tâm, M$ đã lo trước điều này và bắt bạn phải có câu lệnh gán giá trị vào biến được khai báo out.

ref và out thực chất là sự "đánh lừa" lập trình viên để họ ngỡ rằng mình có thể sử dụng các biến value type để truyền theo tham số. Nhưng thực chất bên trong M$ đã dùng boxing để chuyển về các kiểu refrence type tương ứng với các kiểu value type được dùng làm tham số.

Điều này không có trong Java mà trong Java bắt buộc bạn phải sử dụng reference type để khai báo cho tham số của method. Bạn lo lắng về việc phải chuyển từ primitive type sang reference type để truyền vào method? Ko phải lo, trong JDK 1.5 đã có auto-boxing. Còn bản thân tôi thích sự rõ ràng này!

No comments: