5.C#知識點:ref和Out關鍵字淺談

来源:http://www.cnblogs.com/DingKing/archive/2017/12/22/8087705.html
-Advertisement-
Play Games

首先我們要知道ref和out在C#裡面是什麼? 答:它們倆是C#裡面的關鍵字。 他們倆是幹啥的呢? 答:他們倆是方法參數的修飾符號,一但使用,方法定義和方法都用都要使用這個關鍵字,這一點是死規定。 好了廢話不多說,既然是修飾符,使用了他們一定是要有意義的對吧。我們先來看一手微軟官方定義。 如果大家通 ...


首先我們要知道ref和out在C#裡面是什麼?

答:它們倆是C#裡面的關鍵字。

他們倆是幹啥的呢?

答:他們倆是方法參數的修飾符號,一但使用,方法定義和方法都用都要使用這個關鍵字,這一點是死規定。

好了廢話不多說,既然是修飾符,使用了他們一定是要有意義的對吧。我們先來看一手微軟官方定義。

如果大家通過上面微軟官方的定義明白了這個參數。那很好,下麵的我寫的就不需要看啦!還有疑惑就繼續往下看。保證你能懂。

這裡我先不直接講解,我先掏出一手代碼,然後通過代碼講解。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ref和outTest
{
    class Program
    {
        static void Main(string[] args)
        {
            int i = 0;
            Test(i);
            Console.WriteLine(i.ToString());
            Console.ReadKey();
        }
        static void Test(int i)
        {
            i++;
            Console.WriteLine(i.ToString());
            
        }
    }
}

  這代碼沒啥含量,學過代碼都看到懂的,就是定義個i變數,然後調用Test方法,方法裡面對i進行+1的操作然後列印i的值,main函數里也列印一次i的值。

結果大家應該也都知道 方法裡面列印的是main方法列印的是0,方法裡面是1。

  因為預設情況下,我們方法傳遞變數預設是是"值傳遞"的方式。這是什麼意思呢?說到這裡要先解釋下引用類型和值類型,可以看我的一篇博客----->傳送門。我這裡簡單說下。引用類型的值存的是指向對象本身或者值的地址,值類型的變數存的是對象的本身或者是值。一個經典的比喻,值類型就是報紙,引用類型就是網頁。我看報紙就要買一份報紙。我得到的就是實際的報紙,但是我瀏覽網頁只要輸入一個Url地址。Url指向了實際網站內容。

  解釋完畢,我們再把思路拉回來,我們說方法傳遞的變數預設是"值傳遞"。就是說我報紙看的哈哈大笑,這時候小明也想看。我就又買了一份給他。但是我們看的內容是一樣的。但是我的報紙還是我的報紙。小明看完報紙就撕了報紙都不影響我,值傳遞就是方法的變數的值傳遞值之後。不論方法裡面對這個值進行了什麼操作。都不影響我方法外面的i。所以這個地方輸出的結果是 1和0

 

我覺得上面應該講的還挺易懂的吧,還有疑問算我失敗。

接下來我們加上Ref關鍵字了,改一手代碼

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ref和outTest
{
    class Program
    {
        static void Main(string[] args)
        {
            int i = 0;
            Test(ref i);
            Console.WriteLine(i.ToString());
            Console.ReadKey();
        }
        static void Test(ref int i)
        {
            i++;
            Console.WriteLine(i.ToString());
            
        }
    }
}

ref關鍵字,文章的開頭微軟的官方解釋已經說明瞭。使用了Ref參數之後,方法參數的傳遞是按"引用傳遞"的,"引用傳遞"什麼意思上面講解我也解釋了。舉個例子,這就比如我看到某某網站不順眼。就找了一個黑客,然後把網站地址告訴了黑客,讓它幫我黑了這個網站。讓黑客在網站的首頁顯示"一小時小超人最帥的字",要特大號顯示,那黑客就會通過我給的Url黑了這個網站的伺服器。然後我一刷新網頁。這個網頁就顯示了"一小時小超人最帥"。

這個代碼也是一樣。加了ref 之後 i變數傳遞是對象的引用也是網頁的Url,方法內部修改是通過這個地址找了真的值然後進行修改,所有外面的i也發生了變化。

講到這裡大家應該明白了吧。

out關鍵字和ref 都是使變數通過引用傳遞。這一點他們是一樣的。唯一的不通就是。ref的參數必須在調用方法前就初始化。而out參數必須在方法內部初始化。通過這一點的不同通他們的應用場景也就不同了。

場景一個 有個程式是 中國人民幣的匯率進行換算。現在有10塊錢。要通過一個方法進行換算。這個時候就應該用ref。因為這個10塊錢初始值很重要對吧。我必須在方法外面就要定義我的人民幣是多少錢。

場景二就是 int.TryPase(參數1, out 參數2)這個C#轉換方法,通過參數1,將參數2轉換為int類型。這個時候參數2的初始值是多少就沒有意義了是吧,因為它最後計算的結果,是跟參數1的值有關係,跟它初始值的沒有一毛錢的關係的。所以這個地方應該用out。

Ok。講到這裡就結束了哈。

如果剛開始學習的小伙伴還有疑問的話,可以評論咱們一起學習。

如果哪位大牛隨便瞄到個錯誤,也請告之我,讓我能夠進步。

對了out的代碼沒有,是因為兩個語法是一樣的。

 


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

-Advertisement-
Play Games
更多相關文章
  • 0引言 隨著萬維網的發展和大數據時代的到來,每天都有大量的數字化信息在生產、存儲、傳遞和轉化,如何從大量的信息中以一定的方式找到滿足自己需求的信息,使之有序化並加以利用成為一大難題。全文檢索技術是現如今最普遍的信息查詢應用,生活中利用搜索引擎,在博客論壇中查找信息,這些搜索的核心原理就是本文要實現的 ...
  • 開始爬蟲之旅。 認識爬蟲 網路爬蟲(又被稱為網頁蜘蛛,網路機器人,spider),是一種按照一定的規則,自動地抓取互聯網信息的程式或者腳本。通俗的講就是通過程式自動去獲取web頁面上自己想要的數據。 主要就是模擬瀏覽器打開網頁,獲取網頁中我們想要的那部分數據。 簡單的說一下瀏覽器打開網頁的過程:在瀏 ...
  • mybatis generator-自動生成代碼 準備材料: 一個文件夾,一個資料庫的驅動包,mybatis-generator-core-1.3.5.jar,一條生成語句 如圖:(我用的是derby資料庫,使用其他資料庫需修改相應的jar驅動包) generatorConfig.xml文件 可以根 ...
  • 1.E:創建nodejs文件夾 2.先配置npm的全局模塊的存放路徑以及cache路徑: npm config set prefix "E:\nodejs\node_global" npm config set cache "D:\nodejs\node_cache" 3.安裝express模塊 n ...
  • DWZ的樹結構是按,的嵌套格式構成,最頂級的以class=”tree”標識。 treeFolder, treeCheck, expand|collapse則為可選的。 treeFolder:在所有樹節點前加上Icon圖標。 treeCheck:在所有樹節點前加上checkbox, expand表示樹... ...
  • 瞭解HTTP(超文本傳輸協議)可以知道,它採用請求與響應的模式,最大的特點就是無連接無狀態。 無連接:每次連接僅處理一個客戶端的請求,得到伺服器響應後,連接就結束了 無狀態:每個請求都是獨立的,伺服器無法識別和區分它們的身份 這就造成了一個問題,在不同網頁之間如何傳遞信息,會話控制的思想就是為瞭解決 ...
  • 基於python單元測試框架unittest完成appium自動化測試,生成基於html可視化測試報告 代碼示例: 生成測試報告: Appium自動化測試PO模型: 其中,main.py為框架的主入口,test_creat.py調用creat_page.py,creat_page.py調用base_ ...
  • 在CI/CD流行至極的今天,你的項目沒有自動化測試絕對是不可以接受的,在進行自動化部署和持續集成時,我們的dotnet core項目也是可以實現自動化的,之前說過gitlab,jenkins對持續集成的影響,而今天說一下微觀點的概念,“單元測試”,這個早已不是什麼新東西了,像dotnet平臺也有自己 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...