目錄
一、注釋
1. 單行注釋
2. 多行注釋
3. XML文檔注釋
4. 使用建議和最佳實踐:
二、訪問修飾符
1. public
2. private
3. protected
4. internal
5. protected internal 或 protected and internal
6. private protected 或 private and protected
7. 使用場景
三、標識符
1. 命名規則
2. 命名約定
3. 關鍵字和保留字
4. 使用@符號
5. 最佳實踐
四、關鍵字
1. 訪問修飾符
2. 類型關鍵字
3. 方法修飾符
4. 屬性修飾符
5. 字段修飾符
6. 聲明變量和類型
7. 控制流關鍵字
8. 其他關鍵字
9. 上下文關鍵字(Contextual Keywords)
---------------
七、方法
1. 方法的定義
2. 示例
3. 方法的調用
4. 參數傳遞方式
5. 方法重載(Overloading)
6. 可選參數和命名參數(C# 4.0及以后)
7. 表達式體定義方法(C# 6.0及以后)
8. 異步方法(Async/Await)
-------------------------------------------
八、構造器
1. 實例構造器
1.1. 2. 靜態構造器
2. 構造器的特性與使用場景
3. 構造器的調用順序
4. 構造函數鏈(Chaining)
一、注釋
在C#中,注釋是用來在代碼中添加說明性文字的,它們不會被編譯器執行,但有助于提高代碼的可讀性和維護
性。C#支持三種類型的注釋:
- 單行注釋
- 多行注釋
- XML文檔注釋
1. 單行注釋
單行注釋使用//
開頭,從//
開始到該行結束的所有內容都會被視為注釋。
示例:
// 這是一個單行注釋
int number = 5; // 這也是單行注釋
2. 多行注釋
多行注釋使用/*
開頭,以*/
結尾。它們可以跨越多行。
示例:
/* 這是一個多行注釋的開始這是多行注釋的中間部分這是多行注釋的結束 */
int number = 10; // 這行代碼不會被視為多行注釋的一部分
3. XML文檔注釋
XML文檔注釋以///
開頭,這種注釋通常用于生成文檔(例如,使用Visual Studio的XML文檔注釋工具)。它
們遵循XML的格式,可以包含標簽和屬性,用于提供更豐富的代碼描述信息。
示例:
/// <summary>
/// 這是一個計算兩個數字之和的方法。
/// </summary>
/// <param name="a">第一個數字</param>
/// <param name="b">第二個數字</param>
/// <returns>返回兩個數字的和</returns>
public int Add(int a, int b)
{return a + b;
}
4. 使用建議和最佳實踐:
- 保持代碼清晰:使用注釋來解釋復雜的邏輯、算法或者為什么這樣實現。
- 避免過度注釋:好的代碼應該盡可能自解釋,過多的注釋可能會讓代碼顯得雜亂無章。
- 更新和維護:當代碼發生變化時,確保相關的注釋也隨之更新,避免誤導。
- 使用XML文檔注釋生成文檔:對于公開的API或庫,使用XML文檔注釋可以幫助自動生成文檔,這對于維護和團隊協作非常有幫助。
- 遵循團隊的編碼規范:如果在一個團隊中工作,確保所有成員遵循相同的注釋規范和風格。
通過合理使用這些注釋技巧,你可以顯著提高代碼的可讀性和維護性。
二、訪問修飾符
在C#中,訪問修飾符是用來控制類、方法、屬性、事件和索引器等成員的訪問權限的。它們決定了這些成員可以
被哪些代碼訪問。C#中共有五種訪問修飾符,每種都有其特定的用途和范圍。以下是這五種訪問修飾符的詳細解
釋:
1. public
public 修飾符表示成員可以被任何其他代碼訪問,無論是同一個程序集內的代碼還是其他程序集的代碼。
示例:public class MyClass { }
表示這個類可以在任何地方被訪問。
2. private
private 修飾符表示成員只能被定義它的類內部訪問。
這意味著,即使是在同一個程序集內,其他類也無法訪問該成員。
示例:private int myVariable;
表示這個變量只能在定義它的類內部被訪問。
3. protected
protected 修飾符表示成員可以被定義它的類以及所有派生類(子類)訪問。
但是,如果這個成員位于不同的程序集,那么只有在派生類位于同一個程序集內時才能訪問。
示例:protected virtual void MyMethod() { }
表示這個方法可以在派生類中被重寫和調用。
4. internal
internal 或稱為 assembly 修飾符表示成員可以被同一個程序集內的任何代碼訪問,但不能被其他程序集的代碼
訪問。
示例:internal class MyInternalClass { }
表示這個類只能在定義它的程序集內被訪問。
5. protected internal 或 protected and internal
protected internal 修飾符是 protected 和 internal 的組合,表示成員可以被定義它的類、所有派生類以及同
一個程序集內的任何代碼訪問,但不能被其他程序集的代碼訪問。
示例:protected internal string MyProperty { get; set; }
表示這個屬性可以在派生類和同一個程序集內被訪問,但不能被其他程序集訪問。
6. private protected 或 private and protected
private protected 是C# 7.2引入的,它結合了 private 和 protected 的特性,使得成員只能被定義它的類和所
有派生類(無論是否在同一程序集內)訪問。
示例:private protected void MyMethod() { }
表示這個方法只能在定義它的類和所有派生類中被訪問。
7. 使用場景
- public:當你希望類的成員對所有外部代碼都可見時使用。
- private:當你希望類的成員僅在其定義的類內部可用時使用。
- protected:當你希望類的成員在其自身和派生類中可用時使用。
- internal:當你希望類的成員在同一個程序集內可用時使用。
- protected internal:當你希望類的成員在同一個程序集內或在派生類中可用時使用。
- private protected:當你希望類的成員在定義它的類和所有派生類中可用時使用,無論它們是否在同一程序集內。
正確選擇和使用這些訪問修飾符對于設計良好的、可維護的C#代碼非常重要。
三、標識符
在C#中,標識符是用來命名變量、方法、類、接口、事件、屬性等元素的名稱。
它們遵循一系列規則和約定,以確保代碼的可讀性和一致性。
下面是一些關于C#中標識符的重要規則和細節:
1. 命名規則
- 首字母規則:標識符可以以字母或下劃線(_)開頭。在C#中,標識符不能以下劃線開頭。
- 后續字符規則:標識符可以包含字母、數字、下劃線(_)和@符號。但是,不能包含空格或其他特殊字符。
- 大小寫敏感:C#是大小寫敏感的,這意味著
variable
和Variable
被視為兩個不同的標識符。
2. 命名約定
C#社區遵循一些命名約定,以提高代碼的可讀性和維護性:
- 駝峰命名法(Camel Case):
-
- 小駝峰命名法(lowerCamelCase):第一個單詞的首字母小寫,后續單詞的首字母大寫。例如:
myVariable
。 - 大駝峰命名法(UpperCamelCase或PascalCase):每個單詞的首字母都大寫。例如:
MyClass
。
- 小駝峰命名法(lowerCamelCase):第一個單詞的首字母小寫,后續單詞的首字母大寫。例如:
- 匈牙利命名法(Hungarian Notation):盡管不常用,但某些舊代碼中仍可見。匈牙利命名法通過在變量名前加上一個或多個字母來表示變量的類型或作用。例如:
iCount
表示一個整型計數器。
3. 關鍵字和保留字
C#有一些關鍵字和保留字不能用作標識符,因為它們已經被賦予了特定的意義。例如:
int class = 5; // 錯誤,因為'class'是C#的關鍵字
完整的C#關鍵字列表可以在官方文檔中找到,例如:C# Keywords。
4. 使用@符號
如果你需要使用一個以關鍵字命名的變量名,或者變量名與C#的保留字沖突,你可以在變量名前加上@符號
來“轉義”關鍵字或保留字。例如:
int @class = 5; // 正確,使用@來避免關鍵字沖突
5. 最佳實踐
- 清晰和描述性:選擇能夠清晰描述變量或對象用途的名稱。
- 一致性:在項目中保持一致的命名約定。
- 避免混淆:避免使用可能引起混淆的縮寫或過于簡短的名稱。
示例
public class MyClass {private int myVariable; // 小駝峰命名法private int MyProperty { get; set; } // 大駝峰命名法,用于屬性public static void Main() {int iCount = 10; // 小駝峰命名法,表示一個計數器Console.WriteLine(iCount);}
}
遵循這些規則和最佳實踐將有助于編寫更清晰、更易于維護的C#代碼。
四、關鍵字
在C#中,關鍵字是用來表示程序中特定功能的詞匯,它們在編程時具有特殊的含義和用途。了解這些關鍵字對于
編寫有效的C#代碼至關重要。C#的關鍵字可以分為以下幾類:
1. 訪問修飾符
public
:允許訪問的類型或成員可以被任何其他代碼訪問。private
:限制訪問的類型或成員只能被其所屬的類訪問。protected
:允許訪問的類型或成員只能被其所屬的類或派生類訪問。internal
:允許訪問的類型或成員只能在同一個程序集內被訪問。protected internal
:允許訪問的類型或成員只能在同一個程序集內或派生類中被訪問。private protected
:允許訪問的類型或成員只能在同一個程序集內的派生類中被訪問。
2. 類型關鍵字
class
:定義一個類。struct
:定義一個值類型結構體。interface
:定義一個接口。enum
:定義一個枚舉類型。delegate
:定義一個委托。
3. 方法修飾符
static
:表示方法屬于類而不是類的實例。virtual
:表示方法可以在派生類中被重寫。override
:表示方法重寫基類中的虛方法。abstract
:表示方法在派生類中必須被重寫。sealed
:阻止方法被重寫。
4. 屬性修飾符
get
:用于獲取屬性值的方法。set
:用于設置屬性值的方法。readonly
:指示屬性只可讀,不可寫。
5. 字段修飾符
const
:定義一個常量字段。readonly
:定義一個只讀字段,其值必須在聲明時或在構造函數中初始化。volatile
:指示字段可能由多個線程同時修改,編譯器應避免優化該字段的訪問。
6. 聲明變量和類型
var
:自動推斷變量的類型(C# 3.0引入)。dynamic
:在運行時解析類型(C# 4.0引入)。ref
:引用傳遞參數(傳遞變量的引用而不是值)。out
:用于方法參數,表示該參數用于從方法返回一個值(通常用在返回多個值時)。params
:用于方法的參數,允許傳遞零個或多個參數。
7. 控制流關鍵字
if
、else
、switch
、case
、default
、while
、do
、for
、foreach
、break
、continue
、goto
、return
、try
、catch
、finally
、throw
、checked
、unchecked
。
8. 其他關鍵字
using
:用于聲明命名空間或使用資源(如文件、數據庫連接等)。namespace
:定義命名空間。class
、struct
、interface
、enum
、delegate
等用于定義類型的關鍵字也在此分類下,但它們屬于類型關鍵字類別。null
:表示空引用或空指針。true
和false
:布爾值的字面量。sizeof
: 在不安全代碼中,用于獲取類型的字節大小。lock
: 用于鎖定對象,確保線程安全地訪問共享資源。yield
: 在迭代器塊中使用,用于返回序列中的元素。async
和await
: 用于異步編程模型中,使異步方法更易于編寫和使用。
9. 上下文關鍵字(Contextual Keywords)
這些關鍵字在不同的上下文中可能有不同的含義,例如在泛型編程中:
where
: 在泛型約束中使用,例如指定類型參數必須繼承自某個類或實現某個接口。in
: 在泛型編程中指定協變(C# 7.3及以后版本)。out
: 在泛型編程中指定逆變(C# 7.3及以后版本)。
了解這些關鍵字及其用途對于編寫高效和正確的C#代碼至關重要。在實際開發中,合理地使用這些關鍵字可以提
高代碼的可讀性和維護性。
---------------
七、方法
在C#中,方法(也稱為函數)是執行特定任務的代碼塊。它們可以被定義在一個類中,并被其他類或方法調用。
C#中的方法可以是靜態的(屬于類本身)或實例的(屬于類的實例)。下面將詳細解釋C#中方法的各個方面。
1. 方法的定義
一個C#方法的基本定義格式如下:
[訪問修飾符] [返回類型] 方法名([參數列表])
{// 方法體
}
- 訪問修飾符:如
public
,private
,protected
,internal
等,控制方法的訪問權限。 - 返回類型:方法返回的數據類型,如果是
void
則表示不返回任何值。 - 方法名:標識符,遵循C#的命名規則。
- 參數列表:括號內包含一個或多個參數,每個參數由類型和名稱組成,參數間用逗號分隔。
- 方法體:包含執行任務的代碼塊。
2. 示例
public class ExampleClass
{// 無參數無返回值的方法public void SayHello(){Console.WriteLine("Hello, World!");}// 有參數有返回值的方法public int Add(int a, int b){return a + b;}
}
3. 方法的調用
- 靜態方法:使用類名直接調用。
ExampleClass.SayHello(); // 需要是靜態方法或靜態屬性訪問方式
- 實例方法:首先創建類的實例,然后通過該實例調用。
ExampleClass example = new ExampleClass();
example.SayHello(); // 調用非靜態方法
int result = example.Add(5, 3); // 調用非靜態方法并獲取返回值
4. 參數傳遞方式
C#支持按值傳遞(默認)和按引用傳遞(使用ref
或out
關鍵字)。
- 按值傳遞:傳遞參數的副本,對副本的修改不會影響原始參數。
- 按引用傳遞:直接傳遞參數的內存地址,對參數的修改會影響原始參數。
ref
用于修改傳入的參數值,out
用于在方法內部給參數賦值。
5. 方法重載(Overloading)
同一個類中可以有多個同名方法,只要它們的參數列表不同(參數數量或類型不同)。這稱為方法重載。
public void Show(int a) { }
public void Show(string text) { }
6. 可選參數和命名參數(C# 4.0及以后)
從C# 4.0開始,可以在方法定義時為參數提供默認值,使其成為可選參數。還可以在調用時使用命名參數。
public void Print(string message = "Default Message") { }
Print("Hello"); // 使用默認值和命名參數調用Print方法。
7. 表達式體定義方法(C# 6.0及以后)
從C# 6.0開始,可以使用表達式體來定義簡單的只返回一個表達式結果的方法。
public int Multiply(int a, int b) => a * b; // 相當于 { return a * b; } 的簡寫形式。
8. 異步方法(Async/Await)
C#支持異步編程模式,允許方法在等待操作完成時釋放線程,使用async
和await
關鍵字。
public async Task<int> GetDataAsync()
{ // 使用await調用異步方法并獲取結果 return await SomeAsyncMethod();
}
通過以上介紹,你應該對C#中的方法有了一個全面的理解。
每種方法和概念都可以幫助你更有效地編寫和組織代碼。
-------------------------------------------
八、構造器
在C#中,構造器(Constructor)是一種特殊的方法,用于在創建對象時初始化對象。構造器與類同名,沒有返回
類型,主要用于分配內存并初始化對象。C#中有兩種類型的構造器:實例構造器(用于創建對象實例)和靜態構
造器(用于初始化靜態成員)。
1. 實例構造器
實例構造器用于創建類的實例,并初始化對象的狀態。每個類可以有多個構造器,只要它們的參數列表不同。
示例
public class Person
{public string Name { get; set; }public int Age { get; set; }// 無參數構造器public Person(){Name = "Unknown";Age = 0;}// 帶參數的構造器public Person(string name, int age){Name = name;Age = age;}
}
1.1. 2. 靜態構造器
靜態構造器用于初始化類的靜態成員。靜態構造器是類的一部分,而不是實例的一部分。靜態構造器在類第一次
被引用時自動調用,僅執行一次。
示例
public class DatabaseConnection
{private static string connectionString;// 靜態構造器static DatabaseConnection(){connectionString = "Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;";}
}
2. 構造器的特性與使用場景
- 無參數構造器:通常用于提供一個默認的初始化狀態。如果類中沒有定義任何構造器,編譯器會自動提供一個無參數的默認構造器。一旦你定義了任何構造器(無論是帶參數的還是無參數的),編譯器就不會自動提供默認的無參數構造器。
- 帶參數的構造器:允許在創建對象時傳遞不同的初始值。這增加了對象的靈活性,使得可以根據需要創建具有不同初始狀態的多個對象實例。
- 構造函數重載:通過定義多個具有不同參數列表的構造器,可以實現構造函數重載。這允許根據提供的參數創建不同類型的對象實例。
3. 構造器的調用順序
- 父類構造器的調用:在派生類的構造器中,必須首先調用基類的構造器(除非基類是無參數的默認構造器)。這通常通過使用
:base()
語法完成。例如:public ChildClass(string name) : base(name)
。 - 靜態構造器的調用:靜態構造器在類第一次被引用時自動調用,用于初始化靜態成員。它不能被直接調用,也不能帶有訪問修飾符或參數。
4. 構造函數鏈(Chaining)
在派生類的構造函數中,可以使用 this()
來調用基類的另一個構造函數。例如:
public class ChildClass : BaseClass
{public ChildClass(string name) : base(name) // 調用基類的帶參數的構造器{// 子類的初始化代碼}
}
通過以上介紹,你可以更好地理解C#中構造器的使用和它們的重要性。