Hàm hay thủ tục là một kiểu dữ liệu cho phép thực thi một hay
nhiều câu lệnh một cách riêng biệt bằng cách gọi đến và truyền
tham số. Thủ tục này được sinh ra nhằm
mang tính tái sử dụng lại một đoạn code có sẵn giúp lập
trình viên tiết kiệm thời gian mà không phải code đi code lại nhiều lần.
Ngoài ra, hàm hay thủ tục chỉ được mang một chức năng và chỉ được mang đúng một chức
năng đó mà thôi.
Cú pháp:
1
2
3
4
5
|
<Quyền truy cập> <Kiểu
trả về> Tên hàm (<Tham số>)
{
// Thân
hàm
// Giá
trị trả về;
}
|
Trong đó:
·
Tên hàm: Nó là một tên duy nhất được sử dụng để gọi hàm. Ví dụ: getValue(), Add(int a, int b)...
·
Kiểu trả về: Nó được sử dụng để chỉ rõ kiểu dữ liệu của hàm
được trả về.
·
Thân hàm: Nó là khối lệnh sẽ
được thực thi khi hàm được gọi.
·
Quyền truy cập: Nó
được sử dụng để xác
định khả năng truy cập hàm trong ứng dụng.
·
Tham số: Nó là một
danh sách các tham số mà
chúng ta truyền vào khi gọi hàm
Lưu ý: Kiểu trả về, quyền truy cập và
tham số là không bắt buộcphải có khi
định nghĩa hàm.
Ví dụ
using System;
namespace ConsoleApp2
{
class Program
{
void print()
{
Console.WriteLine("------muc
dich ham chi in chu ra man hinh khong can tham so va kieu tra ve-----");
}
static void Main(string[]
args)
{
Console.WriteLine("Goi
ham print:");
Program
p = new
Program();
p.print();
Console.ReadKey();
}
}
}
|
Và kết quả sau khi
thực thi đoạn code kết:
Hình 1.11.
Kết quả gọi hàm
Ví dụ
using System;
namespace ConsoleApp2
{
class Program
{
void print(string name)
{
Console.WriteLine("---------------Xin
chao: " + name +
"---------------------");
}
static void Main(string[]
args)
{
Console.WriteLine("Goi
ham print:");
Program
p = new
Program();
p.print("Viet
Tut");
Console.ReadKey();
}
}
}
|
Và kết quả sau khi
thực thi đoạn code trên:
Ví dụ
using System;
namespace ConsoleApp2
{
class Program
{
string print(string name)
{
return "-----------Xin
chao: " + name + "------------";
}
static void Main(string[]
args)
{
Console.WriteLine("Goi
ham print:");
Program
p = new
Program();
string name
= p.print("Viet Tut");
Console.WriteLine(name);
Console.ReadKey();
}
}
}
|
Và kết quả sau khi
thực thi đoạn code trên:
Như vậy là chúng ta đã cùng tìm hiểu về hàm là
gì, ví dụ một số loại hàm. Phần tiếp theo mình cùng tìm hiểu một phần quan trong đó là cách gọi hàm có tham số.
Trong c# có 3 cách gọi hàm đó là gọi bằng giá trị (call by
value), gọi bằng tham
chiếu (call by Reference) và dùng tham số out.
Trong C#, gọi bằng giá trị tức là tham số
truyền vào là bản sao của giá trị gốc, vì vậy dù cho bên trong thân hàm có thay đổi giá trị của tham số truyền vào
thì sau khi kết thúc
gọi hàm thì giá trị gốc vẫn không
thay đổi.
Trong ví dụ sau, chúng ta truyền tham số giá
trị khi gọi hàm:
Ví dụ
using System;
namespace ConsoleApp2
{
class Program
{
public void Print(int val)
{
val
+= val;
Console.WriteLine("Gia
tri ben trong ham: " + val);
}
static void Main(string[]
args)
{
int val
= 100;
Program
p = new
Program();
Console.WriteLine("Gia
tri truoc khi goi ham: " + val);
p.Print(val);
Console.WriteLine("Gia
tri sau khi goi ham: " + val);
Console.ReadKey();
}
}
}
|
Và kết quả sau khi
thực thi đoạn code trên:
Hình 1.12.
Minh họa gọi hàm bằng giá trị
C # cung cấp một từ khóa ref để truyền đối số dưới dạng tham
chiếu. Tức là tham số truyền vào bằng địa chỉ ô nhớ của biến gốc vì vậy bên trong thân hàm thay đổi giá trị tham
số truyền vào thì giá trị gốc cũng thay đổi theo..
Ví dụ
using System;
namespace ConsoleApp2
{
class Program
{
public void Print(ref int val)
{
val
+= val;
Console.WriteLine("Gia
tri ben trong ham: " + val);
}
static void Main(string[]
args)
{
int val
= 100;
Program
p = new
Program();
Console.WriteLine("Gia
tri truoc khi goi ham: " + val);
p.Print(ref val);
Console.WriteLine("Gia
tri sau khi goi ham: " + val);
Console.ReadKey();
}
}
}
|
Và kết quả sau khi
thực thi đoạn code trên:
Hình 1.13.
Minh họa gọi hàm bằng tham chiếu
Tham số out giống
như kiểu tham chiếu, ngoại trừ việc nó không yêu cầu biến khởi tạo trước khi truyền.
Ví dụ
using System;
namespace ConsoleApp2
{
class Program
{
public void Print(out int val)
{
int val1
= 100;
val
= val1;
Console.WriteLine("Gia
tri ben trong ham: " + val);
}
static void Main(string[]
args)
{
int val
= 20; ;
Program
p = new
Program();
Console.WriteLine("Gia
tri truoc khi goi ham: " + val);
p.Print(out val);
Console.WriteLine("Gia
tri sau khi goi ham: " + val);
Console.ReadKey();
}
}
}
|
Và kết quả sau khi
thực thi đoạn code trên:
Hình 1.14.
Minh họa gọi hàm bằng tham số out
Như vậy mình chỉ cần phân biệt ref và out như sau:
ref:
·
Giá trị phải
được khởi tạo trước
·
Bên trong thân hàm có thể đọc vào thay đổi giá trị nó
out:
·
Giá trị không được khởi tạo trước và bên trong thân hàm không đọc được nó cho đến khi nó được gán giá trị
·
Hàm phải gán giá trị cho biến out
trước khi trả giá trị về