最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#中的enum、struct和class三種類型的對比總結(jié)

 更新時間:2026年03月27日 08:44:51   作者:杰西筆記  
在?C#?類型系統(tǒng)中,enum、struct?和?class?是三種最基礎(chǔ)且最重要的類型定義方式,本文將系統(tǒng)性地總結(jié)這三種類型的特性、差異及使用建議,希望對大家有所幫助

引言

在 C# 類型系統(tǒng)中,enum、structclass 是三種最基礎(chǔ)且最重要的類型定義方式。它們分別服務(wù)于不同的場景,理解其本質(zhì)區(qū)別和適用場景,對于編寫高質(zhì)量的代碼至關(guān)重要。本文將系統(tǒng)性地總結(jié)這三種類型的特性、差異及使用建議。

一、三者概覽

類型分類存儲位置核心用途典型場景
enum值類型定義一組命名常量狀態(tài)、選項、類型標(biāo)識
struct值類型封裝小型數(shù)據(jù)組坐標(biāo)、參數(shù)、數(shù)據(jù)傳輸對象
class引用類型定義復(fù)雜業(yè)務(wù)對象服務(wù)、管理器、實體模型

二、enum:常量的集合

本質(zhì)

enum 是值類型,本質(zhì)上是整數(shù)類型(默認(rèn)為 int)的封裝,用于定義一組相關(guān)的命名常量。

核心特點

  • 簡單純粹:只能包含枚舉成員,每個成員對應(yīng)一個常量值
  • 類型安全:避免使用魔法數(shù)字,編譯時檢查
  • 支持標(biāo)志位:通過 [Flags] 特性支持位運算組合

代碼示例

// 基礎(chǔ)枚舉:訂單狀態(tài)
public enum OrderStatus
{
    Pending = 1,      // 待支付
    Paid = 2,         // 已支付
    Shipped = 3,      // 已發(fā)貨
    Delivered = 4,    // 已送達(dá)
    Cancelled = 5     // 已取消
}

// 標(biāo)志位枚舉:用戶權(quán)限
[Flags]
public enum Permission
{
    None = 0,
    Read = 1 << 0,    // 1
    Write = 1 << 1,   // 2
    Delete = 1 << 2,  // 4
    Admin = Read | Write | Delete  // 7
}

// 使用示例
public class Order
{
    public OrderStatus Status { get; set; }
}

// 權(quán)限組合
Permission userPerm = Permission.Read | Permission.Write;
if (userPerm.HasFlag(Permission.Write))
{
    Console.WriteLine("用戶有寫入權(quán)限");
}

適用場景

  • 狀態(tài)機:訂單狀態(tài)、審批狀態(tài)、任務(wù)狀態(tài)
  • 選項配置:用戶角色、權(quán)限級別、支付方式
  • 類型標(biāo)識:日志級別、錯誤類型、文件類型
  • 方向/方位:方向(上/下/左/右)、星期幾、月份

三、struct:輕量級數(shù)據(jù)容器

本質(zhì)

struct 是值類型,用于封裝一組相關(guān)的數(shù)據(jù)字段,通常代表一個輕量級的、不可變的數(shù)據(jù)結(jié)構(gòu)。

核心特點

  • 值語義:賦值時復(fù)制整個數(shù)據(jù),修改互不影響
  • 棧分配:小對象分配和釋放效率高,無 GC 壓力
  • 不可變性建議:微軟推薦將 struct 設(shè)計為不可變類型
  • 限制:不能繼承類,不能定義無參構(gòu)造函數(shù)(C# 10 前)

代碼示例

// 推薦:不可變結(jié)構(gòu)體
public struct Color
{
    public byte R { get; }
    public byte G { get; }
    public byte B { get; }
    
    public Color(byte r, byte g, byte b)
    {
        R = r;
        G = g;
        B = b;
    }
    
    public string ToHex() => $"#{R:X2}{G:X2}{B:X2}";
}

// 坐標(biāo)結(jié)構(gòu)體
public struct Point
{
    public double X { get; set; }
    public double Y { get; set; }
    
    public double DistanceTo(Point other)
    {
        double dx = X - other.X;
        double dy = Y - other.Y;
        return Math.Sqrt(dx * dx + dy * dy);
    }
}

// 數(shù)據(jù)傳輸對象
public struct ProductInfo
{
    public int Id;
    public string Name;
    public decimal Price;
}

賦值行為演示

// struct:值類型,復(fù)制整個數(shù)據(jù)
Point p1 = new Point { X = 10, Y = 20 };
Point p2 = p1;        // 復(fù)制 p1 的所有數(shù)據(jù)
p2.X = 30;            // 只修改 p2
Console.WriteLine(p1.X);  // 輸出: 10 (p1 不受影響)

// 對比 class
class PointClass { public int X, Y; }
PointClass c1 = new PointClass { X = 10, Y = 20 };
PointClass c2 = c1;   // c2 和 c1 指向同一個對象
c2.X = 30;            // 修改的是同一個對象
Console.WriteLine(c1.X);  // 輸出: 30 (c1 也被修改)

適用場景

  • 數(shù)學(xué)概念:坐標(biāo)(Point)、尺寸(Size)、矩形(Rectangle)
  • 顏色值:RGB、ARGB 顏色表示
  • 日期區(qū)間:DateRange、TimeRange
  • 數(shù)值區(qū)間:Range、Interval
  • 輕量級 DTO:頻繁傳輸?shù)男⌒蛿?shù)據(jù)包

四、class:復(fù)雜業(yè)務(wù)對象

本質(zhì)

class 是引用類型,用于定義具有狀態(tài)和行為的復(fù)雜對象,是面向?qū)ο缶幊痰暮诵摹?/p>

核心特點

  • 引用語義:賦值時傳遞引用,多處共享同一實例
  • 堆分配:支持復(fù)雜的生命周期管理
  • 完整的 OOP 支持:繼承、多態(tài)、封裝、析構(gòu)函數(shù)
  • 靈活性:可定義無參構(gòu)造、析構(gòu)函數(shù)、虛方法等

代碼示例

// 抽象基類
public abstract class User
{
    public int Id { get; set; }
    public string UserName { get; set; }
    public abstract string GetRole();
    
    public virtual void Login()
    {
        Console.WriteLine($"{UserName} 登錄成功");
    }
}

// 派生類
public class Admin : User
{
    public override string GetRole() => "管理員";
    
    public override void Login()
    {
        base.Login();
        Console.WriteLine("管理員權(quán)限已激活");
    }
}

public class RegularUser : User
{
    public override string GetRole() => "普通用戶";
}

// 服務(wù)類(單例模式)
public class UserService
{
    private static UserService _instance;
    private List<User> _users = new List<User>();
    
    private UserService() { }
    
    public static UserService Instance => _instance ??= new UserService();
    
    public void AddUser(User user) => _users.Add(user);
    public List<User> GetAllUsers() => _users;
}

// 實體類
public class ShoppingCart
{
    public int CartId { get; set; }
    private List<Product> _items = new List<Product>();
    
    public void AddItem(Product product)
    {
        _items.Add(product);
    }
    
    public decimal GetTotal()
    {
        return _items.Sum(item => item.Price);
    }
    
    ~ShoppingCart()
    {
        Console.WriteLine($"購物車 {CartId} 已銷毀");
    }
}

適用場景

  • 業(yè)務(wù)實體:用戶、訂單、產(chǎn)品、客戶
  • 服務(wù)類:用戶服務(wù)、郵件服務(wù)、數(shù)據(jù)庫服務(wù)
  • 管理器:連接池、緩存管理、配置管理
  • 復(fù)雜對象:需要繼承和多態(tài)的領(lǐng)域模型
  • UI 組件:窗體、控件、視圖模型

五、關(guān)鍵差異詳解

1. 賦值行為對比

