TOC

This article is currently in the process of being translated into Chinese (~90% done).

类 :

Fields

一個類別的其中一個最重要的部分就是欄位,它就像是變數,但是是被定義在一個類別而不是方法裡。這個差別是很重要的,因為它與存取範圍的概念密不可分,存取範圍指的就是一個變數可以被存取的範圍。一個本地變數,也就是宣告在方法裡的變數,只能在那一個方法裡被存取,但是一個欄位可以在所有方法裡被存取,甚至是其他類別裡的方法,前提是它的存取修飾詞允許這件事。

換句話說,欄位與變數的差別主要在它們被宣告的位置。一個在類別裡宣告的變數被稱作欄位,而在方法裡宣告的變數通常就只叫做變數。

欄位通常被定義在類別的上方,並且把其存取修飾詞設定為private(存取修飾詞將會在此章節的後面說明)。它看起來就像這樣:

public class FieldsSample
{
	private string name;
	....

我們現在就有了一個名叫name的欄位,並且它可以被在FieldsSample裡的所有方法存取,但是不能被在FieldsSample以外的方法存取,這是因為我們把它設定成了private。如果你想要name也可以被FieldsSample的衍生類別存取,你可以把它設定為protected,或者你想要讓所有類別都可以存取它,你可以把它設定成public,但是並不建議這麼做,因為如果你想要在一個類別以外的地方存取一個欄位,比較好的方法是使用屬性,而這會在下一個章節被探討。

在上面的範例中,name並沒有初始值,所以你在使用它前必須要先給它一個值。如果你已經知道你的欄位應該要有怎麼樣的初始值,你可以在宣告的同時順便指定給它。

public class FieldsSample
{
	private string name = "John Doe";
	....

除此之外,你也可以用建構子來給欄位初始值,在建構子裡指定的值會覆蓋在宣告時指定的值,並且允許你指定給它一個非固定的值。

就像之前提到過的,你可以使用點來存取一個類別的成員,像是class.member。但是如果你目前就處於某個成員所屬的類別裡的時候,只要寫出成員的名字就好了。如果出現有歧義的現象時,例如當某個方法的參數的名字與某個成員的名字一樣時,你也可以在成員名字的前面加上this來消歧義,如果沒有歧義時,this就是可省略的,如下面的例子:(注意在這個例子中,this都是可省略的)

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);
	}
}

在Describe()方法中(方法是什麼將會在之後的章節介紹),我們宣告了一個叫做description的本地變數,而其值取決於另外兩個欄位。這個例子很好的說明了變數和欄位差在哪裡,一個變數只能在它被宣告的方法裡使用,所以它只與某個方法要做的事情有關,而欄位則是可以被多個方法存取,所以它可以與很多方法要做的事情有關。

總結

欄位有一點像全域變數,因為它可以在一個類別裡的任何一個地方被存取。雖然欄位也可以被除了它屬於的那個類別以外的類別存取,但是通常我們會使用屬性來做到這件事,而屬性會在下個章節被探討。


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!