Exercise - Trả về các giá trị và tham số của phương pháp
- 18 phút
Trong đơn vị trước, bạn đã sử dụng một kịch bản mã hóa "roll dice" để minh họa sự khác biệt giữa stateful (instance) và stateless (tĩnh). Kịch bản tương tự đó có thể giúp bạn hiểu rõ các khái niệm quan trọng khác về phương thức gọi điện. Chẳng hạn:
- xử lý giá trị trả lại của phương thức.
- tham số phương pháp và các đối số truyền tới một phương pháp.
- chọn một phiên bản quá tải của một phương pháp.
Trả về giá trị
Một số phương pháp được thiết kế để hoàn thành chức năng của chúng và kết thúc "yên tĩnh". Nói cách khác, chúng không trả về giá trị khi hoàn tất. Chúng được gọi là phương pháp vô hiệu.
Các phương pháp khác được thiết kế để trả về giá trị sau khi hoàn thành. Giá trị trả về thường là kết quả của một thao tác. Một giá trị trả lại là cách chính cho một phương pháp để giao tiếp trở lại mã mà gọi phương pháp.
Bạn thấy rằng phương thức Random.Next()
trả về một int
kiểu có chứa giá trị của số được tạo ngẫu nhiên. Tuy nhiên, một phương pháp có thể được thiết kế để trả về bất kỳ kiểu dữ liệu nào, thậm chí là một lớp khác. Ví dụ: lớp String
có một số phương pháp trả về một chuỗi, một số trả về một số nguyên và một số trả về một Boolean.
Khi gọi một phương thức trả về một giá trị, bạn thường sẽ gán giá trị trả về cho một biến số. Bằng cách đó, bạn có thể sử dụng giá trị sau trong mã của mình. Trong kịch bản con sắc, bạn đã gán giá trị trả về Random.Next()
của biến roll
:
int roll = dice.Next(1, 7);
Trong một số trường hợp, bạn có thể muốn sử dụng trực tiếp giá trị trả về mà không cần gán cho biến số. Ví dụ: bạn có thể muốn in giá trị trả về cho bảng điều khiển như sau:
Console.WriteLine(dice.Next(1, 7));
Mặc dù một phương pháp trả về giá trị, bạn vẫn có thể gọi phương thức mà không sử dụng giá trị trả về. Ví dụ: bạn có thể bỏ qua giá trị trả về bằng cách gọi phương thức như sau:
dice.Next(1, 7);
Tuy nhiên, bỏ qua giá trị trả về sẽ vô nghĩa. Lý do bạn gọi phương thức là để Next()
bạn có thể truy xuất giá trị ngẫu nhiên tiếp theo.
Tham số phương pháp và tham đối trong câu lệnh gọi
Khi bạn gọi một phương pháp, bạn có thể chuyển vào các giá trị mà phương pháp sẽ sử dụng để hoàn thành nhiệm vụ của nó. Những giá trị này được gọi là đối số. Phương pháp này sử dụng các đối số để gán giá trị cho các tham số được xác định trong chữ ký của phương pháp. Một phương pháp có thể yêu cầu một hoặc nhiều tham số để hoàn thành nhiệm vụ của nó, hoặc không có tham số nào cả.
Lưu ý
Thông thường, các thuật ngữ 'tham số' và 'đối số' được sử dụng hoán đổi cho nhau. Tuy nhiên, 'tham số' tham chiếu đến biến đang được sử dụng bên trong phương pháp. 'Đối số' là giá trị được truyền khi gọi phương thức.
Hầu hết các phương pháp được thiết kế để chấp nhận một hoặc nhiều tham số. Các tham số có thể được sử dụng để cấu hình cách thức phương pháp thực hiện công việc của nó, hoặc chúng có thể được vận hành trực tiếp. Ví dụ, phương pháp sử Random.Next()
dụng các tham số để cấu hình ranh giới trên và dưới của giá trị trả về. Tuy nhiên, các sử Console.WriteLine()
dụng các tham số trực tiếp bằng cách in giá trị để giao diện điều khiển.
Phương pháp sử dụng chữ ký phương pháp để xác định số lượng tham số mà phương pháp sẽ chấp nhận, cũng như kiểu dữ liệu của mỗi tham số. Câu lệnh mã hóa gọi phương thức phải tuân thủ các yêu cầu được xác định bởi chữ ký phương thức. Một số phương pháp cung cấp tùy chọn cho số và loại tham số mà phương pháp chấp nhận.
Khi người gọi gọi ra phương thức, nó cung cấp các giá trị cụ thể, được gọi là đối số cho từng tham số. Các đối số phải tương thích với kiểu tham số. Tuy nhiên, tên đối số, nếu một tên được dùng trong mã gọi, không nhất thiết phải giống với tên tham số được xác định trong phương thức.
Hãy cân nhắc mã sau đây:
Random dice = new Random();
int roll = dice.Next(1, 7);
Console.WriteLine(roll);
Dòng mã đầu tiên tạo ra một thể hiện của lớp có Random
tên dice
. Dòng mã thứ hai sử dụng phương dice.Next(1, 7)
pháp để gán một giá trị ngẫu nhiên cho một số nguyên có tên roll
là . Lưu ý rằng câu lệnh gọi cung cấp hai đối số được phân tách bởi một ký ,
hiệu. Phương Next()
thức bao gồm chữ ký phương thức chấp nhận hai tham số thuộc kiểu int
. Các tham số này được dùng để cấu hình ranh giới dưới và biên trên cho số ngẫu nhiên được trả về. Dòng mã cuối cùng sử dụng phương Console.WriteLine()
pháp để in giá trị của bảng roll
điều khiển.
Các đối số được chuyển đến một phương pháp phải có cùng kiểu dữ liệu như các tham số tương ứng được xác định bởi phương pháp. Nếu bạn tìm cách truyền đối số được nhập sai vào một phương thức, trình biên dịch C# sẽ mắc lỗi của bạn và buộc bạn cập nhật câu lệnh gọi trước khi mã của bạn sẽ biên dịch và chạy. Kiểm tra loại là một cách sử dụng C# và .NET để ngăn người dùng cuối gặp lỗi khi chạy.
Lưu ý
Mặc dù tham số thường được sử dụng, nhưng không phải tất cả các phương pháp đều yêu cầu tham số để hoàn thành nhiệm vụ của chúng. Ví dụ, lớp Console
bao gồm một phương Console.Clear()
pháp không sử dụng tham số. Vì phương pháp này được sử dụng để xóa bất kỳ thông tin nào được hiển thị trong bảng điều khiển nên không cần tham số để hoàn thành tác vụ.
Phương pháp quá tải
Nhiều phương pháp trong Thư viện Lớp .NET có chữ ký phương thức quá tải. Trong số những điều khác, điều này cho phép bạn gọi phương thức có hoặc không có đối số được chỉ định trong câu lệnh gọi.
Một phương pháp quá tải được xác định với nhiều chữ ký phương pháp. Các phương pháp quá tải cung cấp nhiều cách khác nhau để gọi phương pháp hoặc cung cấp các loại dữ liệu khác nhau.
Trong một số trường hợp, các phiên bản quá tải của một phương pháp được sử dụng để xác định tham số sử dụng các kiểu dữ liệu khác nhau. Ví dụ, phương pháp Console.WriteLine()
có 19 phiên bản quá tải khác nhau. Hầu hết những quá tải cho phép các phương pháp để chấp nhận các loại khác nhau và sau đó viết thông tin được chỉ định vào giao diện điều khiển. Hãy cân nhắc mã sau đây:
int number = 7;
string text = "seven";
Console.WriteLine(number);
Console.WriteLine();
Console.WriteLine(text);
Trong ví dụ này, bạn đang gọi ba phiên bản riêng biệt quá tải của phương WriteLine()
pháp.
- Phương pháp đầu
WriteLine()
tiên sử dụng chữ ký phương pháp xác định thamint
số. - Phương pháp thứ
WriteLine()
hai sử dụng chữ ký phương thức xác định các tham số bằng không. - Phương pháp thứ
WriteLine()
ba sử dụng chữ ký phương thức xác định thamstring
số.
Trong các trường hợp khác, các phiên bản quá tải của một phương pháp xác định một số lượng tham số khác nhau. Các tham số thay thế có thể được sử dụng để cung cấp nhiều quyền kiểm soát hơn đối với kết quả mong muốn. Ví dụ, phương pháp Random.Next()
có các phiên bản quá tải cho phép bạn thiết lập các mức độ khác nhau của ràng buộc trên số được tạo ngẫu nhiên.
Bài tập sau đây gọi phương Random.Next()
pháp để tạo ra các giá trị số nguyên ngẫu nhiên với các mức ràng buộc khác nhau:
Đảm bảo rằng bạn có tệp Program.cs trống đang mở trong Mã Visual Studio.
Nếu cần, hãy mở Mã Visual Studio, rồi hoàn thành các bước sau để chuẩn bị tệp Program.cs trong Trình soạn thảo:
Trên menu Tệp , chọn Mở Thư mục.
Sử dụng hộp thoại Mở Thư mục để dẫn hướng đến, rồi mở thư mục CsharpProjects .
Trong chế độ xem Visual Studio Code EXPLORER, chọn Program.cs.
Trên menu Lựa chọn Mã Visual Studio, chọn Chọn Tất cả, rồi nhấn phím Delete.
Để kiểm tra các phiên bản quá tải của phương
Random.Next()
pháp, nhập mã sau đây:Random dice = new Random(); int roll1 = dice.Next(); int roll2 = dice.Next(101); int roll3 = dice.Next(50, 101); Console.WriteLine($"First roll: {roll1}"); Console.WriteLine($"Second roll: {roll2}"); Console.WriteLine($"Third roll: {roll3}");
Trên menu Tệp Mã Visual Studio, bấm Lưu.
Trong dạng xem EXPLORER, để mở Một Thiết bị đầu cuối tại vị trí thư mục TestProject của bạn, hãy bấm chuột phải vào TestProject, rồi chọn Mở trong Đầu cuối Tích hợp.
Đảm bảo rằng đường dẫn thư mục hiển thị trong dấu nhắc lệnh trỏ tới thư mục chứa tệp Program.cs bạn.
Tại dấu nhắc lệnh Thiết bị đầu cuối, để chạy mã của bạn, hãy dotnet chạy rồi nhấn Enter.
Lưu ý rằng kết quả của bạn tương tự như đầu ra sau đây:
First roll: 342585470 Second roll: 43 Third roll: 89
Các số được tạo ra là ngẫu nhiên, vì vậy kết quả của bạn sẽ khác nhau. Tuy nhiên, ví dụ này thể hiện phạm vi kết quả mà bạn có thể nhìn thấy.
Dành một phút để kiểm tra mã.
Phiên bản đầu tiên
Next()
của phương pháp không đặt ranh giới trên và dưới,0
2,147,483,647
vì vậy phương pháp sẽ trả về các giá trị khác nhau từ đến , là giá trị tối đa mà một phươngint
pháp có thể lưu trữ.Phiên bản thứ hai của phương
Next()
pháp xác định giá trị tối đa là ranh giới trên, vì vậy trong trường hợp này, bạn có thể mong đợi một giá trị ngẫu nhiên giữa0
và100
.Phiên bản thứ ba của phương
Next()
pháp xác định cả giá trị tối thiểu và tối đa, vì vậy trong trường hợp này, bạn có thể mong đợi một giá trị ngẫu nhiên giữa và50
100
.Đóng pa-nen Đầu cuối.
Bạn đã kiểm tra một số chủ đề trong đơn vị này. Dưới đây là danh sách nhanh những nội dung bạn đã đề cập:
- Bạn đã kiểm tra cách sử dụng giá trị trả về của phương thức (khi phương thức cung cấp giá trị trả về).
- Bạn đã kiểm tra cách một phương pháp có thể sử dụng các tham số được xác định là kiểu dữ liệu cụ thể.
- Bạn đã kiểm tra các phiên bản quá tải của một số phương pháp bao gồm các tham số khác nhau hoặc các loại tham số.
Sử dụng IntelliSense
Visual Studio Code bao gồm các tính năng IntelliSense được hỗ trợ bởi một dịch vụ ngôn ngữ. Ví dụ: dịch vụ ngôn ngữ C# cung cấp khả năng hoàn thành mã thông minh dựa trên ngữ pháp ngôn ngữ và phân tích mã nguồn của bạn. Trong phần này, bạn sẽ sử dụng IntelliSense để giúp bạn triển khai phương Random.Next()
pháp.
Vì IntelliSense được hiển thị trong trình soạn thảo mã, bạn có thể tìm hiểu nhiều về một phương pháp mà không cần rời khỏi môi trường mã hóa. IntelliSense cung cấp gợi ý và thông tin tham khảo trong cửa sổ bật lên bên dưới vị trí con trỏ khi bạn nhập mã của mình. Khi bạn nhập mã, cửa sổ bật lên IntelliSense sẽ thay đổi nội dung của mã tùy thuộc vào ngữ cảnh.
Ví dụ: dice
khi bạn nhập từ chậm, IntelliSense sẽ hiển thị tất cả các từ khóa, mã định danh C# (hoặc đúng hơn là tên biến số trong mã) và các lớp trong Thư viện Lớp .NET khớp với các chữ cái được nhập. Các tính năng tự động hoàn tất của trình soạn thảo mã có thể được sử dụng để hoàn tất việc nhập từ phù hợp nhất trong cửa sổ bật lên IntelliSense. Hãy thử xem.
Đảm bảo rằng bạn có tệp Program.cs mở trong Mã Visual Studio.
Ứng dụng của bạn phải chứa mã sau:
Random dice = new Random(); int roll1 = dice.Next(); int roll2 = dice.Next(101); int roll3 = dice.Next(50, 101); Console.WriteLine($"First roll: {roll1}"); Console.WriteLine($"Second roll: {roll2}"); Console.WriteLine($"Third roll: {roll3}");
Ở cuối tệp mã của bạn, để thử nghiệm Với IntelliSense, từ từ nhập các chữ cái
d
, saui
đóc
.Lưu ý cửa sổ bật lên IntelliSense xuất hiện khi bạn bắt đầu nhập.
Khi IntelliSense bật lên, danh sách các đề xuất sẽ xuất hiện. Vào thời điểm bạn đã nhập
dic
, mã định danhdice
sẽ nằm ở đầu danh sách.Nhấn phím Tab trên bàn phím.
Lưu ý rằng toàn bộ từ đã
dice
được hoàn tất trong trình soạn thảo. Bạn có thể sử dụng các phím mũi tên lên và xuống để thay đổi lựa chọn trước khi nhấn phím Tab.Lưu ý
Nếu cửa sổ IntelliSense biến mất,
backspace
bạn có thể chọn cửa sổ bằng cách sử dụng phím trên bàn phím, sau đó nhập lại ký hiệu cuối cùng để mở lại IntelliSense.Để xác định toán tử truy nhập thành viên, hãy nhập ký
.
tự.Lưu ý rằng cửa sổ bật lên IntelliSense
.
sẽ xuất hiện lại khi bạn nhập và hiển thị danh sách chưa được lọc tất cả các phương pháp (và các thành viên khác của lớp) có sẵn.Nhập N
Danh sách sẽ được lọc và từ đó phải
Next
là lựa chọn hàng đầu.Để tự động hoàn tất toàn bộ từ, nhấn phím Tab.
Để xác định toán tử gọi phương thức, hãy nhập (
Lưu ý rằng dấu đóng ngoặc đơn được tự động thêm vào cho bạn.
Toán tử gọi phương thức là tập hợp dấu ngoặc đơn nằm ở bên phải tên phương thức. Phần này của câu lệnh gọi là nơi bạn xác định các đối số sẽ được chuyển tới phương thức. Cần có toán tử gọi phương thức khi gọi phương thức.
Lưu ý rằng cửa sổ bật lên IntelliSense hiện hiển thị thông tin chi tiết về phương
Random.Next()
pháp.Mất một phút để kiểm tra cửa sổ bật lên IntelliSense cho phương
Random.Next()
pháp.Lưu ý
Nếu cửa sổ bật lên IntelliSense đóng trước khi bạn có cơ hội kiểm tra,
()
hãy xóa toán tử gọi , rồi nhập ( để hiển thị cửa sổ bật lên IntelliSense.Lưu ý rằng cửa sổ bật lên bao gồm ba phần, một phần ở bên trái và hai phần ở bên phải.
Ở bên phải, bạn sẽ thấy phần
int Random.Next()
trên cùng vàReturns a non-negative random integer.
trong mục dưới cùng. Xácint
định loại trả về cho phương thức. Nói cách khác, khi phiên bản này của phương pháp được thực hiện, nó sẽ trả về một giá trị loạiint
.Ở bên trái của cửa sổ bật lên IntelliSense, nó hiển thị
1/3
.Biểu
1/3
thị rằng bạn đang xem chữ ký đầu tiên trong ba phương pháp cho phươngNext()
pháp. Lưu ý rằng phiên bản này của chữ ký phương pháp cho phép các phương pháp để làm việc với không có tham số (không có đối số truyền cho các phương pháp trong câu lệnh gọi).Lưu ý rằng cũng có một mũi tên nhỏ ở trên và bên dưới
1/3
.Để kiểm tra phiên bản quá tải thứ hai của phương pháp, nhấn phím Mũi tên Xuống trên bàn phím.
Lưu ý rằng bạn có thể sử dụng các phím mũi tên lên và xuống để điều hướng giữa các phiên bản quá tải khác nhau. Khi làm như vậy,
1/3
bạn sẽ thấy ,2/3
và3/3
xuất hiện ở bên trái của cửa sổ bật lên IntelliSense và giải thích hữu ích ở bên phải.Mất một phút để kiểm tra từng phiên bản quá tải cho phương
Random.Next()
pháp.Phiên bản thứ hai quá tải của phương pháp, thông
2/3
báo cho bạn rằng các phương pháp cóNext()
thể chấp nhận một tham sốint maxValue
. Mô tả cho bạn biết đó làmaxValue
giới hạn trên độc quyền cho số mà bạn muốn phươngNext()
pháp để tạo ra. Exclusive cho biết số trả về sẽ nhỏ hơn maxValue. Vì vậy, khi bạn chỉdice.Next(1,7);
định cuộn dice tối đa sẽ là 6. Lưu ý rằng thư ở cuối mục đã được cập nhật để:Returns a non-negative random integer that is less than the specified maximum.
Phiên bản thứ ba của phương pháp, ,
3/3
thông báo cho bạn rằng phương pháp cóNext()
thể chấp nhận cả hai vàint minValue
nhưint maxValue
các tham số. Tham số mới,minValue
, là giới hạn dưới của số mà bạn muốn phươngNext()
pháp tạo. Vì giới hạn dưới bao gồm chứ không phải là độc quyền, giá trị trả về có thể bằngminValue
. Thư ở dưới cùng bây giờ cho biết:Returns a random integer that is within a specified range.
Trong trường hợp này, IntelliSense cung cấp tất cả thông tin mà bạn cần để chọn quá tải thích hợp, bao gồm giải thích chi tiết và
maxValue
minValue
. Tuy nhiên, bạn có thể gặp phải các tình huống mà bạn cần tham khảo tài liệu của phương pháp.
Sử dụng learn.microsoft.com để biết thông tin về các phương pháp quá tải
Cách thứ hai để tìm hiểu về các phiên bản quá tải của các phương pháp là để tham khảo tài liệu hướng dẫn sử dụng cho các phương pháp. Tài liệu này cũng sẽ giúp bạn hiểu chính xác mục đích của từng tham số.
Để bắt đầu, hãy mở trình duyệt Web và công cụ tìm kiếm ưa thích của bạn.
Thực hiện tìm kiếm C# Random.Next()
Tìm kiếm của bạn nên bao gồm tên lớp và tên phương thức. Bạn cũng có thể muốn đưa vào thuật ngữ để đảm
C#
bảo không vô tình nhận được kết quả cho các ngôn ngữ lập trình khác.Chọn kết quả tìm kiếm hàng đầu với URL bắt đầu bằng
https://learn.microsoft.com
.Một trong các kết quả tìm kiếm hàng đầu sẽ dẫn đến URL bắt đầu bằng
https://learn.microsoft.com
. Trong trường hợp này, tiêu đề của liên kết sẽ xuất hiện dưới dạngRandom.Next Method
.Đây là liên kết trong trường hợp bạn gặp sự cố khi tìm bằng công cụ tìm kiếm:
Mở liên kết cho C# Random.Next().
Quét nhanh qua tài liệu.
Cuộn xuống qua nội dung trang để xem các mẫu mã khác nhau. Lưu ý rằng bạn có thể chạy các mẫu trong cửa sổ trình duyệt.
Tài learn.microsoft.com này tuân theo định dạng chuẩn cho mỗi lớp và phương pháp trong Thư viện Lớp .NET.
Gần phía trên cùng của trang web, định vị phần có nhãn Quá tải.
Lưu ý rằng có ba phiên bản quá tải của phương pháp được liệt kê. Mỗi phiên bản quá tải được liệt kê bao gồm một siêu kết nối đến một vị trí nằm sâu hơn trên trang.
Để dẫn hướng "trên trang" đến mô tả về phiên bản bị quá tải thứ hai, hãy chọn Tiếp theo(Int32).
Tài liệu cho mỗi phiên bản của phương pháp bao gồm:
- Mô tả ngắn gọn về chức năng của phương pháp
- Định nghĩa của phương pháp
- Các tham số mà phương pháp chấp nhận
- Trả về giá trị
- Các ngoại lệ có thể được nêu ra
- Ví dụ về phương pháp đang được sử dụng
- Nhận xét khác về phương pháp
Dành một phút để xem lại phần Tham số.
Trong phần Tham số, bạn có thể đọc rằng tham số
maxValue
là "giới hạn trên độc quyền của số ngẫu nhiên sẽ được tạo." Giới hạn trên riêng có nghĩa là nếu bạn muốn các số không lớn hơn10
, bạn phải chuyển vào giá trị11
.Bạn cũng có thể đọc trong dòng tiếp theo: "
maxValue
phải lớn hơn hoặc bằng 0." Điều gì sẽ xảy ra nếu bạn bỏ qua điều khoản này? Bạn có thể thấy trong phần Ngoại lệ mà phương pháp sẽ trả về khiArgumentOutOfRangeException
maxValue
nhỏ hơn 0.Lưu ý
Nội dung tại learn.microsoft.com là "nguồn gốc của sự thật" cho Thư viện Lớp .NET. Điều quan trọng là phải dành thời gian để đọc tài liệu để hiểu cách một phương pháp nhất định sẽ hoạt động.
Tóm tắt
- Phương pháp có thể không chấp nhận tham số hoặc nhiều tham số, tùy thuộc vào cách chúng được thiết kế và triển khai. Khi đi qua nhiều tham số, hãy phân tách chúng bằng một ký
,
hiệu. - Các phương pháp có thể trả về giá trị khi hoàn thành nhiệm vụ hoặc có thể không trả về giá trị nào (không có giá trị).
- Các phương pháp quá tải hỗ trợ việc triển khai nhiều phương pháp, mỗi phương pháp có một chữ ký phương pháp duy nhất (số lượng tham số và kiểu dữ liệu của mỗi tham số).
- IntelliSense có thể giúp viết mã nhanh hơn. Nó cung cấp một tham chiếu nhanh đến các phương pháp, giá trị trả lại của chúng, các phiên bản quá tải và các loại tham số của chúng.
- learn.microsoft.com là "nguồn gốc của sự thật" khi bạn muốn tìm hiểu làm thế nào phương pháp trong thư viện lớp học .NET làm việc.