類與結構

目錄

  • 類與結構的實例比較
  • 類與結構的差別
  • 如何選擇結構還是類

類與結構的示例比較

結構示例

public struct Person
{
??? string Name;
??? int? height;
??? int? weight
???
??? public bool overWeight()
??? {
??????? //implement something
}
}

類示例

public class TestTime
{
??? int hours;
??? int minutes;
??? int seconds;
???
??? public void passtime()
??? {
??????? //implementation of behavior
??? }
}

調用過程

public class Test
{
??? public static ovid Main
??? {
??????? Person Myperson=new Person????? //聲明結構
??????? TestTime Mytime=New TestTime??? //聲明類
??? }
}

從上面的例子中我們可以看到,類的聲明和結構的聲明非常類似,只是限定符后面是 struct 還是 class 的區別,而且使用時,定義新的結構和定義新的類的方法也非常類似。那么類和結構的具體區別是什么呢?

類與結構的差別

值類型與引用類型

結構

結構是值類型,值類型在堆棧上分配地址,所有的基類型都是結構類型,例如:int 對應System.int32 結構,string 對應 system.string 結構 ,通過使用結構可以創建更多的值類型。

類是引用類型,引用類型在堆上分配地址。

堆棧的執行效率要比堆的執行效率高,可是堆棧的資源有限,不適合處理大的邏輯復雜的對象。所以結構處理作為基類型對待的小對象,而類處理某個商業邏輯。

因為結構是值類型所以結構之間的賦值可以創建新的結構,而類是引用類型,類之間的賦值只是復制引用。

說明:

  • 雖然結構與類的類型不一樣,可是他們的基類型都是對象(object),C# 中所有類型的基類型都是 Object。
  • 雖然結構的初始化也使用了 new 操作符可是結構對象依然分配在堆棧上而不是堆上,如果不使用“新建”(new),那么在初始化所有字段之前,字段將保持未賦值狀態,且對象不可用。

繼承性

結構

不能從另外一個結構或者類繼承,本身也不能被繼承,雖然結構沒有明確的用 sealed 聲明,可是結構是隱式的 sealed。

完全可擴展的,除非顯示的聲明 sealed,否則類可以繼承其他類和接口,自身也能被繼承。

說明:

  • 雖然結構不能被繼承 可是結構能夠繼承接口,方法和類繼承接口一樣。

    例如:結構實現接口

    interface IImage
    {
    ??? void Paint();
    }
    ?
    struct Picture : IImage
    {
    ??? public void Paint()
    ??? {
    ???????? // painting code goes here
    ??? }
    ???
    ??? private int x, y, z;
    ?? // other struct members
    }

內部結構

結構

  • 沒有默認的構造函數,但是可以添加構造函數
  • 沒有析構函數
  • 沒有 abstract 和 sealed(因為不能繼承)
  • 不能有 protected 修飾符
  • 可以不使用 new 初始化
  • 在結構中初始化實例字段是錯誤的

  • 有默認的構造函數
  • 有析構函數
  • 可以使用 abstract 和 sealed
  • 有 protected 修飾符
  • 必須使用 new 初始化

如何選擇結構還是類

討論了結構與類的相同之處和差別之后,下面討論如何選擇使用結構還是類:

  • 堆棧的空間有限,對于大量的邏輯的對象,創建類要比創建結構好一些。
  • 結構表示如點、矩形和顏色這樣的輕量對象,例如,如果聲明一個含有 1000 個點對象的數組,則將為引用每個對象分配附加的內存。在此情況下,結構的成本較低。
  • 在表現抽象和多級別的對象層次時,類是最好的選擇。
  • 大多數情況下該類型只是一些數據時,結構時最佳的選擇。

----

網友在 CSDN 上的回答:

結構可以看作是輕量級的類,在性能上要好一點。

相同之處:

  • 結構和類對于程序來講都通過指針操作,同樣是面向對象的形式。

不同之處:

  • 結構體對象總是在線程堆棧上操作,而不是托管堆上。
  • 不能繼承一個結構體(所以在調用結構體的方法時不需要查找 vtable: 虛函數繼承表)
  • 我們不能聲明構造函數為空的結構體(不曉得為啥非得要這么設計)
  • 結構體的構造函數內必須初始化所有變量(不曉得為啥非得要這么設計)
  • 結構體的字段不能有默認值(默認都是二進制意義上的零值),但是可以在構造函數內改變“默認值”

