Là gì

Sự Khác Nhau Giữa Parameter Trong C# Là Gì, Sự Khác Biệt Giữa Một Đối Số Và Một Tham Số Là Gì

Chào các bạn! Rất vui lúc được gặp lại các bạn trong khóa học lập trình trực tuyển tiếng nói C++.

Đang xem: Parameter trong c# là gì

Trong bài học ngày hôm nay, chúng ta sẽ tìm hiểu về một số cách không giống nhau để truyền đối số vào hàm. Như thế nào gọi là đối số?

Ví dụ mình khái niệm một hàm như sau:

void foo(int param1, int param2) //param1 and param2 are parameters{//do something}Tương tự, chúng ta có param1param2 là 2 thông số (parameters) của hàm foo.

Thông số của hàm là những biến được khai báo trong việc khai báo hàm. Thông số vào vai trò tiếp thu trị giá đầu vào cho hàm mỗi lúc hàm được gọi.

Giả sử trong hàm main mình thực hiện gọi hàm foo:

int main(){foo(1, 2); //1 and 2 are argumentsreturn 0;}Tương tự, chúng ta có 12 là 2 đối số (arguments). Lúc đó, trị giá 12 sẽ được tiếp thu và lưu trữ tạm thời trong 2 thông số param1param2.

Đối số là trị giá được truyền vào hàm mỗi lúc thực hiện lời gọi hàm. Đối số phải có kiểu dữ liệu thích hợp với thông số của hàm.

Tiếng nói C++ hổ trợ cho chúng ta nhiều kiểu truyền đối số không giống nhau tương ứng với mỗi kiểu khai báo thông số không giống nhau:

Truyền đối số là trị giá.Truyền đối số là tham chiếu.Truyền đối số là địa chỉ.

Trong bài này, chúng ta sẽ tìm hiểu 2 kiểu truyền đối số cơ bản: truyền trị giá và truyền tham chiếu.

Truyền đối số là trị giá (pass arguments by value)

Truyền đối số vào hàm là trị giá có tức là chúng ta sẽ đưa trị giá vào hàm và các thông số sẽ tiếp thu những trị giá được truyền vào.

Ví dụ:

int add(int x, int y){return x + y;}Hàm add trên sẽ hoạt động như sau:

Với lời gọi hàm add(4,5) thì trị giá 4 sẽ truyền vào cho biến x của thông số trước nhất, trị giá 5 sẽ được gán cho biến y của thông số thứ hai.

Biến xy được khai báo làm thông số của hàm add vào vai trò như là biến cục bộ hoạt động bên trong hàm add. Vì thế, tại thời khắc kết thúc phiên làm việc của hàm, các biến thông số này sẽ bị hủy và những trị giá được truyền vào ko còn tồn tại.

Điều gì xảy ra lúc truyền đối số cho hàm là trị giá của một biến (variable)?

Ở ví dụ trên, hàm add được truyền vào 2 trị giá xác định là 4 và 5. Hiện giờ mình thử lấy ví dụ lúc truyền đối số cho hàm là trị giá của biến như sau:

void swapValue(int value1, int value2){cout << “Swap value in function” << endl;int temp = value1;value1 = value2;value2 = temp;cout << “value 1: ” << value1 << endl;cout << “value 2: ” << value2 << endl;}Hàm swapValue mình vừa khái niệm được khai báo 2 thông số kiểu int, chúng sẽ tiếp thu 2 trị giá số nguyên và thực hiện hoán vị trị giá của 2 số nguyên này bên trong hàm.

 

Các bạn cùng xem điều gì xảy ra lúc thực hiện lời gọi hàm swapValue:

int main(){int a = 1;int b = 2;swapValue(a, b);cout << “===============================” << endl;cout << “After the function call” << endl;cout << “value 1: ” << a << endl;cout << “value 2: ” << b << endl;system(“pause”);return 0;}Đối số được truyền vào cho hàm swapValue tuần tự là trị giá của biến a và trị giá của biến b sẽ được tiếp thu bởi thông số value1value2. Chúng ta sẽ có kết quả trên màn hình là trị giá của 2 biến ab sau lúc thực hiện hoán vị bên trong hàm, và trị giá của 2 biến ab sau lúc thực hiện lời gọi hàm swapValue.

Như các bạn cũng đã thấy, trị giá của 2 biến value1value2 (thu được từ đối số là trị giá của biến ab) đã bị hoán vị cho nhau. Nhưng sau lúc thực hiện xong công việc bên trong hàm swapValue và trở lại thực hiện công việc còn lại bên trong hàm main, trị giá của 2 biến ab vẫn ko có gì thay đổi.

Điều này có nghĩa cái nhưng thông số value1value2 tiếp thu chỉ là 2 bản sao trị giá của biến ab.

Mọi thay đổi trị giá của thông số bên trong hàm ko tác động gì tới trị giá gốc nhưng đối số đang nắm giữ. Thử nghiệm với ví dụ sau:

void printAddressOfParameter(int parameter){cout << “Address of argument: ” << &parameter << endl;}int main(){int argument;cout << “Address of argument: ” << &argument << endl;printAddressOfParameter(argument);system(“pause”);return 0;}Lúc chạy đoạn chương trình này, các bạn sẽ thấy địa chỉ của biến argument và địa chỉ của thông số parameter trong hàm hoàn toàn khác lạ.

Truyền đối số cho hàm là tham chiếu (pass argument by reference)

Cách hoạt động của hàm nhận đầu vào (input) là trị giá khá dễ hiểu và dễ setup, nhưng nó có một số hạn chế như sau:

Lúc truyền đối số cho hàm là trị giá, cách duy nhất để có được đầu ra (output) là trả về trị giá thông qua từ khóa return.

Lúc truyền đối số cho hàm là trị giá, hảm chỉ có thể trả về 1 trị giá duy nhất tại 1 lần gọi hàm (nếu hàm có kiểu trả về).

Thử lấy ví dụ để thấy rõ 2 vấn đề trên:

int addOne(int value){return value + 1;}Mình vừa khái niệm một hàm có công dụng cộng thêm vào đối số 1 đơn vị. Cách duy nhất mình thu được trị giá đầu ra của hàm này là khái niệm hàm có kiểu trả về và sử dụng từ khóa return.

 

int main(){int number = 9;number = addOne(number); //function callsystem(“pause”);return 0;}Vì thế, nếu mình muốn lấy được trị giá đầu ra của hàm addOne, mình phải sử dụng phép gán trị giá trả về của hàm cho biến nhưng mình làm đối số.

Xem thêm: Nghĩa Của Từ Trench Là Gì ? Nghĩa Của Từ Trench Trong Tiếng Việt

Thực hiện truyền đối số cho hàm là tham chiếu (pass argument by reference) sẽ giúp chúng ta khắc phục 2 nhược điểm trên.

Nhắc lại khái niệm tham chiếu (reference)

Một biến tham chiếu (reference variable) được xem như một cái tên khác (nickname or alias name) của một biến khác có cùng kiểu dữ liệu. Sau lúc biến tham chiếu được khai báo và khởi tạo, nó sử dụng chung vùng nhớ với biến nhưng nó tham chiếu tới.

Chúng ta sử dụng toán tử một ngôi & để khai báo biến tham chiếu:

int number = 5;int &reference = number;reference = 10; //change value of number variable through its referencecout << number << endl;Lúc một trong hai biến bị hủy (biến tham chiếu hay biến gốc bị hủy do ra khỏi khối lệnh nhưng nó được khai báo), vùng nhớ nhưng 2 biến này kiểm soát vẫn chưa bị hủy nếu còn ít nhất 1 biến quản lý nó, cái bị hủy sẽ chỉ là tên biến.

int main(){ int n = 0; int &ref = n; { int n2 = 5; ref = n2; } cout << ref << endl; return 0;}Như ví dụ này, biến ref tham chiếu tới biến n2 trong khối lệnh con của hàm main, lúc ra khỏi khối lệnh con, biến n2 bị hủy nhưng vùng nhớ được cấp phát cho nó vẫn còn và vẫn đang được biến ref quản lý.

Cách hoạt động của biến tham chiếu cũng tương tự như việc khái niệm hàm có thông số là biến tham chiếu.

Truyền đối số cho hàm là tham chiếu (pass argument by reference)

Để truyền đối số cho hàm là tham chiếu, chúng ta đơn giản thêm vào toán tử & lúc khai báo thông số cho hàm.

void addOne(int &value){value++;}Lấy lại ví dụ hàm addOne nhưng với cách khai báo thông số là tham chiếu. Lúc này, tại thời khắc gọi hàm addOne, chương trình sẽ ko tạo ra một vùng nhớ riêng để nhận trị giá của đối số nữa, nhưng nó sẽ tạo ra một biến tham chiếu và tham chiếu trực tiếp tới vùng nhớ của đối số.

Chúng ta cùng xem kết quả của lời gọi hàm addOne lúc truyền đối số là tham chiếu.

Kết quả là trị giá của đối số đã được tăng lên 1 đơn vị. Tại thời khắc gọi hàm addOne, một tham chiếu được tạo ra để tham chiếu tới vùng nhớ của đối số. Sau lúc ra khỏi hàm, biến tham chiếu bị hủy, nhưng như mình đã nói ở trên, vẫn còn một biến (được dùng làm đối số) đang quản lý vùng nhớ đó nên chỉ có tên của biến tham chiếu bị hủy.

 

Như các bạn thấy, mình đã khái niệm lại hàm addOne thành hàm ko có kiểu trả về, vì trị giá đầu ra của mình đã được trả về bằng chính đối số được truyền vào. Lợi dụng đặc điểm này, chúng ta có thể trả về đồng thời nhiều trị giá chỉ với 1 lần gọi hàm.

Trả về nhiều trị giá thông qua nhiều thông số

Thỉnh thoảng, chúng ta cần 1 hàm trả về nhiều trị giá trong lúc sử dụng từ khóa return chỉ trả về được 1 trị giá, đó là lúc chúng ta sử dụng biến tham chiếu làm thông số cho hàm.

void getSinCos(float degrees, float &sinOut, float &cosOut){float radian = degrees * PI / 180.0;sinOut = sin(radian);cosOut = cos(radian);}Hàm getSinCos nhận trị giá đầu vào trước nhất là trị giá, trả về 2 trị giá đầu ra thông qua 2 biến tham chiếu.

int main(){float degrees = 180.0, Sin, Cos;getSinCos(degrees, Sin, Cos);cout << “sin = ” << Sin << endl;cout << “cos = ” << Cos << endl;system(“pause”);return 0;}

Tổng kết

Truyền đối số vào hàm là trị giá

Ưu điểm:

Trị giá làm đối số có thể là 1 trị giá xác định, trị giá của biến, biểu thức, …Đối số truyền vào hàm sẽ ko bị hàm tác động trực tiếp tới, đảm kiểm soát an ninh toàn dữ liệu lúc sử dụng hàm.

Nhược điểm:

Chương trình tạo ra những bản sao trị giá gây tốn thêm vùng nhớ sử dụng.Cách duy nhất để lấy được đầu ra (output) là thông qua từ khóa return với hàm có kiểu trả về.Ko thể truyền mảng một chiều vào hàm bằng trị giá.

Truyền đối số vào hàm là tham chiếu

Ưu điểm:

Cho phép thay đổi trị giá của đối số.Chương trình ko tạo bản sao trị giá của đối số nên tiết kiệm bộ nhớ và hoạt động nhanh hơn.Có thể trả về nhiều trị giá trong một lần gọi hàm.

Nhược điểm:

Sử dụng thông số là tham chiếu ko hợp lý có thể gây sơ sót dữ liệu.

Hứa gặp lại các bạn trong bài học tiếp theo trong khóa học lập trình C++ hướng thực hành.

Xem thêm: To Accept Là Gì – Nghĩa Của Từ Accept

Mọi ý kiến đóng góp hoặc thắc mắc có thể đặt câu hỏi trực tiếp tại diễn đàn.

www.yt2byt.edu.vn.com

Link Videos khóa học

https://www.udemy.com/c-co-ban-danh-cho-nguoi-moi-hoc-lap-trinh/learn/v4/overview

Bạn thấy bài viết Sự Khác Nhau Giữa Parameter Trong C# Là Gì, Sự Khác Biệt Giữa Một Đối Số Và Một Tham Số Là Gì có khắc phục đươc vấn đề bạn tìm hiểu ko?, nếu  ko hãy comment góp ý thêm về Sự Khác Nhau Giữa Parameter Trong C# Là Gì, Sự Khác Biệt Giữa Một Đối Số Và Một Tham Số Là Gì bên dưới để yt2byt.edu.vn có thể thay đổi & cải thiện nội dung tốt hơn cho độc giả nhé! Cám ơn bạn đã ghé thăm Website Trường Cao đẳng Kỹ thuật Y tế II

Phân mục: Hỏi đáp

Nguồn: yt2byt.edu.vn

Related Articles

Leave a Reply

Your email address will not be published. Required fields are marked *

Back to top button