主頁 > .NET開發 > C#-7 結構和列舉

C#-7 結構和列舉

2022-03-17 06:08:52 .NET開發

一 什么是結構

結構是程式員定義的資料型別,有資料成員和函式成員,和類非常類似,

  • 類是參考型別,而結構是值型別;
  • 結構和類一樣可以實作介面;
  • 結構是隱式密封的,不能被派生;
  • 結構型別的變數不能為null;
  • 兩個結構的變數不能參考同一物件;
  • 在結構中不允許欄位初始化陳述句;
  • 預定義簡單型別(如int,long,short 等等. . . ),實際上在.Net中都實作為結構,
class CSimple
{
    public int X;
    public int Y;        
}

struct Simple
{
    public int X;
    public int Y; 
   // public int Z = 10 ; 編譯錯誤,不允許初始化欄位 }
static void Main() {   CSimple cs = new CSimple();   Simple ss = new Simple(); }


二 建構式

結構可以有實體建構式和靜態建構式,但不能有解構式,

2.1 實體建構式

結構隱式有一個無參的建構式,這個建構式把結構的每個成員設定為該型別的默認值,值成員設定成其默認值,參考成員設定成null,

預定義的無參建構式對每個結構都存在,可以創建另外的建構式,只要它們有引數,這一點和類不同,對于類,編譯器只在沒有其他建構式存在時才提供隱式的無參建構式,

struct Simple
{
    public int X;
    public int Y;
    public Simple(int a, int b)
    {
        X = a;
        Y = b;
    }
}

class Program
{
    static void Main(string[] args)
    {
        var s1 = new Simple();
        var s2 = new Simple(5, 10);
        Console.WriteLine($"s1:{s1.X},{s1.Y}");
        Console.WriteLine($"s2:{s2.X},{s2.Y}");
    }
}

2.2 靜態建構式

與類類似,結構的靜態建構式創建并初始化靜態資料成員,且不能參考實體成員,

以下任意一種行為發生前,將會呼叫靜態建構式:

  • 呼叫顯示宣告的建構式;
  • 參考結構的靜態成員,

三 結構作為回傳值和引數

  • 回傳值:當結構作為回傳值時,將創建它的副本并回傳;
  • 值引數:當結構被用作值引數時,將創建實參結構副本,用于方法體內執行;
  • ref和out引數:如果一個結構被用作ref或out引數,傳入方法的是該結構的一個參考,這樣就可以修改其資料成員,

四 什么是列舉

列舉是由程式員定義的型別,與類或結構一樣,

  • 與結構一樣,列舉是值型別;
  • 列舉只有一種型別的成員:命名的整數常量值;
  • 不能對成員使用修飾符,成員隱式地具有和列舉相同的可訪問性;
  • 比較不同列舉型別的成員會導致編譯時錯誤,

每個列舉成員都有一個底層整數型別,默認為int,

  • 每個列舉成員都被賦予一個底層型別的常量值;
  • 默認下,編譯器把第一個成員賦值為0,后續成員比前一成員多1,
enum TrafficLight
{
    Green,
    Yellow,
    Red
}
class Program
{
    static void Main(string[] args)
    {
        var t1 = TrafficLight.Green;
        var t2 = TrafficLight.Yellow;
        var t3 = TrafficLight.Red;

        Console.WriteLine($"{t1},{(int)t1}");
        Console.WriteLine($"{t2},{(int)t2}");
        Console.WriteLine($"{t3},{(int)t3}");

        Console.ReadLine();
    }
}
輸出:
Green,0
Yellow,1
Red,2

五 設定列舉的底層型別和顯示值

enum TrafficLight : byte
{
    Green = 2,
    Yellow,  //未顯示設定值,則默認比上一個成員的值多1
    Red = 10
}
class Program
{
    static void Main(string[] args)
    {
        var t1 = TrafficLight.Green;
        var t2 = TrafficLight.Yellow;
        var t3 = TrafficLight.Red;

        Console.WriteLine($"{t1},{(byte)t1}");
        Console.WriteLine($"{t2},{(byte)t2}"); 
        Console.WriteLine($"{t3},{(byte)t3}");

        Console.ReadLine();
    }
}
輸出:
Green,2
Yellow,3
Red,10

六 Enum類

6.1 .Net中的Enum類

.Net中的Enum類提供一些靜態方法:

