首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 核心語法進階(二):屬性、索引子、事件、版本控制與屬性標記

     編輯:關於C語言

前言

承接上集基礎語法,本文深入探討 C# 物件導向核心機制:屬性封裝存取邏輯、索引子提供陣列式存取、事件實作發布-訂閱、版本控制解決 DLL 地獄、以及屬性標記賦予中繼資料能力。

1. 屬性:智慧欄位

語法結構

public class Button : Control
{
    private string _caption;
    public string Caption
    {
        get => _caption;
        set
        {
            _caption = value;
            Repaint(); // 附加副作用
        }
    }
}

使用優勢

  • 語法如同欄位:btn.Caption = "OK"; / var s = btn.Caption;
  • 封裝驗證、通知、延遲載入等邏輯
  • 唯讀(僅 get)、唯寫(僅 set)靈活控制
  • 自動實作屬性 (C# 3+):public string Name { get; set; } 編譯器自動產生背端欄位

2. 索引子:智慧陣列

語法結構

public class ListBox : Control
{
    private string[] _items;
    public string this[int index]
    {
        get => _items[index];
        set
        {
            _items[index] = value;
            Repaint();
        }
    }
}

特性

  • 命名為 this,支援多維度參數:this[int x, int y]
  • 可多載:不同參數型別/數量定義多個索引子
  • 介面中可宣告索引子,強制實作類別提供

3. 事件:發布-訂閱機制

核心元素

  1. 委派型別:定義事件處理常式簽名 delegate void EventHandler(object sender, EventArgs e);
  2. 事件宣告:public event EventHandler Click;
  3. 訂閱/取消:btn.Click += Handler; / btn.Click -= Handler;
  4. 觸發:類別內部 Click?.Invoke(this, EventArgs.Empty);

欄位型 vs 屬性型事件

// 欄位型(預設)
public event EventHandler Click;

// 屬性型(可自訂 add/remove 邏輯)
public event EventHandler Click
{
    add => _click += value;
    remove => _click -= value;
}
private EventHandler _click;

兩者對呼叫端行為相同,屬性型允許攔截訂閱邏輯(如記錄、執行緒封送)。

4. 版本控制:解決基底類別演進衝突

問題情境

// 作者 A v1
class Base { }

// 作者 B 衍生
class Derived : Base { public virtual void F() {} }

// 作者 A v2 新增虛擬方法
class Base { public virtual void F() {} } // 衝突!

C# 解決方案:明確意圖關鍵字

關鍵字語意適用情境
new隱藏基底成員,非覆寫衍生類別成員與新基底成員無關,單純同名
override覆寫基底虛擬成員衍生類別確實要擴充/修改基底行為,需呼叫 base.F()
(無關鍵字)編譯器警告,預視為 new不建議,應明確指定

範例

// v2a: 使用 new 隱藏
class Derived : Base
{
    new public virtual void F() { Console.WriteLine("Derived.F"); }
}

// v2b: 使用 override 覆寫
class Derived : Base
{
    public override void F() { base.F(); Console.WriteLine("Derived.F"); }
}

5. 屬性標記:宣告式中繼資料

定義自訂屬性

[AttributeUsage(AttributeTargets.All)]
public class HelpAttribute : Attribute
{
    public HelpAttribute(string url) => Url = url;
    public string Url { get; }
    public string Topic { get; set; }
}

套用屬性

[Help("https://docs.example.com/Class1.htm")]
public class Class1
{
    [Help("https://docs.example.com/Class1.htm#F", Topic = "F")]
    public void F() { }
}

執行階段反射讀取

var type = typeof(Class1);
var attrs = type.GetCustomAttributes(typeof(HelpAttribute), false);
if (attrs.Length > 0)
{
    var ha = (HelpAttribute)attrs[0];
    Console.WriteLine($"Url: {ha.Url}, Topic: {ha.Topic}");
}

常見內建屬性

  • [Obsolete("Use NewMethod()"):標記過時 API,編譯警告
  • [Serializable]:允許序列化
  • [Conditional("DEBUG"):條件編譯方法呼叫
  • [CallerMemberName] / [CallerFilePath] / [CallerLineNumber]:自動取得呼叫端資訊

總結

屬性、索引子、事件構成 C# 表達領域模型的三大支柱;版本控制機制(new/override)保障元件獨立演進;屬性標記則賦予程式碼豐富中繼資料,支援框架級功能(序列化、驗證、DI、AOP 等)。熟練運用這些機制,是撰寫專業級 C# 程式碼的關鍵。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved