C# cung cấp ba cỏch truyền tham đối cho phương thức: truyền bằng giỏ trị (value), truyền bằng tham chiếu (reference) và truyền kết quả (output).
Truyền bằng tham chiếu: truyền tham chiếu, khụng phải
truyền giỏ trị của tham đối thực sự cho tham đối hỡnh thức, mà sẽ thực hiện trờn chớnh đối tượng truyền vào, vỡ vậy thay đổi với tham đối hỡnh thức sẽ tỏc động đến tham đối thực sự,
nghĩa là tham đối thực sự sẽ chịu ảnh hưởng bởi sự thay đổi
của phương thức. Tham đối này gọi là tham biến. Tham đối cú kiểu tham chiếu sẽ được truyền tham chiếu vào
phương thức.
Truyền bằng giỏ trị: tạo bản sao của cỏc tham đối truyền vào
phương thức, nghĩa là sao chộp giỏ trị của tham đối thực sự cho tham đối hỡnh thức. Vỡ vậy thay đổi trờn tham đối hỡnh thức khụng tỏc động đến tham đối thực sự, nghĩa là tham đối
hỡnh thức khụng thay đổi trước và sau khi truyền cho phương
thức. Tham đối này gọi là tham trị. Tham đối cú kiểu giỏ trị
sẽ được truyền giỏ trị vào cho phương thức.
Vớ dụ:Truyền tham đối dưới dạng tham trị cho phương thức
using System; class Program {
{ num = 5; } } class Test {
static void Main(string[] args) {
int val = 2;
Program p = new Program(); p.Change(val);
Console.WriteLine("Gia tri cua val sau khi goi phuong thuc la {0}", val);
} }
Chỳ ý với kiểu string là kiểu tham chiếu nhưng truyền bởi giỏ
trị, bởi vỡ cỏc thao tỏc trờn string thật sự tạo ra một đối tượng mới,
chỳng ta thực hiện trờn bản sao để tham chiếu đến đối tượng mới, nhưng thật sự chuỗi gốc khụng thay đổi.
Vớ dụ: using System; class Program {
static void HoanVi(string s1, string s2) {
string temp = s1; s1 = s2;
s2 = temp;
Console.WriteLine("Trong phương thuc: {0} {1}", s1, s2);
}
static void Main(string[] args) {
string str1 = "Hello"; string str2 = "World";
HoanVi(str1, str2);
Console.WriteLine("Sau khi hoan vi: {0} {1}", str1, str2); }
}
Sử dụng từ khúa refđể truyền tham chiếu: C# cũn cung cấp khả
năng cho phộp ta truyền cỏc tham đối cú kiểu giỏ trị dưới hỡnh thức là tham chiếu, bằng cỏch bổ sung từ khúa ref.
Vớ dụ:Truyền tham đối dưới dạng tham chiếu cho phương thức.
using System; class Program {
public void Change(ref int num) { num = 5; } } class Test {
static void Main(string[] args) {
int val = 2;
Program p = new Program(); p.Change(ref val);
Console.WriteLine("Gia tri cua val sau khi goi phuong thuc la {0}", val);
} }
Để kiểu tham chiếu string cú thể truyền bằng tham chiếu, sử
dụng từ khúa ref như sau:
Vớ dụ: using System; class Program {
{
string temp = s1; s1 = s2;
s2 = temp;
Console.WriteLine("Trong phương thuc: {0} {1}", s1, s2);
}
static void Main(string[] args) {
string str1 = "Hello"; string str2 = "World";
Console.WriteLine("Truoc khi hoan vi: {0} {1}", str1, str2); HoanVi(ref str1, ref str2);
Console.WriteLine("Sau khi hoan vi: {0} {1}", str1, str2); }
}
Cú thể sử dụng lớp StringBuilder trong namespace System.Text để truyền tham chiếu như sau:
Vớ dụ: using System; using System.Text; class Program {
static void HoanVi(StringBuilder s1, StringBuilder s2) {
StringBuilder temp = new StringBuilder(); temp.Append(s1);
s1.Remove(0, s1.Length); s1.Append(s2);
s2.Remove(0, s2.Length); s2.Append(temp);
Console.WriteLine("Trong phương thuc: {0} {1}", s1, s2); }
static void Main(string[] args) {
StringBuilder str2 = new StringBuilder("World");
Console.WriteLine("Truoc khi hoan vi: {0} {1}", str1, str2); HoanVi(str1, str2);
Console.WriteLine("Sau khi hoan vi: {0} {1}", str1, str2); }
}
Sử dụng từ khúa out để truyền tham chiếu kết quả (output): 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 cục bộ thỡ trước khi sử dụng
cỏc biến này, phải gỏn giỏ trị cho biến. Vỡ vậy, nếu bạn muốn truyền tham đối kiểu giỏ trị dưới dạng tham chiếu khi gọi phương thức, nhưng khụng cần phải khởi tạo giỏ trị cho tham đối, mà chỉ muốn
nhận giỏ trị của tham đối, phải sử dụng từ khúa out.
Vớ dụ:Truyền tham đối dưới dạng kết quả cho phương thức
using System;
namespace TruyenThamDoi {
class Program {
public static void Sum(int num1, int num2, out int result) {
result = num1 + num2; }
}
class Test {
static void Main(string[] args) {
int val1 = 2, val2 = 5; int output;
Program.Sum(val1, val2, out output); Console.WriteLine("Tong la {0}", output); }
} }