C#基本語法學習(八)

来源:http://www.cnblogs.com/numbqq/archive/2016/03/18/5292953.html
-Advertisement-
Play Games

C#中的結構 在C#中用關鍵字struct定義一個結構。從語法上來看,結構與類很相似,在類中可以包含的成員幾乎都可以包含在結構中。例如,結構中可以定義欄位、方法、構造函數、屬性、事件等。定義結構語法如下: 訪問修飾符 struct 結構名 { //結構成員 } 在結構中不能定義預設構造函數(即不帶參


C#中的結構

  在C#中用關鍵字struct定義一個結構。從語法上來看,結構與類很相似,在類中可以包含的成員幾乎都可以包含在結構中。例如,結構中可以定義欄位、方法、構造函數、屬性、事件等。定義結構語法如下:

  訪問修飾符 struct 結構名

  {

    //結構成員

  }

  

 1 public struct MyPoint
 2 {
 3     public int x;
 4     public int y;
 5 
 6     public MyPoint(int a, int b)
 7     {
 8         x = a;
 9         y = b;
10     }
11 }

  在結構中不能定義預設構造函數(即不帶參數的構造函數),但可以定義帶參數的構造函數,如上面代碼定義的結構,定義了帶參數的構造函數。

  定義了結構後就可以在代碼中使用,使用結構的方法可以與使用類的方法相同用new關鍵字創建結構,並調用適當的構造函數;同時與類不同的是,結構的實例化可以不使用 new 運算符。 在此情況下不存在構造函數調用,

  因而可以提高分配效率。 但是,在初始化所有欄位之前,欄位將保持未賦值狀態且對象不可用。

1             MyPoint p1 = new MyPoint();
2             MyPoint p2 = new MyPoint(10, 20);
3             MyPoint p3;
4             p3.x = 100;
5             p3.y = 300;
6 
7             Console.WriteLine("p1.x = {0}, p1.y = {1}", p1.x, p1.y);
8             Console.WriteLine("p2.x = {0}, p2.y = {1}", p2.x, p2.y);
9             Console.WriteLine("p3.x = {0}, p3.y = {1}", p3.x, p3.y);

  結果如下

p1.x = 0, p1.y = 0
p2.x = 10, p2.y = 20
p3.x = 100, p3.y = 300

 

  對於結構,不像類那樣存在繼承。 一個結構不能從另一個結構或類繼承,而且不能作為一個類的基。 但是,結構從基類 Object 繼承。 結構可實現介面,其方式同類完全一樣。

  類是一種引用類型。所謂引用類型,是指變數所包含的是實際數據的地址。而結構是一種值類型,即變數所包含的是實際的數據。引用類型的存儲空間是在堆上分配的,依賴垃圾回收機制釋放所占記憶體;值類型的存儲空間是在堆棧上分配的,當變數

  超出作用域時立即釋放。

  用以下代碼來說明類引用類型和結構值類型的區別

 1             Console.WriteLine("定義結構p1");
 2             MyPoint p1 = new MyPoint(10, 10);
 3             Console.WriteLine("把p1結構賦值給另外兩個結構p2和p3");
 4             MyPoint p2 = p1;
 5             MyPoint p3 = p1;
 6 
 7             Console.WriteLine("修改p2結構的值");
 8             p2.x = 100;
 9             p2.y = 300;
10 
11             Console.WriteLine("修改後結構p1,p2,p3的值分別為:");
12             Console.WriteLine("p1.x = {0}, p1.y = {1}", p1.x, p1.y);
13             Console.WriteLine("p2.x = {0}, p2.y = {1}", p2.x, p2.y);
14             Console.WriteLine("p3.x = {0}, p3.y = {1}", p3.x, p3.y);
15 
16 
17             Console.WriteLine("定義類p11");
18             MyPointClass p11 = new MyPointClass(10, 10);
19             Console.WriteLine("把p11類實例賦值給另外兩個類p22和p33");
20             MyPointClass p22 = p11;
21             MyPointClass p33 = p11;
22 
23             Console.WriteLine("修改p22類實例的值");
24             p22.x = 100;
25             p22.y = 300;
26 
27             Console.WriteLine("修改後類實例p11,p22,p33的值分別為:");
28             Console.WriteLine("p11.x = {0}, p11.y = {1}", p11.x, p11.y);
29             Console.WriteLine("p22.x = {0}, p22.y = {1}", p22.x, p22.y);
30             Console.WriteLine("p33.x = {0}, p33.y = {1}", p33.x, p33.y);

  運行結果