  • GetName方法以列舉型別物件和整數作為引數,回傳回應的列舉成員的名稱;
  • GetNames方法以列舉型別物件為引數,回傳該列舉中所有成員的全部名稱,
enum TrafficLight
{
    Green,
    Yellow, 
    Red
}
class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine($"Second member is {Enum.GetName(typeof(TrafficLight),1)}");

        foreach (var name in Enum.GetNames(typeof(TrafficLight)))
        {
            Console.WriteLine(name);
        }

        Console.Read();
    }
}
輸出:
Second member is Yellow
Green
Yellow
Red

6.2 Enum類的擴展方法

有時,專案中需要獲取列舉成員的詳細描述或中文名稱,可以通過Description特性配合自定義的Enum類擴展方法,來方便獲取,

public static class EnumHelper
{
   // Enum類的擴展方法
/// <summary> /// 獲取列舉值上的Description特性的說明 /// </summary> /// <param name="enumValue">列舉值</param> /// <returns>特性說明</returns> public static string GetEnumDescription(this Enum enumValue) { if (enumValue =https://www.cnblogs.com/wwwen/archive/2022/03/16/= null) return string.Empty; var field = enumValue.GetType().GetField(enumValue.ToString()); if (field == null) return string.Empty; return Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) is DescriptionAttribute description ? description.Description : field.ToString(); } } enum TrafficLight { [Description("綠色交通燈")] Green, [Description("黃色交通燈")] Yellow, [Description("紅色交通燈")] Red } class Program { static void Main(string[] args) { Console.WriteLine(TrafficLight.Green.GetEnumDescription()); Console.Read(); } } 輸出: 綠色交通燈

 

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/445254.html

標籤:.NET技术

上一篇:LazyCaptcha自定義隨機驗證碼和字體

下一篇:ASP.NET CORE 專案搭建(2022 年 3 月版)

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • WebAPI簡介

    Web體系結構: 有三個核心:資源(resource),URL(統一資源識別符號)和表示 他們的關系是這樣的:一個資源由一個URL進行標識,HTTP客戶端使用URL定位資源,表示是從資源回傳資料,媒體型別是資源回傳的資料格式。 接下來我們說下HTTP. HTTP協議的系統是一種無狀態的方式,使用請求/ ......

    uj5u.com 2020-09-09 22:07:47 more
  • asp.net core 3.1 入口:Program.cs中的Main函式

    本文分析Program.cs 中Main()函式中代碼的運行順序分析asp.net core程式的啟動,重點不是剖析原始碼,而是理清程式開始時執行的順序。到呼叫了哪些實體,哪些法方。asp.net core 3.1 的程式入口在專案Program.cs檔案里,如下。ususing System; us ......

    uj5u.com 2020-09-09 22:07:49 more
  • asp.net網站作為websocket服務端的應用該如何寫

    最近被websocket的一個問題困擾了很久,有一個需求是在web網站中搭建websocket服務。客戶端通過網頁與服務器建立連接,然后服務器根據ip給客戶端網頁發送資訊。 其實,這個需求并不難,只是剛開始對websocket的內容不太了解。上網搜索了一下,有通過asp.net core 實作的、有 ......

    uj5u.com 2020-09-09 22:08:02 more
  • ASP.NET 開源匯入匯出庫Magicodes.IE Docker中使用

