1. 程式人生 > >ref和out的作用和區別

ref和out的作用和區別

相同點:方法的定義和呼叫都必須顯示使用ref、out關鍵字。都會導致引數按引用傳遞。

不同點:傳遞給ref關鍵字的引數必須賦初始值,而out不用。out關鍵字會清空變數,即使變數已經賦值也不行,退出函式時所有out引用個變數都要賦值。

說明:ref的應用場景是內部對外部的值進行改變,而out則是內部對外部變數賦值。out一般用在函式有多個返回值。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace aaa
{
    class Program
    {
        static void Main(string[] args)
        {
            int age = 22;//傳遞給ref定義引數的方法,所以必須賦初始值。
            A a = new A();
            a.GetStr(ref age);
            Console.WriteLine(age.ToString());//導致引數按引用傳遞,所以目標函式會直接更改這個數字。
            int year;////傳遞給out定義引數的方法,不需要賦初始值。
            a.GetTest(out year);
            Console.WriteLine(year.ToString());//導致引數按引用傳遞,所以目標函式會直接更改這個數字。
            Console.Read();
        }
    }
    public class A
    {
        public void GetStr(ref int i)
        {
            i = 0;//ref修飾,可以修改也可以不改。
        }
        public void GetTest(out int i)
        {
            i = 100;//out修飾,必須在退出此方法前為out修飾的變數i賦值。
        }
    }
}

需要指出的是:
1、當我們頻繁傳遞大型引數的時候,比如說DataTable、DataSet...的時候,會節省好多記憶體資源。
2、當我們想得到方法多樣化的處理結果的時候,而我們又不願意複雜化方法所返回的結果,那麼我們可以在方法裡定義多個ref 或者 out,以期得到豐富的結果。比如說,我們呼叫一個方法,要同時得到string、int、double、bool、Array...等幾種不同型別的結果,而return返回object又很複雜的時候,ref 和out的處理效果,看上去將會是多麼的賞心悅目...

相關推薦

refout引數的區別

ref關鍵詞使引數按引用傳遞,其效果是當控制權傳遞迴呼叫方法時,在方法中對引數的任何更改都反應在該變數中。若要使用ref引數,則方法定義和呼叫方法都必須使用ref關鍵詞。傳遞到 ref 引數的引數必須最先初始化。這與 out 不同,out 的引數在傳遞之前不需要顯式初始化。儘

response.getWriter().wirteout.print()的區別

想要 支持 包括 關閉 不能 字符類 僅支持 內置 jspwriter 1、首先介紹write()和print()方法的區別: (1)、write():僅支持輸出字符類型數據,字符、字符數組、字符串等 (2)、print():可以將各種類型(包括Object)的數據通過

轉:JSP中out.write()out.print()的區別

out物件的型別是JspWriter。JspWriter繼承了java.io.Writer類。 1)print方法是子類JspWriter,write是Writer類中定義的方法; 2)過載的print方法可將各種型別的資料轉換成字串的形式輸出,而過載的write方法只能輸出字元、字

intellj idea中target目錄out目錄的區別

out存放的是該專案下所有Module(模組)的編譯結果。 target存放的是單個Module的編譯結果。  在Project Structure中的Project選項卡中可以設定Project compiler output的目錄。  在Modules

define 語句中的 # ## 的作用區別

如題,特此記錄: # 是把引數字串化,## 是將兩個引數連為一個整體。 自己寫了一份測試程式碼,兩者之間的差別清晰可見: #include <iostream> #include <cstdlib> // 測試不帶 # 號的效果 #define

sessioncookie作用原理,區別

Cookie概念       在瀏覽某些 網站 時,這些網站會把 一些資料存在 客戶端 , 用於使用網站 等跟蹤使用者,實現使用者自定義 功能.       是否設定過期時間:   

react native key,ref,bind的作用使用

