1. 程式人生 > >C#中方法引數 ref 與 out 的區別

C#中方法引數 ref 與 out 的區別

方法中引數的型別有三種

  1. in型引數
    in型引數通過值傳遞的方式將數值傳入方法中。即我們在Java中常見的方法

  2. ref型引數
    該種類型的引數傳遞變數地址給方法(引用傳遞),傳遞前變數必須初始化。
    該型別與out型的區別在與:
    1).ref型傳遞變數前,變數必須初始化,否則編譯器會報錯,而out型則不需要初始化
    2).ref型傳遞變數,數值可以傳入方法中,而out型無法將資料傳入方法中。換而言之,ref型有進有出,out型只出不進。

  3. out型引數
    與ref型類似,僅用於傳回結果。
    注意:
    1). out型資料在方法中必須要賦值,否則編譯器會報錯。
    eg:如下圖若將程式碼中的sum1方法的方法體
    改為 a+=b;則編譯器會報錯。原因:out型只出不進,在沒給a賦值前是不能使用的
    改為 b+=b+2;編譯器也會報錯。原因:out型資料在方法中必須要賦值。
    2). 過載方法時若兩個方法的區別僅限於一個引數型別為ref 另一個方法中為out,編譯器會報錯
    eg:如下圖若將程式碼中
    方法名sum1 改為sum(或者將方法名sum改為sum1),編譯器會報錯。
    Error 1 Cannot define overloaded method ‘sum’ because it differs from another method only on ref and out
    原因:引數型別區別僅限於 為ref 與為out 時,若過載對編譯器而言兩者的元資料表示完全相同。

具體區別見程式碼

class C
    {
        //1. in型引數
        public void sum(int a, int b) {
            a += b;
        }
        //2. ref型引數
        public void sum(ref int a, int b)
        {
            a += b;
        }
        //3. out型引數
        public void sum1(out int a, int b)
        {
            a = b+2
; } public static void Main(string[] args) { C c = new C(); int a = 1, b = 2; c.sum(a,b); Console.WriteLine("a:{0}", a); a = 1; b = 2; c.sum(ref a, b); Console.WriteLine("ref a:{0}", a); a = 1
; b = 2; c.sum1(out a, b); Console.WriteLine("out a:{0}", a); } }

輸出結果:
輸出結果
從程式碼也可以看出,in型引數為值傳遞,所以當將變數a傳入方法時,變數a的值並不會發生變化。而ref型引數,由於是引用傳遞,將變數的值和地址都傳入方法中故變數值改變。out型無法將變數的值傳入。但可以將變數的地址傳入併為該地址上的變數賦值。

相關推薦

C#方法引數 ref out區別

方法中引數的型別有三種 in型引數 in型引數通過值傳遞的方式將數值傳入方法中。即我們在Java中常見的方法 ref型引數 該種類型的引數傳遞變數地址給方法(引用傳遞),傳遞前變數必須初始化。

ref out區別

ref 關鍵字會導致引數通過引用傳遞,而不是通過值傳遞。 通過引用傳遞的效果是,對所呼叫方法中的引數進行的任何更改都反映在呼叫方法中。 例如,如果呼叫方傳遞本地變量表達式或陣列元素訪問表示式,所呼叫方法會將物件替換為 ref 引數引用的物件,然後呼叫方的本地變數或陣列元素將開始引用新物件。

C#方法引數的引用傳遞、值傳遞。

一、值型別和引用型別 C# 中的型別一共分為兩類,一類是值型別(Value Type),一類是引用型別(Reference Type)。 值型別包括結構體(struct)和列舉(enu

關於C#refout引數的理解

