Truyền tham chiếu

Một phần của tài liệu Tài Liệu Học Ngôn Ngữ Lập Trình C#_p3 pptx (Trang 27 - 30)

Những phương thức chỉ có thể trả về duy nhất một giá trị, mặc dù giá trị này có thể là một tập hợp các giá trị. Nếu chúng ta muốn phương thức trả về nhiều hơn một giá trị thì cách thực hiện là tạo các tham số dưới hình thức tham chiếu. Khi đó trong phương thức ta sẽ xử lý và

Ngôn Ngữ Lập Trình C#

gán các giá trị mới cho các tham số tham chiếu này, kết quả là sau khi phương thức thực hiện xong ta dùng các tham số truyền vào như là các kết quả trả về. Ví dụ 4.7 sau minh họa việc truyền tham số tham chiếu cho phương thức.

Ví dụ 4.7: Trả giá trị trả về thông qua tham số.

--- using System;

public class Time {

public void DisplayCurrentTime() {

Console.WriteLine(“{0}/{1}/{2}/ {3}:{4}:{5}”, Date, Month, Year, Hour, Minute, Second);

}

public int GetHour() {

return Hour; }

public void GetTime(int h, int m, int s) {

h = Hour; m = Minute; m = Minute; s = Second; }

public Time( System.DateTime dt) { Year = dt.Year; Month = dt.Month; Date = dt.Day; Hour = dt.Hour; Minute = dt.Minute; Second = dt.Second; }

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 = 0;

int theMinute = 0; int theSecond = 0;

t.GetTime( theHour, theMinute, theSecond);

System.Console.WriteLine(“Current time: {0}:{1}:{2}”, theHour, theMinute, theSecond);

} } } ---  Kết quả: 8/6/2002 14:15:20 Current time: 0:0:0 ---

Như ta thấy, kết quả xuất ra ở dòng cuối cùng là ba giá trị 0:0:0, rõ ràng phương thức GetTime() không thực hiện như mong muốn là gán giá trị Hour, Minute, Second cho các tham số truyền vào. Tức là ba tham số này được truyền vào dưới dạng giá trị. Do đó để thực hiện như mục đích của chúng ta là lấy các giá trị của Hour, Minute, Second thì phương thức GetTime() có ba tham số được truyền dưới dạng tham chiếu. Ta thực hiện như sau, đầu tiên, thêm là thêm khai báo ref vào trước các tham số trong phương thức GetTime():

public void GetTime( ref int h, ref int m, ref int s) {

h = Hour; m = Minute; m = Minute; s = Second; }

Điều thay đổi thứ hai là bổ sung cách gọi hàm GetTime để truyền các tham số dưới dạng tham chiếu như sau:

t.GetTime( ref theHour, ref theMinute, ref theSecond);

Nếu chúng ta không thực hiện bước thứ hai, tức là không đưa từ khóa ref khi gọi hàm thì trình biên dịch C# sẽ báo một lỗi rằng không thể chuyển tham số từ kiểu int sang kiểu ref int.

Ngôn Ngữ Lập Trình C#

Cuối cùng khi biên dịch lại chương trình ta được kết quả đúng như yêu cầu. Bằng việc khai báo tham số tham chiếu, trình biên dịch sẽ truyền các tham số dưới dạng các tham chiếu, thay cho việc tạo ra một bản sao chép các tham số này. Khi đó các tham số bên trong GetTime() sẽ tham chiếu đến cùng biến đã được khai báo trong hàm Main(). Như vậy mọi sự thay đổi với các biến này điều có hiệu lực tương tự như là thay đổi trong hàm Main().

Tóm lại cơ chế truyền tham số dạng tham chiếu sẽ thực hiện trên chính đối tượng được đưa vào. Còn cơ chế truyền tham số giá trị thì sẽ tạo ra các bản sao các đối tượng được truyền vào, do đó mọi thay đổi bên trong phương thức không làm ảnh hưởng đến các đối tượng được truyền vào dưới dạng giá trị.

Một phần của tài liệu Tài Liệu Học Ngôn Ngữ Lập Trình C#_p3 pptx (Trang 27 - 30)