C# 方法,屬性,字段


以前是學C++的,初次學微軟的C#頭都大了。什么字段,常量,屬性,方法......微軟把別人的東西拿來糅合在C#里,弄成了一個“大雜燴”。其實,說到底,“字段”不就是“變量”嗎,所謂的“方法”不就是“函數”嗎,故弄玄虛!從MSDN上弄來了詳細的介紹,看下面:

字段

“字段”是直接在結構中聲明的任何類型的變量。 字段是其包含類型的“成員”。

類或結構可以擁有實例字段或靜態字段,或同時擁有兩者。 實例字段特定於類型的實例。 如果您擁有類 T 和實例字段 F,可以創建類型 T 的兩個對象,並修改每個對象中 F 的值,這不影響另一對象中的該值。 相比之下,靜態字段屬於類本身,在該類的所有實例中共享。 從實例 A 所做的更改將立刻呈現在實例 B 和 C 上(如果它們訪問該字段)。

通常應僅為具有私有或受保護可訪問性的變量使用字段。 您的類向客戶端代碼公開的數據應通過方法屬性索引器提供。 通過使用這些構造間接訪問內部字段,可以針對無效的輸入值提供防護。 存儲由公共屬性公開的數據的私有字段稱為“后備存儲”或“支持字段”。

字段通常存儲這樣的數據:該數據必須可供多個類方法訪問,並且其存儲期必須長於任何單個方法的生存期。 例如,表示日歷日期的類可能有三個整數字段:一個表示月份,一個表示日期,還有一個表示年份。 不在單個方法范圍外部使用的變量應在方法體自身范圍內聲明為局部變量。

在類塊中通過指定字段的訪問級別,然后指定字段的類型,再指定字段的名稱來聲明這些字段。 例如:

復制代碼
 1 public class CalendarEntry
 2 {
 3     // private field
 4     private DateTime date;
 5 
 6     // public field (Generally not recommended.)
 7     public string day;
 8 
 9     // Public property exposes date field safely.
10     public DateTime Date 
11     {
12         get 
13         {
14             return date;
15         }
16         set 
17         {
18             // Set some reasonable boundaries for likely birth dates.
19             if (value.Year > 1900 && value.Year <= DateTime.Today.Year)
20             {
21                 date = value;
22             }
23             else
24                 throw new ArgumentOutOfRangeException();
25         }
26 
27     }
28 
29     // Public method also exposes date field safely.
30     // Example call: birthday.SetDate("1975, 6, 30");
31     public void SetDate(string dateString)
32     {
33         DateTime dt = Convert.ToDateTime(dateString);
34 
35         // Set some reasonable boundaries for likely birth dates.
36         if (dt.Year > 1900 && dt.Year <= DateTime.Today.Year)
37         {
38             date = dt;
39         }
40         else
41             throw new ArgumentOutOfRangeException();
42     }
43 
44     public TimeSpan GetTimeSpan(string dateString)
45     {
46         DateTime dt = Convert.ToDateTime(dateString);
47 
48         if (dt != null && dt.Ticks < date.Ticks)
49         {
50             return date - dt;
51         }
52         else
53             throw new ArgumentOutOfRangeException();  
54 
55     }
56 }
復制代碼

若要訪問對象中的字段,請在對象名稱后面添加一個句點,然后添加該字段的名稱,比如 objectname.fieldname。 例如:

1 CalendarEntry birthday = new CalendarEntry();
2 birthday.day = "Saturday";

聲明字段時可以使用賦值運算符為字段指定一個初始值。 例如,若要自動將 "Monday" 賦給 day 字段,需要聲明 day,如下例所示:

public class CalendarDateWithInitialization
{
    public string day = "Monday";
    //...
}

字段的初始化緊靠調用對象實例的構造函數之前。 如果構造函數為字段賦值,則該值將覆蓋字段聲明期間給出的任何值。