    Magicodes.IE在Docker中使用 更新歷史 2019.02.13 【Nuget】版本更新到2.0.2 【匯入】修復單列匯入的Bug,單元測驗“OneColumnImporter_Test”。問題見(https://github.com/dotnetcore/Magicodes.IE/is ......

    uj5u.com 2020-09-09 22:08:05 more
  • 在webform中使用ajax

    如果你用過Asp.net webform, 說明你也算是.NET 開發的老兵了。WEBform應該是2011 2013左右,當時還用visual studio 2005、 visual studio 2008。后來基本都用的是MVC。 如果是新開發的專案,估計沒人會用webform技術。但是有些舊版 ......

    uj5u.com 2020-09-09 22:08:50 more
  • iis添加asp.net網站,訪問提示:由于擴展配置問題而無法提供您請求的

    今天在iis服務器配置asp.net網站,遇到一個問題,記錄一下: 問題:由于擴展配置問題而無法提供您請求的頁面。如果該頁面是腳本,請添加處理程式。如果應下載檔案,請添加 MIME 映射。 WindowServer2012服務器,添加角色安裝完.netframework和iis之后,運行aspx頁面 ......

    uj5u.com 2020-09-09 22:10:00 more
  • WebAPI-處理架構

    帶著問題去思考,大家好! 問題1:HTTP請求和回傳相應的HTTP回應資訊之間發生了什么? 1:首先是最底層,托管層,位于WebAPI和底層HTTP堆疊之間 2:其次是 訊息處理程式管道層,這里比如日志和快取。OWIN的參考是將訊息處理程式管道的一些功能下移到堆疊下端的OWIN中間件了。 3:控制器處理 ......

    uj5u.com 2020-09-09 22:11:13 more
  • 微信門戶開發框架-使用指導說明書

    微信門戶應用管理系統,采用基于 MVC + Bootstrap + Ajax + Enterprise Library的技術路線,界面層采用Boostrap + Metronic組合的前端框架,資料訪問層支持Oracle、SQLServer、MySQL、PostgreSQL等資料庫。框架以MVC5,... ......

    uj5u.com 2020-09-09 22:15:18 more
  • WebAPI-HTTP編程模型

    帶著問題去思考,大家好!它是什么?它包含什么?它能干什么? 訊息 HTTP編程模型的核心就是訊息抽象,表示為:HttPRequestMessage,HttpResponseMessage.用于客戶端和服務端之間交換請求和回應訊息。 HttpMethod類包含了一組靜態屬性: private stat ......

    uj5u.com 2020-09-09 22:15:23 more
  • 部署WebApi隨筆

    一、跨域 NuGet參考Microsoft.AspNet.WebApi.Cors WebApiConfig.cs中配置: // Web API 配置和服務 config.EnableCors(new EnableCorsAttribute("*", "*", "*")); 二、清除默認回傳XML格式 ......

    uj5u.com 2020-09-09 22:15:48 more
最新发布
  • C#多執行緒學習(二) 如何操縱一個執行緒

    <a href="https://www.cnblogs.com/x-zhi/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2943582/20220801082530.png" alt="" /></...

    uj5u.com 2023-04-19 09:17:20 more
  • C#多執行緒學習(二) 如何操縱一個執行緒

    C#多執行緒學習(二) 如何操縱一個執行緒 執行緒學習第一篇:C#多執行緒學習(一) 多執行緒的相關概念 下面我們就動手來創建一個執行緒,使用Thread類創建執行緒時,只需提供執行緒入口即可。(執行緒入口使程式知道該讓這個執行緒干什么事) 在C#中,執行緒入口是通過ThreadStart代理(delegate)來提供的 ......

    uj5u.com 2023-04-19 09:16:49 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    <a href="https://www.cnblogs.com/huangxincheng/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/214741/20200614104537.png" alt="" /&g...

    uj5u.com 2023-04-18 08:39:04 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    一:背景 1. 講故事 前段時間協助訓練營里的一位朋友分析了一個程式卡死的問題,回過頭來看這個案例比較經典,這篇稍微整理一下供后來者少踩坑吧。 二:WinDbg 分析 1. 為什么會卡死 因為是表單程式,理所當然就是看主執行緒此時正在做什么? 可以用 ~0s ; k 看一下便知。 0:000> k # ......

    uj5u.com 2023-04-18 08:33:10 more
  • SignalR, No Connection with that ID,IIS

    <a href="https://www.cnblogs.com/smartstar/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/u36196.jpg" alt="" /></a>...

    uj5u.com 2023-03-30 17:21:52 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:15:33 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:13:31 more
  • C#遍歷指定檔案夾中所有檔案的3種方法

    <a href="https://www.cnblogs.com/xbhp/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/957602/20230310105611.png" alt="" /></a&...

    uj5u.com 2023-03-27 14:46:55 more
  • C#/VB.NET:如何將PDF轉為PDF/A

    <a href="https://www.cnblogs.com/Carina-baby/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2859233/20220427162558.png" alt="" />...

    uj5u.com 2023-03-27 14:46:35 more
  • 武裝你的WEBAPI-OData聚合查詢

    <a href="https://www.cnblogs.com/podolski/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/616093/20140323000327.png" alt="" /><...

    uj5u.com 2023-03-27 14:46:16 more