.....

按照MSDN上的意思,實際上適合用 struct 的場合很小,結構使用指南:

  • 行為與基元類型一樣。
  • 具有 16 字節以下的實例大小。
  • 是不可改變的。
  • 值語義是合意的。

轉載于:https://www.cnblogs.com/rudy/archive/2009/05/26/1490453.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/276527.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/276527.shtml
英文地址,請注明出處:http://en.pswp.cn/news/276527.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

學習 jQuery 源碼整體架構,打造屬于自己的 js 類庫

雖然現在基本不怎么使用 jQuery了,但 jQuery流行 10多年的 JS庫,還是有必要學習它的源碼的。也可以學著打造屬于自己的 js類庫,求職面試時可以增色不少。本文章學習的是 v3.4.1版本。unpkg.com源碼地址:https://unpkg.com/jquery3…

5分鐘輕松教您如果組建100-500路大型拼接監控系統!

冰山融匯百家號17-07-2700:41大型監控系統如何組網,分布式還是集中式?可靠性與性價比又如何取舍?什么才是最合適的視頻監控存儲產品?在不同地區、行業的項目中,這些疑問均成為業主、專家、系統集成商等各方面共同關注的…

python中beautifulsoup_面向新手解析python Beautiful Soup基本用法

Beautiful Soup就是Python的一個HTML或XML的解析庫,可以用它來方便地從網頁中提取數據。它有如下三個特點:Beautiful Soup提供一些簡單的、Python式的函數來處理導航、搜索、修改分析樹等功能。它是一個工具箱,通過解析文檔為用戶提供需要抓取…

(轉)mssql2005生成表字典

