Chương 4: XÂY DỰNG LỚP ĐỐI TƯỢNG
4.5.2 Truyền tham chiếu với biến chưa khởi tạo
Ngôn ngữ C# bắt buộc phải thực hiện một phép gán cho biến trước khi sử dụng, do đó khi khai báo một biến như kiểu cơ bản thì trước khi có lệnh nào sử dụng các biến này thì phải có lệnh thực hiện việc gán giá trị xác định cho biến. Như trong ví dụ 4.7 trên, nếu chúng ta không khởi tạo biến theHour, theMinute, và biến theSecond trước khi truyền như tham số vào phương thức GetTime() thì trình biên dịch sẽ báo lỗi. Nếu chúng ta sửa lại đoạn mã của ví dụ 4.7 như sau:
int theHour; int theMinute; int theSecond;
t.GetTime( ref int theHour, ref int theMinute, ref int theSecond); Việc sử dụng các đoạn lệnh trên không phải hoàn toàn vô lý vì mục đích của chúng ta là nhận các giá trị của đối tượng Time, việc khởi tạo giá trị của các biến đưa vào là không cần thiết. Tuy nhiên khi biên dịch với đoạn mã lệnh như trên sẽ được
báo các lỗi sau:
Use of unassigned local variable ‘theHour’ Use of unassigned local variable ‘theMinute’ Use of unassigned local variable ‘theSecond’
Để mở rộng cho yêu cầu trong trường hợp này ngôn ngữ C# cung cấp thêm một bổ sung tham chiếu là out. Khi sử dụng tham chiếu out thì yêu cầu bắt buộc phải khởi tạo các tham số tham chiếu được bỏ qua. Như các tham số trong phương thức GetTime(), các tham số này không cung cấp bất cứ thông tin nào cho phương thức mà chỉ đơn giản là cơ chế nhận thông tin và đưa ra bên ngoài. Do vậy ta có thể đánh dấu tất cả các tham số tham chiếu này là out, khi đó ta sẽ giảm
được công việc phải khởi tạo các biến này trước khi đưa vào phương thức. Lưu ý là bên trong phương thức có các tham số tham chiếu out thì các tham số này phải được gán giá trị trước khi trả về. Ta có một số thay đổi cho phương thức GetTime() như sau:
public void GetTime( out int h, out int m, out int s) {
h = Hour; m = Minute; s = Second; }
và cách gọi mới phương thức GetTime() trong Main():
t.GetTime( out theHour, out theMinute, out theSecond);
Tóm lại ta có các cách khai báo các tham số trong một phương thức như sau: kiểu dữ liệu giá trị được truyền vào phương thức bằng giá trị. Sử dụng tham chiếu ref
để truyền kiểu dữ liệu giá trị vào phương thức dưới dạng tham chiếu, cách này cho phép vừa sử dụng và có khả năng thay đổi các tham số bên trong phương thức được gọi. Tham chiếu out được sử dụng chỉ để trả về giá trị từ một phương thức. Ví dụ 4.8 sau sử dụng ba kiểu tham số trên.
Ví dụ 4.8: Sử dụng tham số.
--- using System;
public class Time {
public void DisplayCurrentTime() {
Year, Hour, Minute, Second); }
public int GetHour() {
return Hour; }
public void SetTime(int hr, out int min, ref int sec) {
// Nếu số giây truyền vào >30 thì tăng số Minute và Second = 0 if ( sec >=30 ) { Minute++; Second = 0; }
Hour = hr; // thiết lập giá trị hr được truyền vào // Trả về giá trị mới cho min và sec min = Minute; sec = Second;
}
public Time( System.DateTime dt) { Year = dt.Year; Month = dt.Month; Date = dt.Day; Hour = dt.Hour; Minute = dt.Minute; Second = dt.Second; }
// biến thành viên private private int Year; private int Month;
private int Date; private int Hour; private int Minute; private int Second;
}
public class Tester {
static void Main() {
System.DateTime currentTime = System.DateTime.Now; Time t = new Time(currentTime); t.DisplayCurrentTime(); int theHour = 3;
int theMinute;
int theSecond = 20;
t.SetTime( theHour, out theMinute, ref theSecond);
Console.WriteLine(“The Minute is now: {0} and {1} seconds ”,
theMinute, theSecond); theSecond = 45;
t.SetTime( theHour, out theMinute, ref theSecond);
Console.WriteLine(“The Minute is now: {0} and {1} seconds”, theMinute, theSecond); } } --- Kết quả: 8/6/2002 15:35:24
The Minute is now: 35 and 24 seconds The Minute is now: 36 and 0 seconds
---
Phương thức SetTime trên đã minh họa việc sử dụng ba kiểu truyền tham số vào một phương thức. Tham số thứ nhất theHour được truyền vào dạng giá trị, mục đích của tham số này là để thiết lập giá trị cho biến thành viên Hour và tham số này không được sử dụng để về bất cứ giá trị nào.
Tham số thứ hai là theMinute được truyền vào phương thức chỉ để nhận giá trị trả về của biến thành viên Minute, do đó tham số này được khai báo với từ khóa
out.
Cuối cùng tham số theSecond được truyền vào với khai báo ref, biến tham số này vừa dùng để thiết lập giá trị trong phương thức. Nếu theSecond lớn hơn
30 thì giá trị của biến thành viên Minute tăng thêm một đơn vị và biến thành viên Second được thiết lập về 0. Sau cùng thì theSecond được gán giá trị của biến thành viên Second và được trả về.
Do hai biến theHour và theSecond được sử dụng trong phương thức SetTime nên phải được khởi tạo trước khi truyền vào phương thức. Còn với biến theMinute thì không cần thiết vì nó không được sử dụng trong phương thức mà chỉ nhận giá trị trả về.