Bài tập - Khối mã và phạm vi biến đổi
- 11 phút
Khối mã là một hoặc nhiều câu lệnh C# xác định đường dẫn thực thi. Các câu lệnh bên ngoài khối mã ảnh hưởng đến thời điểm, nếu và tần suất khối mã đó được thực thi vào thời gian chạy. Ranh giới của một khối mã thường được xác định bởi dấu ngoặc nhọn, {}.
Ngoài ảnh hưởng của chúng đến đường dẫn thực thi, khối mã cũng có thể ảnh hưởng đến phạm vi biến của bạn. Các mẫu mã mà bạn kiểm tra trong bài tập này sẽ giúp bạn hiểu được mối quan hệ giữa các khối mã và phạm vi biến.
Khối mã ảnh hưởng đến phạm vi khai báo biến đổi
Phạm vi biến tham chiếu đến khả năng hiển thị của biến đến mã khác trong ứng dụng của bạn. Biến phạm vi cục bộ chỉ có thể truy nhập được bên trong khối mã mà biến đó được xác định. Nếu bạn tìm cách truy nhập biến bên ngoài khối mã, bạn sẽ gặp lỗi trình biên dịch.
Phần còn lại của đơn vị này khám phá mối quan hệ giữa các khối mã và phạm vi biến.
Chuẩn bị môi trường mã hóa của bạn
Mô-đun này bao gồm các hoạt động thực hành hướng dẫn bạn qua quy trình xây dựng và chạy mã minh họa. Bạn được khuyến khích hoàn thành các hoạt động này bằng cách sử dụng Visual Studio Code làm môi trường phát triển của mình. Sử dụng Visual Studio Code cho các hoạt động này sẽ giúp bạn viết và chạy mã thoải mái hơn trong môi trường nhà phát triển được các chuyên gia trên toàn thế giới sử dụng.
Mở Mã Visual Studio.
Bạn có thể sử dụng menu Bắt đầu của Windows (hoặc tài nguyên tương đương cho một HĐH khác) để mở Mã Visual Studio.
Trên menu Mã Visual Studio tệp, chọn mở thư mục.
Trong hộp thoại mở thư, dẫn hướng đến thư mục Trên máy tính chạy Windows.
Nếu bạn có một vị trí thư mục khác nơi bạn giữ các dự án mã, bạn có thể sử dụng vị trí thư mục đó để thay thế. Đối với khóa đào tạo này, điều quan trọng là phải có một vị trí dễ tìm và ghi nhớ.
Trong hộp Mở Thư mục, hãy chọn Chọn Thư mục.
Nếu bạn thấy một hộp thoại bảo mật hỏi xem bạn có tin cậy tác giả hay không, hãy chọn Có.
Trên menu Thiết bị đầu cuối Visual Studio, hãy chọn thiết bị đầu cuối.
Lưu ý rằng dấu nhắc lệnh trong pa-nen Đầu cuối sẽ hiển thị đường dẫn thư mục cho thư mục hiện tại. Chẳng hạn:
C:\Users\someuser\Desktop>Ghi
Nếu bạn đang làm việc trên PC của riêng mình chứ không phải trong một hộp cát hoặc môi trường được lưu trữ và bạn đã hoàn thành các mô-đun Microsoft Learn khác trong chuỗi C# này, bạn có thể đã tạo một thư mục dự án cho các mẫu mã. Nếu vậy, bạn có thể bỏ qua bước tiếp theo, được sử dụng để tạo ứng dụng bảng điều khiển trong thư mục TestProject.
Tại dấu nhắc lệnh Thiết bị đầu cuối, để tạo ứng dụng bảng điều khiển mới trong thư mục được chỉ định, hãy nhập lời nhắc sau:
dotnet new console -o ./CsharpProjects/TestProjectLệnh .NET CLI này sử dụng mẫu chương trình .NET để tạo dự án ứng dụng bảng điều khiển C# mới trong vị trí thư mục được chỉ định. Lệnh này tạo ra các thư mục CsharpProjects và TestProject cho bạn và sử dụng TestProject làm tên tệp của
.csprojbạn.Nếu một thông báo hiển thị cho bạn biết rằng các tệp đã tồn tại, hãy tiếp tục với các bước tiếp theo. Bạn sẽ sử dụng lại các tệp dự án hiện có.
Trong dạng xem EXPLORER, hãy bung rộng thư mục CsharpProjects .
Bạn sẽ thấy thư mục TestProject và hai tệp, một tệp chương trình C# có tên Program.cs và tệp dự án C# có tên là TestProject.csproj.
Trên menu Mã Visual Studio tệp, chọn mở thư mục.
Trong hộp thoại Mở Thư mục, chọn thư mục CsharpProjects , rồi chọn Chọn Thư mục.
Trong dạng xem EXPLORER, mở rộng thư mục TestProject, rồi chọn Program.cs.
Xóa bỏ các dòng mã hiện có.
Bạn sẽ sử dụng dự án bảng điều khiển C# này để tạo, xây dựng và chạy mẫu mã trong mô-đun này.
Đóng pa-nen Đầu cuối.
Tạo biến bên trong một khối mã
Bạn sẽ bắt đầu bằng cách nhìn vào trường hợp khi một biến được khởi tạo bên trong một khối mã.
Đảm bảo rằng bạn đã mở Mã Visual Studio và Program.cs hiển thị trong ngăn Trình soạn thảo.
Ghi
Program.cs phải trống. Nếu không, hãy chọn và xóa tất cả các dòng mã.
Nhập mã sau vào Trình soạn thảo Mã Visual Studio:
bool flag = true; if (flag) { int value = 10; Console.WriteLine($"Inside the code block: {value}"); }Trên menu Cài đặt Mã Visual Studio tệp, chọn Lưu tệp.
Tệp Program.cs phải được lưu trước khi xây dựng hoặc chạy mã.
Trong pa nen 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, sau đó chọn Mở trong Thiết bị đầu cuối tích hợp.
Pa-nen Đầu cuối sẽ mở ra. Thiết bị đầu cuối nên bao gồm một dấu nhắc lệnh cho thấy rằng thiết bị đầu cuối được mở vào vị trí thư mục TestProject của 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.
Ghi
Nếu bạn thấy thông báo cho biết "Không thể tìm thấy dự án để chạy", hãy đảm bảo rằng dấu nhắc lệnh Thiết bị đầu cuối hiển thị vị trí thư mục TestProject dự kiến. Ví dụ:
C:\Users\someuser\Desktop\csharpprojects\TestProject>Bạn sẽ thấy đầu ra sau đây:
Inside the code block: 10
Đây là kết quả mong đợi. Nhưng nếu bạn muốn truy cập các biến bên ngoài value khối mã if tuyên bố?
Cố gắng truy nhập một biến bên ngoài khối mã trong đó nó được khai báo
Trong Trình soạn thảo Mã Visual Studio, hãy tạo một dòng mã mới bên dưới khối
ifmã tuyên bố.Trên dòng mã trống bạn đã tạo, hãy thêm dòng mã sau đây:
Console.WriteLine($"Outside the code block: {value}");Xác minh rằng mã đã cập nhật của bạn trông giống như sau:
bool flag = true; if (flag) { int value = 10; Console.WriteLine($"Inside the code block: {value}"); } Console.WriteLine($"Outside the code block: {value}");Lưu tệp mã của bạn, sau đó sử dụng Mã Visual Studio để chạy mã của bạn.
Nhập
dotnet runtừ dấu nhắc lệnh Thiết bị đầu cuối để chạy mã của bạn.Lưu ý rằng khi bạn cố gắng chạy ứng dụng, bạn gặp lỗi biên soạn:
Program.cs(7,46): error CS0103: The name 'value' does not exist in the current context
Phần Program.cs(7,46) thông báo cho bạn biết rằng lỗi được liên kết với dòng 7 trong tệp Program.cs, cột 46.
Lỗi này được tạo ra vì một biến được khai báo bên trong một khối mã chỉ có thể truy cập được (chỉ có thể nhìn thấy) trong khối mã đó. Vì một biến không thể được truy cập bên ngoài khối mã trong đó nó được khai báo, value không thể được truy cập từ dòng 7 của mã của bạn.
Biến được khai báo trong khối mã phương thức được gọi là biến số cục bộ. Bạn có thể thấy thuật ngữ biến cục bộ được sử dụng khi xem lại các bài viết thảo luận về phạm vi biến đổi.
Di chuyển khai báo biến số lên trên khối mã
Để truy cập một biến cả bên trong và bên ngoài của một khối mã, bạn sẽ cần phải khai báo các biến trước khi (ở trên) các khối mã để các mã bên ngoài khối mã có thể "nhìn thấy" biến.
Cập nhật mã của bạn trong Trình soạn thảo Mã Visual Studio như sau:
bool flag = true; int value; if (flag) { Console.WriteLine($"Inside the code block: {value}"); } value = 10; Console.WriteLine($"Outside the code block: {value}");Dành một phút để xem lại các bản cập nhật.
Lưu ý rằng
valuebây giờ được khai báo (nhưng không được khởi tạo) bên ngoàiifkhối mã.Sử dụng Mã Visual Studio để lưu các bản cập nhật, sau đó chạy mã của bạn.
Lưu ý rằng bạn vẫn gặp lỗi biên soạn.
Lần này, khi bạn tìm cách chạy ứng dụng, bạn gặp lỗi biên dịch sau:
Program.cs(6,49): error CS0165: Use of unassigned local variable 'value'Lỗi này liên quan đến dòng 6 bên trong
valuekhối mã vì chưa khởi tạo (chưa được gán giá trị). Nếu dòng mã được đặtvalue = 10;ở trên khối mãiftuyên bố, các ứng dụng sẽ biên dịch một cách chính xác và tất cả mọi thứ sẽ được tốt. Tuy nhiên,valuevì chưa được khởi tạo nên không thể truy nhập nó bên trong khối mã.Đảm bảo rằng các biến số của bạn được khởi tạo trước khi tìm cách truy nhập chúng sẽ giải quyết được vấn đề này.
Khởi tạo biến số như một phần của khai báo biến số
Để khởi tạo như
valuemột phần của khai báo biến số, hãy cập nhật mã của bạn như sau:bool flag = true; int value = 0; if (flag) { Console.WriteLine($"Inside the code block: {value}"); } value = 10; Console.WriteLine($"Outside the code block: {value}");Mã này khắc phục lỗi biên dịch "unassigned local variable" bằng cách khởi tạo như
valuelà một phần của khai báo biến của bạn.Sử dụng Mã Visual Studio để lưu và chạy mã của bạn.
Lưu ý rằng bây giờ, khi bạn chạy ứng dụng, bạn sẽ thấy đầu ra sau đây:
Inside the code block: 0 Outside the code block: 10
Kiểm tra diễn giải của trình biên dịch mã của bạn
Để giúp bạn tránh lỗi thời gian chạy, trình biên dịch C# phân tích mã của bạn trong Trình soạn thảo Mã Visual Studio và trong quá trình xây dựng. Tuy nhiên, trình biên dịch có thể không phải lúc nào cũng giải thích mã của bạn theo cùng một cách mà bạn làm.
Hãy cân nhắc hai mẫu mã sau đây có vẻ phục vụ cùng một mục đích:
// Code sample 1
bool flag = true;
int value;
if (flag)
{
value = 10;
Console.WriteLine($"Inside the code block: {value}");
}
Console.WriteLine($"Outside the code block: {value}");
// Code sample 2
int value;
if (true)
{
value = 10;
Console.WriteLine($"Inside the code block: {value}");
}
Console.WriteLine($"Outside the code block: {value}");
Bạn có thể cảm thấy rằng hai mẫu này phải luôn tạo ra cùng một kết quả, nhưng trình biên dịch C# sẽ diễn giải hai mẫu mã này theo cách khác nhau.
Đối với mẫu mã đầu tiên, trình biên dịch flag diễn giải như một biến Boolean có thể được gán giá trị là một hoặc truefalse . Trình biên dịch kết luận rằng nếu là flagfalse, value sẽ không được khởi tạo khi thực thi Console.WriteLine() lần thứ hai. Về cơ bản, trình biên dịch sẽ xem xét hai đường dẫn thực thi mã sau đây để có thể:
// path when flag = true
int value;
value = 10;
Console.WriteLine($"Inside the code block: {value}");
Console.WriteLine($"Outside the code block: {value}");
VÀ
// path when flag = false
int value;
Console.WriteLine($"Outside the code block: {value}");
Kể từ khi trình biên dịch xem xét các đường dẫn thứ hai một khả năng (cho mã mẫu 1), nó tạo ra một thông báo lỗi trong quá trình xây dựng. Ngoài ra, Trình soạn thảo mã trong Visual Studio Code value cảnh báo bạn về sự cố này bằng cách hiển thị đường gợn sóng màu đỏ bên dưới (bên dưới khối mã).
Đối với mẫu mã thứ hai, trình if biên dịch kết luận rằng nội dung của khối mã lệnh sẽ luôn được thực thi (true luôn luôn true). Trình biên dịch không tạo ra lỗi bản dựng vì trình biên dịch diễn giải mẫu mã thứ hai để có một đường dẫn thực thi duy nhất như sau:
int value;
value = 10;
Console.WriteLine($"Inside the code block: {value}");
Console.WriteLine($"Outside the code block: {value}");
Tóm tắt
Dưới đây là một số điều quan trọng cần nhớ về khối mã:
- Khi bạn khai báo một biến bên trong một khối mã, khả năng hiển thị của nó là cục bộ để khối mã đó và rằng biến không thể được truy cập bên ngoài khối mã.
- Để đảm bảo rằng một biến được hiển thị cả bên trong và bên ngoài của một khối mã, bạn phải khai báo các biến trước khi khối mã (bên ngoài và trên khối mã).
- Hãy đảm bảo rằng các biến được khởi tạo trước khi mã của bạn tìm cách truy nhập chúng (đối với tất cả các đường dẫn thực thi mã tiềm năng).