出處不詳 CodeSELECT TOP 100 PERCENT --a.id, CASE WHEN a.colorder 1 THEN d.name ELSE END AS 表名, CASE WHEN a.colorder 1 THEN isnull(f.value, ) ELSE END AS 表說明, a.colorder AS 字段序號, a.name AS 字段名, CASE WHEN COLUMNPROPERTY(a.id, a.name, IsIdenti…

表操作

2019獨角獸企業重金招聘Python工程師標準>>> 字段修改 alter table TA drop partition (day<2018-12-10); ALTER TABLE TB ADD COLUMNS (userStatus String) CASCADE; ALTER TABLE TC change appversion appCommonVersion String CASCADE; ALTER TABLE TD DROP C…

KindEditor js 路徑修改及表單提交注意事項

參考資料&#xff1a;http://www.kindsoft.net/docs/usage.html 在具體項目中&#xff0c;往往需要將js統一管理&#xff0c;如放置同一目錄js中&#xff0c;那么對應的kindeditor的調用腳本也要跟著變&#xff1a; 目錄結構&#xff1a; |--program |--|--html |--|--|--i…

學習underscore源碼整體架構,打造屬于自己的函數式編程類庫

前言上一篇文章寫了 jQuery整體架構&#xff0c;學習 jQuery 源碼整體架構&#xff0c;打造屬于自己的 js 類庫雖然看過挺多 underscore.js分析類的文章&#xff0c;但總感覺少點什么。這也許就是紙上得來終覺淺&#xff0c;絕知此事要躬行吧。于是決定自己寫一篇學習 undersco…

python xlsx 大文件_Python這樣操作能存儲100多萬行的xlsx文件!Python讓你事半功倍!

(1) 如果excel文件是xls&#xff0c;2003版的&#xff0c;使用xlrd和xlwt庫來對xls文件進行操作(2) 如果excel文件是xlsx&#xff0c;2007以上版的&#xff0c;使用openpyxl庫來對xlsx文件進行操作Tips:xlrd、xlwt和openpyxl非python自帶庫&#xff0c;需要進行安裝&#xff0c…

linux 如何在命令行下改系統時間

我們一般使用“date -s”命令來修改系統時間。比如將系統時間設定成2009年6月1日的命令如下。   #date -s 06/01/2009 或#date -s 20090601 將系統時間設定成下午15點43分0秒的命令如下。   #date -s 15:43:00   注意&#xff0c;這里說的是系統…

拓撲目的 1.Pc9通過van3訪問pc10 2.Pc9通過Vlan1\Vlan2訪問pc11

1拓撲圖2設置路由器R12的接口的IPint g0/0/0ip address 192.168.20.254 24undo shutdown int g0/0/01ip address 192.168.1.1 24undo shutdownint g2/0/00ip address 192.168.3.1 24undo shutdown 3設置路由器R10的接口的IPint g0/0/0ip address 192.168.2.1 24undo shutdownin…

PHP 發送Email的幾種方法

轉載鏈接&#xff1a;http://blog.009it.com/php/75.html 在php中發送Email可以直接調用系統的mail()函數來完成&#xff0c;但是前提是你在php.ini文件中對mail都已經配置好了&#xff0c;以下為相關的配置信息&#xff1a; [mail function] ; For Win32 only. SMTP localho…

學習 lodash 源碼整體架構,打造屬于自己的函數式編程類庫

前言這是 學習源碼整體架構系列第三篇。整體架構這詞語好像有點大&#xff0c;姑且就算是源碼整體結構吧&#xff0c;主要就是學習是代碼整體結構&#xff0c;不深究其他不是主線的具體函數的實現。文章學習的是打包整合后的代碼&#xff0c;不是實際倉庫中的拆分的代碼。上上篇…

python數據庫模糊查詢_Python操作mongodb數據庫進行模糊查詢操作示例

本文實例講述了Python操作mongodb數據庫進行模糊查詢操作。分享給大家供大家參考&#xff0c;具體如下&#xff1a;# -*- coding: utf-8 -*-import pymongoimport refrom pymongo import MongoClient#創建連接#10.20.66.106client MongoClient(10.20.4.79,27017)#client Mong…

推薦一個快速反射調用的類

使用傳統的.net反射機制&#xff0c;調用類的方法時&#xff0c;在調用頻率大的情況下&#xff0c;會感覺速度很慢。最近瀏覽盧彥的博客時&#xff0c;找到一個他改進后的反射調用類。試用以后感覺效率明顯提高&#xff0c;特推薦給大家。作者重新實現了&#xff0c;反射調用方…

CMake 構建項目Android NDK項目基礎知識

本篇文章將介紹如何使用 CMake 構建實現你的第一個 NDK 項目。 ##前言 你好&#xff01;歡迎來到我的的學習筆記分享系列&#xff0c;第一次給大家分享的是 Android NDK 開發的學習筆記&#xff0c;讓我們先開始了解 NDK 的構建方式吧&#xff01; NDK 構建方式有兩種&#xff…

linux installaccess Nessus-5.2.4

1、Download: http://www.tenable.com/products/nessus/select-your-operating-system 2、Current version&#xff1a;Nessus-5.2.4-debian6_i386.deb 3、Install&#xff1a;dpkg -i Nessus-5.2.4-debian6_i386.deb # dpkg -i Nessus-5.2.4-debian6_i386.deb Selecting p…

面試官問:JS的繼承

原文作者若川&#xff0c;掘金鏈接&#xff1a;https://juejin.im/post/5c433e216fb9a049c15f841b寫于2019年2月20日&#xff0c;現在發到公眾號聲明原創&#xff0c;之前被《前端大全》公眾號等轉載閱讀量超1w&#xff0c;知乎掘金等累計閱讀量超過1w。導讀&#xff1a;文章主…

qt 快速按行讀取文件_這是知識點之Linux下分割文件并保留文件頭

點擊上方"開發者的花花世界"&#xff0c;選擇"設為星標"技術干貨不定時送達&#xff01;這是一個知識點方便快捷的給結構化數據文件分割大小并保留文件的表頭&#xff0c;幾十個G的結構化文件不僅閱讀編輯麻煩&#xff0c;而且使用受限&#xff0c;因此高效…

mono 調用windows webService

1. 實現linux mono Develop中調用windows 中的webService l linux 與 windows 在一個局域網的網段中 l windows 的IIs中發布webService 2. windows 中的設置 l webService 的代碼 using System; using System.Collections.Generic; using System.Linq; using S…

Linux 內存機制

轉載鏈接&#xff1a;http://blog.csdn.net/tianlesoftware/article/details/5463790 一. 內存使用說明 Free 命令相對于top 提供了更簡潔的查看系統內存使用情況&#xff1a; [rootrac1 ~]# free total used free shared buffers cached Mem: …