This article is currently in the process of being translated into Vietnamese (~99% done).
Fields
Một trong những thành phần cơ bản nhất của một lớp trong C# là một field. Nó giống như một biến mà chúng ta đã nói đến trước đây, nhưng được định nghĩa ở mức độ lớp thay vì mức độ phương thức. Sự khác biệt này rất quan trọng và nó liên quan đến khái niệm phạm vi (scope), quyết định nơi mà một biến có thể được truy cập: Một biến cục bộ (được định nghĩa bên trong một phương thức) chỉ có thể được truy cập từ phương thức cụ thể đó, trong khi một field của lớp có thể được truy cập từ tất cả các phương thức của lớp và thậm chí từ các phương thức trong các lớp khác nếu khả năng hiển thị cho phép.
Nói cách khác, sự khác biệt giữa một biến và một field chủ yếu nằm ở chỗ nó được khai báo. Một biến ở mức lớp được gọi là field, trong khi một biến ở mức phương thức thường chỉ được gọi là biến.
Các field thường được khai báo gần đầu của lớp và tính khả kiến của chúng thường được đặt là private (chúng ta sẽ thảo luận về tính khả kiến sau trong chương này). Nó có thể trông như thế này:
public class FieldsSample
{
private string name;
....
Chúng ta hiện có một biến cấp lớp gọi là "name", có thể được truy cập từ tất cả các phương thức của lớp này. Nó không thể được truy cập từ bên ngoài lớp, chỉ vì chúng ta đã đánh dấu nó là private. Bạn có thể khai báo các field của mình là protected nếu bạn muốn truy cập chúng từ các lớp dẫn xuất hoặc thậm chí là public nếu bạn muốn truy cập chúng từ bất kỳ đâu, nhưng hãy nhớ rằng cách khuyến nghị để truy cập các field từ bên ngoài một lớp là thông qua các thuộc tính (properties), mà chúng ta sẽ thảo luận trong bài viết tiếp theo.
Trong ví dụ trên, biến "name" của chúng ta không có giá trị khởi tạo, nghĩa là bạn sẽ phải gán một giá trị cho nó trước khi có thể sử dụng. Nếu bạn đã biết giá trị ban đầu của field nên là gì, bạn có thể dễ dàng gán giá trị đó đồng thời với việc khai báo nó:
public class FieldsSample
{
private string name = "John Doe";
....
Ngoài ra, bạn có thể gán giá trị cho một field trong constructor của lớp. Điều này sẽ ghi đè bất kỳ giá trị nào đã được gán cho field tại điểm khai báo và sẽ cho phép bạn gán các giá trị động.
Như chúng ta đã nói trước đây, các thành viên của một lớp có thể được truy cập bằng cách sử dụng ký hiệu chấm, như "class.member". Tuy nhiên, khi chúng ta truy cập một thành viên của lớp hiện tại, chúng ta sử dụng từ khóa "this", như "this.member". Dưới đây là một ví dụ hoàn chỉnh hơn, trong đó chúng ta khai báo một vài field và sử dụng chúng trong một phương thức:
public class Fields1
{
private string name = "John Doe";
private int age = 42;
public void Describe()
{
string description = this.name + " is " + this.age + " years old...";
Console.WriteLine(description);
}
}
Trong phương thức Describe() (và đừng lo, chúng ta sẽ đến với các phương thức trong một bài viết sắp tới), chúng ta khai báo một biến cục bộ gọi là "description", với một giá trị dựa trên hai field đã khai báo của chúng ta. Biến "description" là một ví dụ tuyệt vời về một biến mà nên luôn luôn là biến và không bao giờ là field: Nó là tạm thời và chỉ liên quan đến phương thức sử dụng nó, trong khi các field có thể dễ dàng liên quan trong các phương thức khác của lớp.
Summary
Fields hoạt động hơi giống các biến toàn cục vì chúng có thể được sử dụng để lưu trữ dữ liệu và sau đó có thể được truy cập từ bất kỳ đâu bên trong lớp. Chúng cũng có thể được truy cập từ bên ngoài lớp khai báo, nhưng thông thường, các thuộc tính (properties) được sử dụng cho mục đích này. Chúng ta sẽ nói về các thuộc tính trong bài viết tiếp theo.