我們在專案裡面,經常會用的批次渲染,比如一個列表渲染很多個item,或者一個橫排或者豎排同時渲染多個數據。 例如: render1(){     var arr = [];     for(var i=0;i<5;i++){       arr.push( 

JSP中out.printout.wirte的區別,以及out.println的輸出區別

主要區別是 out.print(Object) 其中的引數可以為Object,也就是說什麼都可以輸出。 out.wirte(String) 引數需要為字串,否則輸出的是亂七八糟的東西或者不顯示(不會報錯) 例子如下,順便展示了下println的顯示: <% int

帶你瞭解sessioncookie作用原理區別用法

這篇文章主要介紹了session和cookie的作用原理、區別及用法,以及使用過程中的優缺點,通過列舉erzhi二者之間的區別和原理,讓大家更能輕易理解二者之間的區別,需要的朋友可以參考下,如有問題歡迎

System v Posix作用區別(程序間通訊IPC)

當我們在linux系統中進行程序間通訊時,會有比如共享記憶體(shm),訊號量(sem),訊息佇列(msg)等方式時,會發現有System v以及POXIS兩種不同的型別。 我們探究一下System v和Posix到底代表著什麼意義又有什麼區別。 Posix: Posix(Portable Oper

C/C++ 的巨集中###的作用展開

C/C++ 的巨集中:   (1) # 的功能是將其後面的巨集引數進行字串化操作,簡單說就是在對它所引用的巨集變數通過替換後在其左右各加上一個雙引號。   也就是說:   #define __TO_STRING_IMPL(x) #x   中的#X, 則巨集變數X所引用的是巨集引數中的X,因為,#X會

refout作用區別

相同點:方法的定義和呼叫都必須顯示使用ref、out關鍵字。都會導致引數按引用傳遞。 不同點:傳遞給ref關鍵字的引數必須賦初始值,而out不用。out關鍵字會清空變數,即使變數已經賦值也不行,退出函式時所有out引用個變數都要賦值。 說明:ref的應用場景是內部對

C#:refout的聯系及區別

args c# 區分 div temp 查看 按引用傳遞 影響 bsp 之前學習C#時候就遇到了這個問題,不過當時沒有深究。昨晚想到這個問題時候自己嘗試敲了敲代碼,結果從運行的結果來看,越看越亂。在查看了一些資料的基礎上,自己總結了一下。 可能會有點亂,但是自己總結出來的東

refout區別

在C#中通過使用方法來獲取返回值時,通常只能得到一個返回值。因此,當一個方法需要返回多個值的時候,就需要用到ref和out,那麼這兩個方法區別在哪兒呢? MSDN:       ref 關鍵字使引數按引用傳遞。其效果是,當控制權傳

C#中refout區別

C#中的ref和out提供了值型別按引用進行傳遞的解決方案,當然引用型別也可以用ref和out修飾,但這樣已經失去了意義。因為引用資料型別本來就是傳遞的引用本身而非值的拷貝。ref和out關鍵字將告訴編譯器,現在傳遞的是引數的地址而不是引數本身,這和引用型別預設的傳遞方式是一樣的。 ref和

方法引數修飾符refout區別

out和ref 1)out和ref傳變數的地址(引用地址),形參改變,實參也改變。因為他們都是引用一個地址的; 2)帶ref和out修飾的引數只能傳遞變數不能傳遞常量. 3)out和ref的區別   out修飾的引數必須在方法內修改,而ref可以修改也可以不修改;   ou

C# outref關鍵字的用法區別

說說自己對out、ref的認識,面試問到的機率很高喲。 out: class Program { /* * out、ref都是引用傳遞,傳遞後使用

refout

引用 ram 引用類型 brush temp string emp 之前 pro   ref關鍵字:     是用來修飾形參的,可以將值類型當做引用類型來使用     ref修飾的形參,在方法內部修改的時候,會影響實參的值     ref修飾的形參,在傳參的時候,實參的值可

call() 、 apply() 、bind()方法的作用區別

調用 權威指南 () 使用 func 開始 把他 對象 bsp 從一開始,我是在書上看到關於bind()、call() 和 apply(), 不過長久以來,在工作中與網上接觸到了很多關於這三個方法的使用場景,對這三個方法也算是比較熟悉了。所以把他們的作用和區別簡單闡述一下!

C# refout總結

技術分享 pos 操作 arm 代碼 cnblogs for set href C# 中ref 與 out 總結   參數的傳遞一般分為兩種:一種是“值傳遞”即:傳遞實參的拷貝,既然是拷貝那麽在函數中對這個形參所作的任何動作都不會反映到原來的實參中。另外一種是“引用