定義結構p1
把p1結構賦值給另外兩個結構p2和p3
修改p2結構的值
修改後結構p1,p2,p3的值分別為:
p1.x = 10, p1.y = 10
p2.x = 100, p2.y = 300
p3.x = 10, p3.y = 10
定義類p11
把p11類實例賦值給另外兩個類p22和p33
修改p22類實例的值
修改後類實例p11,p22,p33的值分別為:
p11.x = 100, p11.y = 300
p22.x = 100, p22.y = 300
p33.x = 100, p33.y = 300

 

  由於以上原因,相對於類來說,結構是一種輕量級的數據類型,適用於表示占用存儲空間較小的數據類型。如果一個數據類型具有以下幾個特點,則可以將其定義為結構:

    1、在邏輯上表示單個值,與基元類型(int、double等)類似

    2、占用記憶體小於16位元組

    3、不必頻繁轉換為引用類型

  用以下代碼測試類與結構的效率

 1             DateTime time1 = DateTime.Now;
 2             Console.WriteLine("創建999999999個結構,開始於" + time1.ToLongTimeString());
 3             for (int i = 0; i < 999999999; i++)
 4             {
 5                 MyPoint p = new MyPoint(10, 10);
 6             }
 7             DateTime time2 = DateTime.Now;
 8             Console.WriteLine("創建999999999個結構,結束於:" + time2.ToLongTimeString());
 9             Console.WriteLine("共耗時: {0}", time2 - time1);
10 
11             time1 = DateTime.Now;
12             Console.WriteLine("創建999999999個類,開始於:" + time1.ToLongTimeString());
13             for (int i = 0; i < 999999999; i++)
14             {
15                 MyPointClass p = new MyPointClass(10, 10);
16             }
17             time2 = DateTime.Now;
18             Console.WriteLine("創建999999999個類,結束於:" + time2.ToLongTimeString());
19             Console.WriteLine("共耗時: {0}", time2 - time1);

  運行結果如下

創建999999999個結構,開始於17:20:35
創建999999999個結構,結束於:17:20:39
共耗時: 00:00:04.0582321
創建999999999個類,開始於:17:20:39
創建999999999個類,結束於:17:20:47
共耗時: 00:00:07.6894398

  可以看出創建結構要比創建類花的時間少。

 

  


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

-Advertisement-
Play Games
更多相關文章
  • 因為總要切換ip,所以百度了一下腳本 如下http://jingyan.baidu.com/article/d2b1d1029d21b95c7e37d4fa.html 動態ip netsh interface ip set address name="本地連接" source=dhcpnetsh i
  • VS2005代碼編輯器的展開和摺疊代碼確實很方便和實用。以下是展開代碼和摺疊代碼所用到的快捷鍵,很常用: Ctrl + M + O: 摺疊所有方法 Ctrl + M + M: 摺疊或者展開當前方法 Ctrl + M + L: 展開所有方法 解決VS2010中工具箱的的不見的問題: 按快捷鍵Ctrl+
  • 先上代碼:
  • 1、MVC的前臺頁面編譯完之後,也會生成一個前臺頁面類。在前天頁面中加入這段代碼this.GetType().Assembly.GetLocation()得到當前類所在的程式集,可以查看其所在的程式,會發現,如果是若類型視圖其繼承的是WebViewPage<object>,而強類型則是機車WebVi
  • 對於一個企業級項目開發,模塊化是非常重要的。 預設Mvc框架的AreaRegistration對模塊化開發已經支持比較好了,還有必要擴展嗎?還能擴展嗎? 本文中的慄子是使用.net4.0、Mvc4.0及Unity2.0(企業庫4.0)的,提供完整源碼。 本分區擴展集成了IoC和分區DI(依賴註入)及
  • NuGet的入門實用教程
  • 協議是指電腦通信網路中兩台電腦之間進行通信所必須共同遵守的規定或規則,超文本傳輸協議(HTTP)是一種通信協議,也就是說一個客戶端和伺服器端請求和應答的標準(基於TCP/IP)。http協議是無狀態的! 目前我們使用的HTTP/1.1版本。 當在瀏覽器地址欄輸入一個url網址(或者IP地址)訪問
  • C#中的介面 在C#中介面是一組公共方法或屬性的集合。介面可以被其他介面或是類繼承,但不能被實例化。 1、介面中包含的屬性和方法都是公共的,不是繼承或是私有的。事實上,在C#中定義介面中的成員時,不允許顯示指定介面成員的可訪問性,而是自動預設為公共的。 2、介面中只能包含普通方法或屬性,而不能包含其
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...