字段可標記為 publicprivateprotectedinternal 或 protected internal。 這些訪問修飾符定義類的使用者訪問字段的方式。 有關更多信息,請參見 訪問修飾符(C# 編程指南)

可以選擇將字段聲明為 static。 這使得調用方在任何時候都能使用字段,即使類沒有任何實例。 有關更多信息,請參見 靜態類和靜態類成員(C# 編程指南)

可以將字段聲明為 readonly。 只讀字段只能在初始化期間或在構造函數中賦值。 static readonly 字段非常類似於常數,只不過 C# 編譯器不能在編譯時訪問靜態只讀字段的值,而只能在運行時訪問。 有關更多信息,請參見 常量(C# 編程指南)

常量:

常量是在編譯時已知並在程序的生存期內不發生更改的不可變值。 常量使用 const 修飾符進行聲明。 只有 C# 內置類型(System.Object 除外)可以聲明為 const。 有關內置類型的列表,請參見內置類型表(C# 參考)。 用戶定義的類型(包括類、結構和數組)不能為 const。 請使用 readonly 修飾符創建在運行時初始化一次即不可再更改的類、結構或數組。

C# 不支持 const 方法、屬性或事件。

可以使用枚舉類型為整數內置類型(例如 int、uint、long 等等)定義命名常量。 有關更多信息,請參見 enum(C# 參考)

常量必須在聲明時初始化。 例如:

1 class Calendar1
2 {
3     public const int months = 12;
4 }

在此示例中,常量 months 始終為 12,不可更改,即使是該類自身也不能更改它。 實際上,當編譯器遇到 C# 源代碼(例如 months)中的常量修飾符時,將直接把文本值替換到它生成的中間語言 (IL) 代碼中。 因為在運行時沒有與常量關聯的變量地址,所以 const 字段不能通過引用傳遞,並且不能在表達式中作為左值出現。

可以同時聲明多個相同類型的常量,例如:

class Calendar2
{
    const int months = 12, weeks = 52, days = 365;
}

如果不會造成循環引用,用於初始化一個常量的表達式可以引用另一個常量。 例如:

復制代碼
1 class Calendar3
2 {
3     const int months = 12;
4     const int weeks = 52;
5     const int days = 365;
6 
7     const double daysPerWeek = (double) days / (double) weeks;
8     const double daysPerMonth = (double) days / (double) months;
9 }
復制代碼

常量可標記為 publicprivateprotectedinternal 或 protectedinternal。 這些訪問修飾符定義類的用戶訪問該常量的方式。 有關更多信息,請參見 訪問修飾符(C# 編程指南)

因為常量值對該類型的所有實例是相同的,所以常量被當作 static 字段一樣訪問。 不使用 static 關鍵字聲明常量。 未包含在定義常量的類中的表達式必須使用類名、一個句點和常量名來訪問該常量。 例如:

int birthstones = Calendar.months;

屬性:

屬性是這樣的成員:它提供靈活的機制來讀取、編寫或計算某個私有字段的值。 可以像使用公共數據成員一樣使用屬性,但實際上它們是稱作“訪問器”的特殊方法。 這使得可以輕松訪問數據,此外還有助於提高方法的安全性和靈活性。

在本示例中,TimePeriod 類存儲一個時間段。 在內部,類以秒為單位存儲時間,但客戶端使用名為 Hours 的屬性能夠以小時為單位指定時間。 Hours 屬性的訪問器執行小時和秒之間的轉換。

復制代碼
 1 class TimePeriod
 2 {
 3     private double seconds;
 4 
 5     public double Hours
 6     {
 7         get { return seconds / 3600; }
 8         set { seconds = value * 3600; }
 9     }
10 }
11 
12 
13 class Program
14 {
15     static void Main()
16     {
17         TimePeriod t = new TimePeriod();
18 
19         // Assigning the Hours property causes the 'set' accessor to be called.
20         t.Hours = 24;
21 
22         // Evaluating the Hours property causes the 'get' accessor to be called.
23         System.Console.WriteLine("Time in hours: " + t.Hours);
24     }
25 }
26 // Output: Time in hours: 24
復制代碼
  • 屬性使類能夠以一種公開的方法獲取和設置值,同時隱藏實現或驗證代碼。

  • get 屬性訪問器用於返回屬性值,而 set 訪問器用於分配新值。 這些訪問器可以有不同的訪問級別。 有關更多信息,請參見 限制訪問器可訪問性(C# 編程指南)

  • value 關鍵字用於定義由 set 取值函數分配的值。

  • 不實現 set 取值函數的屬性是只讀的。

  • 對於不需要任何自定義訪問器代碼的簡單屬性,可考慮選擇使用自動實現的屬性。 有關更多信息,請參見自動實現的屬性(C# 編程指南)

方法:

“方法”是包含一系列語句的代碼塊。 程序通過“調用”方法並指定所需的任何方法參數來執行語句。 在 C# 中,每個執行指令都是在方法的上下文中執行的。 Main 方法是每個 C# 應用程序的入口點,在啟動程序時由公共語言運行時 (CLR) 調用。

 

通過指定方法的訪問級別(例如 public 或 private)、可選修飾符(例如 abstract 或 sealed)、返回值、名稱和任何方法參數,可以在結構中聲明方法。 這些部分統稱為方法的“簽名”。

方法參數括在括號中,並用逗號隔開。 空括號表示方法不需要參數。 下面的類包含三個方法:

復制代碼
 1 abstract class Motorcycle
 2 {
 3     // Anyone can call this.
 4     public void StartEngine() {/* Method statements here */ }
 5 
 6     // Only derived classes can call this.
 7     protected void AddGas(int gallons) { /* Method statements here */ }
 8 
 9     // Derived classes can override the base class implementation.
10     public virtual int Drive(int miles, int speed) { /* Method statements here */ return 1; }
11 
12     // Derived classes must implement this.
13     public abstract double GetTopSpeed(); 
14 }
復制代碼

在對象上調用方法類似於訪問字段。 在對象名稱之后,依次添加句點、方法名稱和括號。 參數在括號內列出,並用逗號隔開。 因此,可以按以下示例中的方式調用 Motorcycle類的方法:

復制代碼
 1 class TestMotorcycle : Motorcycle
 2 {
 3 
 4     public override double GetTopSpeed()
 5     {
 6         return 108.4;
 7     }
 8 
 9     static void Main()
10     {
11 
12         TestMotorcycle moto = new TestMotorcycle();
13 
14         moto.StartEngine();
15         moto.AddGas(15);
16         moto.Drive(5, 20);
17         double speed = moto.GetTopSpeed();
18         Console.WriteLine("My top speed is {0}", speed);            
19     }
20 }
復制代碼

 

方法定義指定所需任何“形參”的名稱和類型。 調用代碼在調用方法時,將為每個形參提供稱為“實參”的具體值。 實參必須與形參類型兼容,但調用代碼中使用的實參名稱(如果有)不必與方法中定義的形參名稱相同。 例如:

復制代碼
 1 public void Caller()
 2 {
 3     int numA = 4;
 4     // Call with an int variable.
 5     int productA = Square(numA);
 6 
 7     int numB = 32;
 8     // Call with another int variable.
 9     int productB = Square(numB);
10 
11     // Call with an integer literal.
12     int productC = Square(12);
13 
14     // Call with an expression that evaulates to int.
15     productC = Square(productA * 3);
16 }
17 
18 int Square(int i)
19 {
20     // Store input argument in a local variable.
21     int input = i;
22     return input * input;
23 }
復制代碼

默認情況下,將值類型傳遞給方法時,傳遞的是副本而不是對象本身。 因此,對參數所做的更改對於調用方法中的原始副本沒有影響。 可以使用 ref 關鍵字通過引用傳遞值類型。 有關更多信息,請參見傳遞值類型參數(C# 編程指南)。 有關內置值類型的列表,請參見值類型表(C# 參考)

當引用類型的對象傳遞給方法時,對對象的引用傳遞。 即方法接收不是對象,還指示對象的位置的參數。 如果更改對象的成員通過使用該引用,更改反映在被調用的方法的參數,因此,即使通過對象的值。

如下面的示例所示,通過使用 class 關鍵字,則創建一個引用類型。

public class SampleRefType
{
    public int value;
}

現在,因此,如果您通過根據方法的此類型的對象,對對象的引用傳遞。 下面的示例通過類型 SampleRefType 對象傳遞給方法 ModifyObject。

復制代碼
 1 public static void TestRefType()
 2 {
 3     SampleRefType rt = new SampleRefType();
 4     rt.value = 44;
 5     ModifyObject(rt);
 6     Console.WriteLine(rt.value);
 7 }
 8 static void ModifyObject(SampleRefType obj)
 9 {
10     obj.value = 33;
11 }
復制代碼

該示例實質上執行操作與前例同樣因為它通過值傳遞實參傳遞給方法。 但,使用引用類型,則結果是不同的。 在對該參數進行 value 字段的 ModifyObject 做的修改,obj,也會更改參數,rt的 value 字段,在 TestRefType 方法。 TestRefType 方法顯示 33 作為輸出。

方法可以向調用方返回值。 如果返回類型(方法名稱前列出的類型)不是 void,則方法可以使用 return 關鍵字來返回值。 如果語句中 return 關鍵字的后面是與返回類型匹配的值,則該語句將該值返回給方法調用方。 return 關鍵字還會停止方法的執行。 如果返回類型為 void,則可使用沒有值的 return 語句來停止方法的執行。 如果沒有return 關鍵字,方法執行到代碼塊末尾時即會停止。 具有非 void 返回類型的方法才能使用 return 關鍵字返回值。 例如,下面的兩個方法使用 return 關鍵字來返回整數:

復制代碼
 1 class SimpleMath
 2 {
 3     public int AddTwoNumbers(int number1, int number2)
 4     {
 5         return number1 + number2;
 6     }
 7 
 8     public int SquareANumber(int number)
 9     {
10         return number * number;
11     }
12 }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM