談談 c# 對象初始化問題

来源:https://www.cnblogs.com/guhuazhen/archive/2019/07/09/11155362.html
-Advertisement-
Play Games

C#對象初始化 之前在學習過程中只是知道該如何初始化對象,但是卻不明白為何要這麼做,不這麼做有什麼問題。 現在就針對我最近遇到的問題(定義了全局位元組數組沒有初始化,然後在多線程裡頭使用,然後就一直報null的錯誤,一開始也沒有想到是初始化的問題,就一直以為是通訊中斷,數組沒有賦值成功,調了一段時間, ...


C#對象初始化 

之前在學習過程中只是知道該如何初始化對象,但是卻不明白為何要這麼做,不這麼做有什麼問題。

現在就針對我最近遇到的問題(定義了全局位元組數組沒有初始化,然後在多線程裡頭使用,然後就一直報null的錯誤,一開始也沒有想到是初始化的問題,就一直以為是通訊中斷,數組沒有賦值成功,調了一段時間,檢查了一下代碼,發現位元組數組沒有初始化,然後把它初始化之後試了一下還真是),在這裡給大家分享一下。

初始化定義:

初始化在電腦編程領域中指為數據對象或變數賦初值的做法,如何初始化則取決於所用的程式語言以及所要初始化的對象的存儲類型等屬性。用於進行初始化的程式結構則稱為初始化器或初始化列表。初始化和變數聲明是有明顯區別的,而且變數聲明也先於初始化進行,但兩者在實踐中仍常被混淆。

一、關於使用new做了哪些事情呢 ?

1、 在 棧記憶體為引用開闢空間
2、 在 堆記憶體為對象開闢空間
3、 對 對象的成員變數進行 預設初始化  //預設初始化為null
4、 對 對象的成員變數進行 顯示初始化  //賦予初始值
5、 通過 構造方法對 對象的成員 變數賦值
6、 對象初始化完畢,把對象地址賦值給引用變數

 

二 、變數聲明後和變數賦值為null或變數調用了new的區別。

主要區分函數中的變數和對象中的欄位的區別。

  1、變數聲明後,沒有進行賦值的含義:

    聲明未賦值,會無法生成,提示‘使用了未賦值的變數’。

    通過Reflecter可以看到,聲明變數未賦值,實際是不存在的,那麼就是說沒有進行分配記憶體。

2、變數賦值為null

表明變數具有記憶體空間,但是記憶體中什麼也不存在。

3、變數調用new

變數中存在了對象也就是存在了欄位,只是欄位進行了賦值,賦值為預設值。

C# 引用類型和值類型

1、引用類型

FCL(Framework)中的大多數類型都是引用類型,引用類型總是在托管堆中分配的,C#的new操作符會返回對象的記憶體地址,也就是指對象數據的記憶體地址。在使用引用類型時,存在以下性能問題,這是我們在開發中必須要註意的:

a、記憶體必須從托管堆上分配(也就是說每new一個對象,會占用記憶體,對象過多就會導致記憶體占用)

b、 堆上分配的每個對象都有一些額外的成員,這些成員必須初始化

c、對象中的其他位元組(為欄位而設),總是設為0

d、從托管堆中每分配一個對象,可能強制執行一次垃圾回收操作

所以當我們的應用程式中都是引用類型時,應用程式的性能會顯著下降。

2、值類型

上面介紹了引用類型,知道了當從托管堆中每分配一個對象時,都會造成應用程式性能的下降。設想當使用Int32類型初始化一個數字6或者使用float初始化一個浮點數6.6的時候,都進行一次記憶體的分配,那麼應用程式的性能會受到嚴重的影響.為了提供應用程式的性能,CLR提供了名為"值類型"的輕量級類型.

關於值類型和引用類型相信你們會遇到裝箱拆箱的問題。

我暫時沒時間去寫,這些博客寫的蠻好的,你們可以參考一下。

https://www.cnblogs.com/liqingwen/p/6486332.html

https://www.cnblogs.com/kdp0213/p/8533408.html

ok,今天分享就到這裡,有問題的或者有建議的歡迎留言提出!!!

 


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

-Advertisement-
Play Games
更多相關文章
  • 之前面了騰訊的提前批,不過沒走流程。同期還面了阿裡的兩輪面試,被告知不走流程就不能面了,所以也沒面完。 後來走了京東這邊的流程。前幾天剛剛面完HR。 正好今天分享一下麵經,大家可以多交流交流哈。 京東面經 第一輪:電話初面 第二輪:技術面談 第三輪:高管覆試 第四輪:HR最後確認 第一輪電話初面: ...
  • 在這一篇文章(abp(net core)+easyui+efcore實現倉儲管理系統——展現層實現增刪改查之列表視圖(七))中我們創建一個使用Razor視圖引擎的視圖模板文件,Razor視圖模板文件的擴展名為.cshtml,並提供一種比較優雅的方式使用C#來創建HTML輸出。Razor視圖模板減少了... ...
  • 最近在學習WCF通信,自己簡單做個實例分享一下,環境是VS2015,使用的項目都是WPF的項目,其實大家用Winform或者Web項目也可以,都可以用的。 一、伺服器端 1、創建WCF服務 服務名為WCFServer,而後自動生成如下兩個文件,IMyWCFServer為服務契約介面,MyWCFSer ...
  • 題目描述 跳臺階:一隻青蛙一次可以跳上1級臺階,也可以跳上2級。求該青蛙跳上一個n級的臺階總共有多少種跳法(先後次序不同算不同的結果)。變態跳臺階:一隻青蛙一次可以跳上1級臺階,也可以跳上2級……它也可以跳上n級。求該青蛙跳上一個n級的臺階總共有多少種跳法。矩形覆蓋:我們可以用21的小矩形橫著或者豎 ...
  • LnskyDB是基於Dapper的Lambda擴展,支持按時間分庫分表,也可以自定義分庫分表方法.而且可以T4生成實體類免去手寫實體類的煩惱. v2.0版本支持多表查詢了 ...
  • 題目描述 大家都知道斐波那契數列,現在要求輸入一個整數n,請你輸出斐波那契數列的第n項(從0開始,第0項為0)。 n<=39 解題思路 遞推公式f(n)=f(n)= 當n=0=0,當n=0 當n=1=1,當n=1 其他=f(n−1)+f(n−2)看到這大家很容易想起遞歸,課堂上老師講遞歸的時候的經典 ...
  • 1 目錄 1 目錄 2 前言... 3 2.1 編寫目的... 3 2.2 適用範圍... 4 3 命名規範... 4 3.1 命名約定... 4 3.1.1 PascalCasing. 4 3.1.2 camelCasing. 4 3.1.3 UPPER_CAPS. 4 3.1.4 私有變數的命名 ...
  • 一、背景 最近一直在看docker的教程,基礎知識看的差不多了。理論總要運用於實踐,所以下麵我們就來把最簡單的一個netcore網站托管到docker容器中。 環境:1、docker for windows 2、 .net core 2.2 二、創建一個簡單的netcore網站 2.1 使用 命令創 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...