C#學習筆記6

来源:http://www.cnblogs.com/zwt-blog/archive/2017/01/19/6305833.html
-Advertisement-
Play Games

1.結構:結構除了可以含有屬性和欄位,還可以包方法和構造器,但不能包含黠認(無參數}的構造器。有的時候(比如在實例化一個數組的時候)不會調用值類型的構造器,因為所有數組記憶體都轉為用零來初始化,為了避免因為預設構造器只是偶爾調用而造成不一致,C#完全禁止了用戶顯式定義預設構造器,因為編譯器會將聲明時的 ...


1.結構:結構除了可以含有屬性和欄位,還可以包方法和構造器,但不能包含黠認(無參數}的構造器。有的時候(比如在實例化一個數組的時候)不會調用值類型的構造器,因為所有數組記憶體都轉為用零來初始化,為了避免因為預設構造器只是偶爾調用而造成不一致,C#完全禁止了用戶顯式定義預設構造器,因為編譯器會將聲明時的實例欄位賦值放到類型的構造器中進行。在構造器中必須對 struct中的所有欄位進行初始化,如果沒有做到這一點,就會產生編譯錯誤,可查看Angle結構的代碼。

2.結構的繼承與介面:所有值類型都是密封的,除此之外,所有值類型都派生自system.ValueType,這意味著struct的繼承鏈息是從object到ValueType到struct。值類型還能實現介面,許多介面都是實現介面框架固定組成部分,比如 IComparilble 和IFormattable。

3.裝箱與拆箱:裝箱就是把值類型變成引用類型,如下:

 (1) 首先在堆中分配好記憶體,它將用於存放值類型的數據以及少許額外開銷;

 (2) 接著發生一次記憶體複製動作,棧上的值類型數據複製到堆上分配好的位置;

 (3) 最後,對象或介面引用得到更新,指向堆上的位置;

  拆箱就是把引用類型變成值類型,如下:根據定義,CIL 指令 unbox 只是對堆上的數據進行解引用,並不包括從堆複製到棧的動作。但在 C#語言中,太多數時候緊接著在拆箱之後發生一次複製動作。裝箱和拆箱之所以重要,是因為裝箱去對性能和行為造成一些影響。開發者可以通過查看CIL,在一個特定的代碼片段中統計 box/unbox 指令的數量。在BoxAndUnbox()中的代碼就存在多次的裝箱與拆箱,這樣編寫的代碼是不合理。

4.枚舉:枚舉和其他值類型稍有不同,因為枚舉的繼承鏈是從System.ValueType到System.Enum,再到enum。

5.枚舉與字元串的轉換:枚舉ToString()後會輸出枚舉標識符,使用Enum.Parse或Enum.TryParse方法可以把字元串轉化為枚舉,後一個方法是.Net4.0新增的泛型方法。此中我們也可以使用Enum.IsDefined()方法來檢查一個值是否包含在一個枚舉中。

6.枚舉作為“位標誌”使用:

(1)可以查看如下“FileAttributes“枚舉的設定(即System.IO。FileAttributes的設定),作為位標誌後,其值可以自由組合,所以可以使用Or運算符來聯結枚舉值。如本示例中BitFlag()方法的使用。當然枚舉中的每個值不一定只對應一個標誌,完全可以為常用的標誌組合定義額外的枚舉值。

(2)使用位標誌類型的時候,位標誌枚舉應該包含[FlagsAttribute]這個特性,這個標誌指出多個枚舉值可以組合使用,此外,它改變了ToString()和Parse()方法的行為。例如為一個已用FlagsAttribute修飾了的枚舉調用ToString()方法,會為已設置的每個枚舉標誌輸出對應的字元串(如BitFlag2()的示例),而如果沒有這個修飾,返回的就是組合後數值。

public struct Angle
{
    public Angle(int hours, int minutes, int seconds)
    {
        Hours = hours;
        Minutes = minutes;
        Seconds = seconds;
    }
    public int Hours { get; set; }
    public int Minutes { get; set; }
    public int Seconds { get; set; }

    public Angle Move(int hours, int minutes, int seconds)
    {
        return new Angle(Hours + hours, Minutes + minutes, Seconds + seconds);
    }
}

[Flags]
public enum FileAttributes
{
    ReadOnly = 1 << 0,
    Hidden = 1 << 1,
    System = 1 << 2,
    Directory = 1 << 3,
    Archive = 1 << 5,
    Device = 1 << 6,
    Normal = 1 << 7,
    Temporary = 1 << 8,
    SparseFile = 1 << 9,
    ReparsePoint = 1 << 10,
    Compressed = 1 << 11,
    Offline = 1 << 12,
    NotContentIndexed = 1 << 13,
    Encrypted = 1 << 14
}

public void BitFlag()
{
    string fileName = @"enumtest.txt";
    FileInfo file = new FileInfo(fileName);
    file.Attributes = FileAttributes.Hidden | FileAttributes.ReadOnly;
    Console.WriteLine("{0} | {1} = {2}", FileAttributes.Hidden, FileAttributes.ReadOnly, (int)file.Attributes);
    if ((file.Attributes & FileAttributes.Hidden) != FileAttributes.Hidden)
    {
        throw new Exception("File is not hidden");
    }
    if ((file.Attributes & FileAttributes.ReadOnly) != FileAttributes.ReadOnly)
    {
        throw new Exception("File is not read-only");
    }
    //....
}

public void BitFlag2()
{
    string fileName = @"enumtest.txt";
    FileInfo file = new FileInfo(fileName);
    file.Open(FileMode.Create).Close();
    FileAttributes startingAttributes = file.Attributes;
    file.Attributes = FileAttributes.Hidden | FileAttributes.ReadOnly;
    Console.WriteLine("\"{0}\" output as \"{1}\"", file.Attributes.ToString().Replace(",", "|"), file.Attributes);
    FileAttributes attributes;
    Enum.TryParse(file.Attributes.ToString(), out attributes);
    Console.WriteLine(attributes);
    File.SetAttributes(fileName, startingAttributes);
    file.Delete();
}

public void BoxAndUnbox()
{
    int totalCount;
    ArrayList list = new ArrayList();
    Console.Write("Enter a number between 2 to 1000:");
    totalCount = int.Parse(Console.ReadLine());
    list.Add((double)0);
    list.Add((double)1);
    for (int i = 2; i < totalCount; i++)
    {
        list.Add((double)list[i - 1] + (double)list[i - 2]);
    }
    foreach (double num in list)
    {
        Console.Write("{0},", num);
    }
}

 

----------------------以上內容根據《C#本質論 第三版》進行整理


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1 塊設備的概述 linux支持的兩種重要的設備類型分別是字元設備和塊設備,塊設備可以隨機地以固定大小的塊傳送數據。與字元設備相比,塊設備有以下幾個特殊之處: (1)塊設備可以從數據的任何位置進行訪問 (2)塊數據總是以固定長度進行傳輸,即便請求的這是一個位元組 (3)對塊設備的訪問有大量的緩存。當進 ...
  • 去埠號功能主要用於Apache與IIS等WEB伺服器共存時,去除功能變數名稱後面所帶的埠 本文案例採用我開發的純綠色PHP集成環境PHPWAMP裡面的“去埠”功能模塊。 案例演示: 點擊常用工具,打開“去掉功能變數名稱非80埠”功能即可 彈出的界面菜單如下圖 如下填寫,功能變數名稱填寫格式abc.com,具體如下圖 ...
  • 最近有學生向我咨詢如何同時建立多個不同PHP版本站點,並自定義任意版本,軟體是否可以多開,PHPWAMP如何設置才能與其他的環境同時使用等問題,本文將一一解決。 簡單介紹一下PHPWAMP 你們應該會經常聽到WAMP這詞吧,那麼WAMP是什麼意思? Windows下的Apache+Mysql+PHP ...
  • phpwamp在伺服器搭建網站,php網站在伺服器上的搭建方式,雲伺服器上如何使用PHP綠色集成環境 ...
  • 1.泛型的約束: (1)介面約束; (2)基類約束,基類約束必須放在第一(假如有多個約束); (3)struct/class約束; (4)多個參數類型的約束,每個類型參數都要用where關鍵字; (5)構造器約束,只能是無參構造器,如new(); (6)約束可以由派生類繼承,但必須在派生類中顯式地指 ...
  • 多線程內容大致分兩部分,其一是非同步操作,可通過專用,線程池,Task,Parallel,PLINQ等,而這裡又涉及工作線程與IO線程;其二是線程同步問題,鄙人現在學習與探究的是線程同步問題。 通過學習《CLR via C#》裡面的內容,對線程同步形成了脈絡較清晰的體繫結構,在多線程中實現線程同步的是 ...
  • 1、設置圖片透明 this.pibox.BackColor = System.Drawing.Color.Transparent; //將背景設置為透明 this.pibox.Parent = lab_show; //將父容器設置為上一層的文件名 2、Timer不起作用 1、先托控制項Timer, 並 ...
  • 1.重寫GetHashCode方法註意點: (1)重寫GetHashCode方法,也應重寫Equals方法,否者編譯器會警告。 (2)相等的對象必須有相等的散列碼(若a.Equals(b),則a.GetHashCode()==b.GetHashCode())。 (3)GetHashCode()不應引 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...