// enum:賦值整數(shù)常量
OrderStatus status1 = OrderStatus.Paid;
OrderStatus status2 = status1;  // 復(fù)制值
// struct:復(fù)制全部數(shù)據(jù)
struct Rectangle { public int Width, Height; }
Rectangle rect1 = new Rectangle { Width = 10, Height = 20 };
Rectangle rect2 = rect1;        // 復(fù)制整個結(jié)構(gòu)體
rect2.Width = 30;               // rect1.Width 仍為 10
// class:復(fù)制引用
class RectangleClass { public int Width, Height; }
RectangleClass rect3 = new RectangleClass { Width = 10, Height = 20 };
RectangleClass rect4 = rect3;   // 指向同一對象
rect4.Width = 30;               // rect3.Width 變?yōu)?30

2. 內(nèi)存分配與性能

// struct:棧分配,GC 友好
public void ProcessColors()
{
    var colors = new Color[10000];      // 連續(xù)內(nèi)存,訪問快
    // 方法結(jié)束自動釋放,無 GC 壓力
}

// class:堆分配,GC 管理
public void ProcessUsers()
{
    var users = new List<User>();       // 堆分配,需 GC 回收
    users.Add(new Admin());
    users.Add(new RegularUser());
    // 需等待 GC 回收
}

3. 類型限制對比

特性enumstructclass
無參構(gòu)造函數(shù)不支持有限支持完全支持
析構(gòu)函數(shù)不支持不支持支持
繼承類不支持不支持支持
實現(xiàn)接口支持支持支持
可為 null
默認(rèn)值第一個成員所有字段為默認(rèn)值null

六、通用場景示例

綜合運用三種類型的實際場景:

場景一:電商系統(tǒng)

// enum:訂單狀態(tài)
public enum OrderStatus
{
    Pending,
    Paid,
    Shipped,
    Completed,
    Cancelled
}

// enum:支付方式
public enum PaymentMethod
{
    CreditCard,
    Alipay,
    WeChat,
    BankTransfer
}

// struct:金額(不可變值類型)
public struct Money
{
    public decimal Amount { get; }
    public string Currency { get; }
    
    public Money(decimal amount, string currency)
    {
        Amount = amount;
        Currency = currency;
    }
    
    public Money Add(Money other)
    {
        if (Currency != other.Currency)
            throw new InvalidOperationException("貨幣類型不一致");
        return new Money(Amount + other.Amount, Currency);
    }
}

// class:訂單實體
public class Order
{
    public int OrderId { get; set; }
    public OrderStatus Status { get; set; }
    public PaymentMethod PaymentMethod { get; set; }
    public Money TotalAmount { get; set; }
    private List<OrderItem> _items = new List<OrderItem>();
    
    public void AddItem(Product product, int quantity)
    {
        _items.Add(new OrderItem(product, quantity));
        RecalculateTotal();
    }
    
    private void RecalculateTotal()
    {
        decimal total = _items.Sum(item => item.Subtotal.Amount);
        TotalAmount = new Money(total, "CNY");
    }
    
    public void Pay(PaymentMethod method)
    {
        PaymentMethod = method;
        Status = OrderStatus.Paid;
    }
}

場景二:圖形處理系統(tǒng)

// struct:顏色(值類型)
public struct Color
{
    public byte R, G, B, A;
    public Color(byte r, byte g, byte b, byte a = 255)
    {
        R = r; G = g; B = b; A = a;
    }
}

// struct:坐標(biāo)點
public struct Point
{
    public int X, Y;
    public Point(int x, int y) { X = x; Y = y; }
}

// class:圖形基類(引用類型)
public abstract class Shape
{
    public Color FillColor { get; set; }
    public abstract double GetArea();
    public abstract void Draw();
}

public class Rectangle : Shape
{
    public Point Position { get; set; }
    public int Width { get; set; }
    public int Height { get; set; }
    
    public override double GetArea() => Width * Height;
    public override void Draw() { }
}

場景三:權(quán)限管理系統(tǒng)

// enum:權(quán)限標(biāo)志位
[Flags]
public enum Permission
{
    None = 0,
    View = 1,
    Create = 2,
    Edit = 4,
    Delete = 8,
    Full = View | Create | Edit | Delete
}

// struct:權(quán)限組(輕量級組合)
public struct PermissionGroup
{
    public string Name { get; }
    public Permission Permissions { get; }
    
