Thứ Tư, 14 tháng 4, 2010

// // Leave a Comment

Phương thức

1.   Khái niệm về method
Method (Tiếng việt gọi là hàm hoặc phương thức) là một thành phần của class dùng để thực thi một công việc nào đó của một đối tượng hoặc một class. Một method sẽ chứa một danh sách các đối số(hoặc có thể không có đối số), một giá trị trả về (trừ void method). Method có thể là static (tĩnh) hoặc non- static (hay là instance method- phương thức thể hiện). Đây là ví dụ về method:

public class Stack
{
            public static Stack Clone(Stack s) {...}
            public static Stack Flip(Stack s) {...}
            public object Pop() {...}
            public void Push(object o) {...}
            public override string ToString() {...}
            ...
}
class Test
{
            static void Main() {
                        Stack s = new Stack();
                        for (int i = 1; i < 10; i++)
                                    s.Push(i);
                        Stack flipped = Stack.Flip(s);
                        Stack cloned = Stack.Clone(s);
                        Console.WriteLine("Original stack: " + s.ToString());
                        Console.WriteLine("Flipped stack: " + flipped.ToString());
                        Console.WriteLine("Cloned stack: " + cloned.ToString());
            }
}
Class Stack có 2 phương thức tĩnh (static method) là Clone và Flip và các phương thức thể hiện là Push, Push, Pop, and ToString. Một lần nữa bạn thấy các phương thức tĩnh được gọi trực tiếp từ tên của lớp còn phương thức thể hiện phải được gọi qua thể hiện của lớp. Phương thức có thể được overloaded .  Có nghĩa là nhiều methods có tên giống nhau. Bạn sẽ được học về overloading methods trong bài tới.


2.   Truyền tham số cho method



Việc truyền tham số vào cho phương thức chỉ được thực hiện đối với các kiểu dữ liệu giá trị. Vậy cách thức truyền tham số sẽ được thực hiện như thế nào? Trong C# các tham số được truyền vào hàm thông qua 2 cách là truyền theo giá trị (truyền tham trị) và truyền theo địa chỉ (truyền tham chiếu). Chúng ta sẽ lần lượt tìm hiểu hai các truyền này.


a.        Truyền tham trị

      Khi môt đối tượng có kiểu giá trị được truyền giá trị vào cho một phương thức thì có một bản sao chép đối tượng đó được tạo ra bên trong phương thức. Khi phương thức thực hiện xong thì đối tượng sao chép này sẽ được hủy.
Dưới đây là ví dụ về cách truyền tham trị:


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;
        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ư các bạn thấy kết quả in ra Current time: 0:0:0 tức là các biến theHour, theMinute, theSecond vẫn giữ nguyên giá trị của nó sau hàm GetTime.

b.        Truyền tham chiếu

Như tôi đã nói trên, mỗi phương thức sẽ có một giá trị duy nhất được trả về, mặc dù giá trị này có thể là một tập hợp các giá trị. Đôi khi chúng ta muốn phương thức trả về nhiều hơn một giá trị. Cách thực hiện là tạo ra cách tham số dưới hình thức tham chiếu. Khi bạn truyền tham chiếu, trong phương thức bạn sẽ xử lý và gán các giá trị mới cho các tham chiếu này và 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ề. Để làm việc này bạn phải thêm từ khóa ref (viết tắt của reference) vào trước các tham số trong phần khai báo phương và lời gọi phương thức.
Ví dụ để các biến theHour, theMinute, theSecond trong ví dụ trên sau khi được xử lý trong GetTime sẽ có giá trị như chúng vừa được gán, chúng ta sẽ phải làm như sau:
Đầu tiên 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;
        s = Second;
    }
Tiếp theo là sẽ gọi phương thức GetTime dưới dạng truyền tham chiếu như sau:

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

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ị.

0 comments: