- vừa được xem lúc

Trả về nhiều giá trị từ một hàm với C#

0 0 607

Người đăng: Henryk Sienkiewicz

Theo Viblo Asia

Sử dụng ref parameters hoặc out parameters

Để hiểu được ref parameters và out parameters là gì thì trước tiên chúng ta cùng nhắc lại kiến thức một chút về truyền tham trị và truyền tham chiếu.

  • Truyền tham trị: một bản sao của biến sẽ được tạo ra, sao chép giá trị của biến, truyền biến đã được sao chép này vào hàm, dù có thực hiện bao nhiêu phép tính toán cũng không ảnh hưởng đến biến gốc
  • Truyền tham chiếu: truyền ngay địa chỉ của biến được lưu trên bộ nhớ vào hàm (hay hiểu cách khác là truyền chính biến đó vào hàm) khi thực hiện tính toán thì giá trị biến này thay đổi theo. Ref và out là hai từ khóa dùng để truyền tham chiếu vào hàm. Chúng là hai từ khóa khá phổ biến và hữu ích trong lập trình C# nhưng cũng dễ gây hiểu nhầm vì có chức năng tương tự nhau.

Ví dụ với ref

 private static void fun(ref int x, ref int y) { x = 1; y = 2; } public static void Main() { int x = 0; int y = 0; fun(ref x, ref y); Console.WriteLine("x = {0}, y = {1}", x, y); }
  • Kết quả khi chạy chương trình
 x = 1, y = 2
  • Đối với ref thì biến truyền vào phải được khởi tạo giá trị trước khi truyền vào hàm.

Ví dụ với out

 private static void fun(out int x, out int y) { x = 1; y = 2; } public static void Main() { int x; int y; fun(out x, out y); Console.WriteLine("x = {0}, y = {1}", x, y); }
  • Đối với out thì biến truyền vào không cần khởi tạo giá trị trước khi truyền vào hàm.

Sử dụng Tuple class

  • Tuple là một cấu trúc dữ liệu cho phép bạn dễ dàng đóng gói nhiều giá trị trong một đối tượng. Các bộ giá trị thường được sử dụng để trả về nhiều giá trị từ một phương thức.
  • Các bạn có thể tìm hiểu thêm về Tuple tại đây

Ví dụ về Tuple

 private static Tuple<int, int> fun() { return Tuple.Create(1, 2); } public static void Main() { Tuple<int, int> tuple = fun(); Console.WriteLine("x = {0}, y = {1}", tuple.Item1, tuple.Item2); }
  • Kêt quả x = 1, y = 2

Sử dụng ValueTuple có từ C# 7

  • ValueTuple được giới thiệu trong .NET Framework 4.7, là các loại bộ giá trị để cung cấp việc triển khai thời gian chạy của các bộ giá trị trong C #. Giống như các lớp tuple, nó có thể được sử dụng để trả về nhiều giá trị từ một phương thức theo cách hiệu quả hơn.

Ví dụ về ValueTuple

 public static void Main() { var fruits = GetFruits(); Console.WriteLine($"Fruit Id: {fruits.Item1}, Name: {fruits.Item2}, Size: {fruits.Item3}"); Console.ReadLine(); } static (int, string, string) GetFruits() { return (Id: 1, FruitName: "Apple", Size: "Big"); }
  • Kết quả
Fruit Id: 1, Name: Apple, Size: Big

Sử dụng Class/Struct Type

Trả về một đối tượng thuộc Class/Struct là một cách khá phổ biến để trả về nhiều giá trị từ một hàm. Ở đây hàm sẽ trả về một đối tượng của một Class/Struc có thể đóng gói thêm n số thuộc tính bên trong chúng.

Ví dụ về Class/Struct Type

 private struct Pair { public int x; public int y; } private static Pair fun() { return new Pair { x = 1, y = 2 }; } public static void Main() { Pair pair = fun(); Console.WriteLine("x = {0}, y = {1}", pair.x, pair.y); }
  • Kêt quả x = 1, y = 2

Tổng kết

  • Như vậy là mk vừa giới thiệu cho các bạn một vài cách để trả về nhiều giá trị từ một hàm.
  • Tùy từng nhu cầu sử dụng, dự án mà chúng ta có thể sử dụng một trong các cách trên.
  • Mỗi cách đều có ưu điểm và hạn chế. Hi vọng các bạn có thể sử dụng chúng đúng với mục đích của mk ?

Bình luận

Bài viết tương tự

- vừa được xem lúc

Các loại tham chiếu Nullable trong C# (Phần 1)

1. Giới thiệu. C# 8.0 giới thiệu kiểu tham chiếu nullable và kiểu tham chiếu non-nullable cho phép bạn đưa ra các lựa chọn quan trọng về thuộc tính cho các biến kiểu tham chiếu:.

0 0 36

- vừa được xem lúc

Command pattern qua ví dụ !

Command pattern là gì . Command pattern khá phổ biến trong C #, đặc biệt khi chúng ta muốn trì hoãn hoặc xếp hàng đợi việc thực hiện một yêu cầu hoặc khi chúng ta muốn theo dõi các hoạt động. Hơn nữa, chúng ta có thể hoàn tác tác chúng. .

0 0 178

- vừa được xem lúc

Hiểu Liskov Substitution Principle qua ví dụ !

Liskov Substitution Principle là gì . Nguyên tắc đóng mở xác đinh rằng các instance của lớp con có thể thay thế được instance lớp cha mà vẫn đảm bảo tính đúng đắn của chương trình.

0 0 24

- vừa được xem lúc

Creating custom Controls Wpf

Introduction. Wpf/winforms provides various controls like Buttons, Textbox, TextBlock, Labels etc.

0 0 41

- vừa được xem lúc

[P1] Chọn công nghệ nào để xây dựng website?

Hiện nay nhu cầu phát triển website, app tăng rất cao do xu hướng "số hóa 4.0" trong và ngoài nước.

0 0 71

- vừa được xem lúc

Kiểu dữ liệu trong C#

Dẫn nhập. Ở bài BIẾN TRONG C# chúng ta đã tìm hiểu về biến và có một thành phần không thể thiếu khi khai báo biến – Đó là kiểu dữ liệu.

0 0 24