    public PermissionGroup(string name, Permission perms)
    {
        Name = name;
        Permissions = perms;
    }
    
    public bool HasPermission(Permission perm) => Permissions.HasFlag(perm);
}

// class:用戶服務(wù)
public class UserService
{
    private Dictionary<string, PermissionGroup> _groups;
    
    public UserService()
    {
        _groups = new Dictionary<string, PermissionGroup>();
    }
    
    public void AddGroup(PermissionGroup group)
    {
        _groups[group.Name] = group;
    }
    
    public bool CheckPermission(string groupName, Permission required)
    {
        return _groups.TryGetValue(groupName, out var group) &&
               group.HasPermission(required);
    }
}

七、選擇指南

使用 enum 當(dāng)

  • 需要定義一組相關(guān)的常量值(如狀態(tài)、類型、選項)
  • 替代魔法數(shù)字,增強代碼可讀性
  • 需要位標(biāo)志組合(使用 [Flags]
  • 做 switch-case 判斷

使用 struct 當(dāng)

  • 數(shù)據(jù)量?。ńㄗh < 16 字節(jié))
  • 代表單一的值(如坐標(biāo)、顏色、范圍)
  • 生命周期短暫,頻繁創(chuàng)建銷毀
  • 希望值語義,數(shù)據(jù)獨立
  • 不需要繼承和多態(tài)

使用 class 當(dāng)

  • 對象包含復(fù)雜行為和狀態(tài)
  • 需要繼承和多態(tài)
  • 對象較大,復(fù)制成本高
  • 需要在多處共享同一實例
  • 需要實現(xiàn) IDisposable 進(jìn)行資源管理

八、最佳實踐總結(jié)

1. enum 最佳實踐

// ? 顯式指定值,便于序列化
public enum LogLevel
{
    Debug = 10,
    Info = 20,
    Warning = 30,
    Error = 40
}

// ? 位標(biāo)志使用 2 的冪
[Flags]
public enum FileAccess
{
    None = 0,
    Read = 1,
    Write = 2,
    Execute = 4
}

// ? 避免復(fù)雜的邏輯判斷
// ? 不要在枚舉中定義方法(使用擴展方法替代)

2. struct 最佳實踐

// ? 設(shè)計為不可變類型
public struct Point
{
    public int X { get; }
    public int Y { get; }
    public Point(int x, int y) { X = x; Y = y; }
}

// ? 保持結(jié)構(gòu)體小巧
// ? 需要修改時傳遞 ref 參數(shù)
public void UpdatePoint(ref Point point, int dx, int dy) { }

// ? 避免在結(jié)構(gòu)體中定義引用類型字段(會導(dǎo)致復(fù)制成本增加)
// ? 避免頻繁裝箱拆箱

3. class 最佳實踐

// ? 遵循 SOLID 原則
// ? 需要繼承時設(shè)計抽象基類
public abstract class Repository<T> { }

// ? 考慮使用接口定義契約
public interface IUserService { }

// ? 大型對象實現(xiàn) IDisposable
public class DatabaseConnection : IDisposable
{
    public void Dispose() { /* 釋放資源 */ }
}

九、性能考量速查表

操作enumstructclass
創(chuàng)建小對象(<16B)最快慢(堆分配)
創(chuàng)建大對象N/A慢(復(fù)制成本高)快(引用傳遞)
傳遞參數(shù)快(值復(fù)制)小對象快,大對象慢快(引用傳遞)
GC 壓力
數(shù)組訪問連續(xù)內(nèi)存分散內(nèi)存

結(jié)語

enum、structclass 是 C# 類型系統(tǒng)的三大基石,各有其獨特的設(shè)計哲學(xué)和適用場景:

  • enum:用命名常量代替魔法數(shù)字,讓代碼更清晰
  • struct:用值語義封裝輕量數(shù)據(jù),讓性能更高效
  • class:用引用語義構(gòu)建復(fù)雜對象,讓設(shè)計更靈活

理解并善用這三種類型,是寫出高質(zhì)量 C# 代碼的關(guān)鍵。在實際開發(fā)中,根據(jù)數(shù)據(jù)大小、生命周期、共享需求和性能要求,選擇最合適的類型,才能構(gòu)建出既健壯又高效的應(yīng)用程序。

