C#中方法引數 ref 與 out 的區別
方法中引數的型別有三種
in型引數
in型引數通過值傳遞的方式將數值傳入方法中。即我們在Java中常見的方法ref型引數
該種類型的引數傳遞變數地址給方法(引用傳遞),傳遞前變數必須初始化。
該型別與out型的區別在與:
1).ref型傳遞變數前,變數必須初始化,否則編譯器會報錯,而out型則不需要初始化
2).ref型傳遞變數,數值可以傳入方法中,而out型無法將資料傳入方法中。換而言之,ref型有進有出,out型只出不進。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#中ref與out引數的理解
/*ref與out引數的使用*/using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace conapp_6_out與ref的使用{ //定義類
C#方法中參數ref和out的解析
執行方法 類型 容易 com line 錯誤 pan 系統 pro 一、C#方法中參數類型 有4種參數類型,有時候很難記住它們的不同特征,下圖對它們做一個總結,使之更容易比較和對照。 二、C#方法中的參數 1、值參數 使用值參數,通過復制實參的值到形參的方式把數
C#Ref與Out的區別
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# ref與out關鍵字解析
參數 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的Invoke與BeginInvoke在主副線程中的執行順序和區別(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/delete與operator 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