/*ref與out引數的使用*/using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace conapp_6_out與ref的使用{    //定義類

C#方法參數refout的解析

執行方法 類型 容易 com line 錯誤 pan 系統 pro 一、C#方法中參數類型 有4種參數類型,有時候很難記住它們的不同特征,下圖對它們做一個總結,使之更容易比較和對照。 二、C#方法中的參數 1、值參數 使用值參數,通過復制實參的值到形參的方式把數

C#RefOut區別

ref和out都是C#中的關鍵字,所實現的功能也差不多,都是指定一個引數按照引用傳遞。對於編譯後的程式而言,它們之間沒有任何區別,也就是說它們只有語法區別。 總結起來,他們有如下語法區別: 1、ref傳進去的引數必須在呼叫前初始化,out不必  int i;SomeM

C# Ref out區別

在C#中,有四種傳遞引數方式: 1. 傳值 (value) : 無額外修飾符 2. 傳址(reference) : 需修飾符Ref,傳入函式的引數必須先賦值 3. 輸出引數(output): 需修飾符out,適用於return多個返回值,必須在方法中賦值 4.陣列引數 (ar

C# refout關鍵字解析

參數 logs linq using 如果 .cn cat oid 技術分享 簡介:ref和out是C#開發中經常使用的關鍵字,所以作為一個.NET開發,必須知道如何使用這兩個關鍵字. 1、相同點 ref和out都是按地址傳遞,使用後都將改變原來參數的數值。 2、ref

C#的結構體類的區別

nbsp display 分享 pan ron none 技術分享 初始 title (一) 語法定義上的區別,定義類使用關鍵字class 定義結構使用關鍵字struct (二) 在結構體中可以聲明字段,但是聲明字段的時候是不能給初始值的. C#中的結構體與類的區

【分析】淺談C#Control的InvokeBeginInvoke在主副線程的執行順序和區別(SamWang)

info start result 初步 總結 inter blank rap 傳遞   今天無意中看到有關Invoke和BeginInvoke的一些資料,不太清楚它們之間的區別。所以花了點時間研究了下。   據msdn中介紹,它們最大的區別就是BeginInvoke屬於

關於C# 的布林運算子 "&" "|” 其類似的條件布林運算子 "&&" "||" 區別說明。

運算子使用說明如下:  分隔符 ———————————————————————————— 分隔符 ————————————————————————————   上述兩個運算子的結果與&和 | 完全相同,但得到結果的方式有一個重要區別:其效能比較好。兩者都是檢查第一個運算元的值(表2中的var2)

C++】C++變數的宣告定義的區別

宣告(declaration):意味著告訴編譯器關於變數名稱、變數型別、變數大小、函式名稱、結構名稱、大小等等資訊,並且在宣告階段不會給變數分配任何的記憶體。 定義(definition):定義就是在變數聲明後,給它分配上記憶體。可以看成“定義 = 宣告 + 記憶體分配”。 例如: #includ

java方法的過載重寫的區別

    (1) 父類與子類之間的多型性,對父類的函式進行重新定義。如果在子類中定義某方法與其父類有相同的名稱和引數,我們說該方法被重寫 (Overriding)。在Java中,子類可繼承父類中的方法,而不需要重新編寫相同的方法。 (adsbygoogle = window.ads

python @classmethod 和 @staticmethod區別,以及類方法引數cls和self的區別

staticmethod 首先來看@staticmethod,這個裝飾器很好理解,就是讓類中的方法變成一個普通的函式(因為是普通函式,並沒有繫結在任何一個特定的類或者例項上。所以與不需要物件例項化就可以直接呼叫)。可以使用類或者類的例項呼叫,並且沒有任何隱含引數的傳入,

c++淺復制深復制

using 析構函數 但是 ret code 深拷貝和淺拷貝 pub set 期望 在C++中經常會遇到有關類對象的淺復制與深復制的問題,也是容易出錯的地方。 查找了相關資料,有關淺復制與深復制的定義為:對類進行復制的時候按位復制,即把一個對象各數據成員的值原樣復制到目標對

C++的new/deleteoperator new/operator delete

right urn 你在 () 析構 通用 round memory ora C++中的new、operator new與placement newC++中的new/delete與operator new/operator deletenew operator/delete

C#&和&&的區別

poi log sha 與操作 位運算 orm 第一個 pre 繼續 SiKi老師讓我們自行查一下&和&&的區別,So... 1)&和&&都可以用作邏輯與的運算符,表示邏輯與(and),當運算符兩邊的表達式的結果都為tru

C#的is和as操作符區別小結

devel 獲取 d3d 數據 bottom 技術 datagrid idv center 1. is 是驗證操作對象是不是自己希望的 運算公式:對象 is 類型 返回true:對象是指定類型 返回false:對象不是指定類型 2. as 是將對象轉換成指定類型

C#DateTime的缺陷代替品DateTimeOffset

time 另一個 blog offset gpo 運行環境 fse 規範 unix時間戳 C#中的DateTime在邏輯上有個非常嚴重的缺陷: > var d = DateTime.Now; > var d2 = d.ToUniversalTime(); &g

Java方法遞歸File例題

方法遞歸 File類 不死神兔 遞歸刪除文件 輸出文件後綴名固定的文件絕對路徑 1、有一對兔子,從出生後第3個月起每個月都生一對兔子,小兔子長到第三個月後每個月又生一對兔子,假如兔子都不死,問第二十個月的兔子對數為多少?(不死神兔)(1)數組方式 package 遞歸.作業; publi