到此這篇關(guān)于C#中的enum、struct和class三種類型的對比總結(jié)的文章就介紹到這了,更多相關(guān)C# enum struct和class內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C#生成Word文檔代碼示例

    C#生成Word文檔代碼示例

    這篇文章主要介紹了C#生成Word文檔代碼示例,本文直接給出代碼實例,需要的朋友可以參考下
    2015-06-06
  • C#實現(xiàn)簡單串口通信的示例詳解

    C#實現(xiàn)簡單串口通信的示例詳解

    這篇文章主要為大家詳細(xì)介紹了C#實現(xiàn)串口通信的相關(guān)知識,文中示例代碼介紹的非常詳細(xì),具有一定的學(xué)習(xí)價值,感興趣的小伙伴們可以跟隨小編一起了解一下
    2023-10-10
  • C#中抽象方法與虛擬方法的區(qū)別

    C#中抽象方法與虛擬方法的區(qū)別

    這篇文章主要介紹了C#中抽象方法與虛擬方法的區(qū)別,對于C#初學(xué)者來說可以深入理解抽象方法與虛擬方法,需要的朋友可以參考下
    2014-08-08
  • C# 并行和多線程編程——認(rèn)識和使用Task

    C# 并行和多線程編程——認(rèn)識和使用Task

    這篇文章主要介紹了C# 并行和多線程編程——認(rèn)識和使用Task的的相關(guān)資料,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下
    2021-02-02
  • C# 網(wǎng)絡(luò)編程之UDP

    C# 網(wǎng)絡(luò)編程之UDP

    這篇文章主要介紹了C# 網(wǎng)絡(luò)編程之UDP的相關(guān)資料,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下
    2021-02-02
  • C#求數(shù)組中元素全排列的方法

    C#求數(shù)組中元素全排列的方法

    這篇文章主要介紹了C#求數(shù)組中元素全排列的方法,較為詳細(xì)的分析了數(shù)組全排列算法的原理與實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-08-08
  • 用C#把文件轉(zhuǎn)換為XML的代碼

    用C#把文件轉(zhuǎn)換為XML的代碼

    用C#把文件轉(zhuǎn)換為XML的代碼...
    2007-03-03
  • C#實現(xiàn)簡單過濾非法字符實例

    C#實現(xiàn)簡單過濾非法字符實例

    這篇文章主要介紹了C#實現(xiàn)簡單過濾非法字符的方法,涉及C#針對字符串遍歷與判斷的相關(guān)技巧,非常簡單實用,需要的朋友可以參考下
    2015-11-11
  • C#中時間的幾種格式轉(zhuǎn)換方法

    C#中時間的幾種格式轉(zhuǎn)換方法

    有時候我們要對C#時間進(jìn)行轉(zhuǎn)換,達(dá)到不同的顯示效果,這里簡單介紹下,方便需要的朋友
    2013-09-09
  • C#實現(xiàn)串口通信詳解

    C#實現(xiàn)串口通信詳解

    串口通信(Serial Communications)是指外設(shè)和計算機間通過數(shù)據(jù)信號線、地線等按位(bit)進(jìn)行傳輸數(shù)據(jù)的一種通信方式,屬于串行通信方式,能夠?qū)崿F(xiàn)遠(yuǎn)距離通信,本文給大家介紹了C#串口通信總結(jié),需要的朋友可以參考下
    2024-12-12

最新評論

通化县| 奉贤区| 渝北区| 张家口市| 岳池县| 余江县| 扬州市| 鄂托克前旗| 江川县| 绥化市| 汪清县| 河间市| 自贡市| 沧州市| 中方县| 吉水县| 固原市| 通山县| 平定县| 新化县| 玛纳斯县| 项城市| 邻水| 逊克县| 北安市| 绥芬河市| 青川县| 临洮县| 肃北| 汪清县| 彰武县| 肥西县| 日照市| 上饶县| 项城市| 东台市| 洞头县| 哈尔滨市| 金秀| 兴海县| 子长县|