日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

c#中使用ref和out传值

發(fā)布時(shí)間:2023/12/13 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c#中使用ref和out传值 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
c#中使用ref和out傳值

首先,如果不使用這兩個(gè)關(guān)鍵字,那是什么樣 呢?
看下面的例子:
使用ref:
using System;
class Test
{
    static void Swap(ref int x, ref int y)
    {
        int temp = x;
        x = y;
        y = temp;
    }
    
    static void Main()
    {
        int i = 1, j = 2;
        Swap(ref i, ref j);
        Console.WriteLine("i = {0}, j = {1}", i, j);         
    }
}

  程序經(jīng)編譯后執(zhí)行輸出:

i = 2, j = 1
不使用:
using System;
class Test
{     
    static void Swap(int x,int y)
    {
        int temp = x;
        x = y;
        y = temp;
    }
    static void Main()
    {
        int i = 1, j = 2;
        Swap(i,j);
        Console.WriteLine("i = {0}, j = {1}", i, j);
    }
}

  程序經(jīng)編譯后執(zhí)行輸出:
i = 1, j = 2;
比較這兩個(gè)里子很明顯,使用了ref關(guān)鍵字的函數(shù)調(diào)用以后,i和j的值變化了.而沒有使用ref的卻沒有變,為什么呢?
請(qǐng)看下面這段話:
  方法的參數(shù)是個(gè)值得特別注意的地方。方法的參數(shù)傳遞有四種類型:傳值(by value),傳址(by reference),輸出參數(shù)(by output),數(shù)組參數(shù)(by array)。傳值參數(shù)無需額外的修飾符,傳址參數(shù)需要修飾符ref,輸出參數(shù)需要修飾符out,數(shù)組參數(shù)需要修飾符params。傳值參數(shù)在方法調(diào)用過程中如果改變了參數(shù)的值,那么傳入方法的參數(shù)在方法調(diào)用完成以后并不因此而改變,而是保留原來傳入時(shí)的值。傳址參數(shù)恰恰相反,如果方法調(diào)用過程改變了參數(shù)的值,那么傳入方法的參數(shù)在調(diào)用完成以后也隨之改變。實(shí)際上從名稱上我們可以清楚地看出兩者的含義--傳值參數(shù)傳遞的是調(diào)用參數(shù)的一份拷貝,而傳址參數(shù)傳遞的是調(diào)用參數(shù)的內(nèi)存地址,該參數(shù)在方法內(nèi)外指向的是同一個(gè)存儲(chǔ)位置。
所以我們可以看出,平時(shí)我們寫的函數(shù)參數(shù)是傳值參數(shù)(傳值參數(shù)無需額外的修飾符),不論他是值類型還是引用類型.你可以試這個(gè)例子(這個(gè)例子是對(duì)"不論他是值類型還是引用類型"這句話,):
using System;
class Test
{     
    static void Swap(string x,string y)
    {
        string temp = x;
        x = y;
        y = temp;
    }
    static void Main()
    {
        string i = "1", j = "2";
        Swap(i,j);
        Console.WriteLine("i = {0}, j = {1}", i, j);
    }
}

  程序經(jīng)編譯后執(zhí)行輸出:
i = "1", j = "2";
注意:string類型是引用類型.
i,j的值并沒有改變,說明引用類型作為函數(shù)參數(shù)時(shí),只要不加ref或者out,那他仍然是傳值參數(shù)(我一直以為值類型作為函數(shù)參數(shù)時(shí)是傳值參數(shù),而引用類型作為函數(shù)參數(shù)時(shí)是傳址參數(shù)).
.net框架程序設(shè)計(jì)(修訂版)上有這樣一句話:ref和out的區(qū)別是參數(shù)的初始化和參數(shù)返回,
可是這里說out是輸出參數(shù),那加out是傳址參數(shù)嗎?要不,怎么也會(huì)變呢(應(yīng)該也是吧,可能他只是一個(gè)名字,可以理解成輸出參數(shù)也是傳址參數(shù))?
using System;
class Test
{
    static void Swap(out int x, out int y)
    {
        int temp = x;
        x = y;
        y = temp;
    }
    
    static void Main()
    {
        int i = 1, j = 2;
        Swap(out i, out j);
        Console.WriteLine("i = {0}, j = {1}", i, j);         
    }
}
程序經(jīng)編譯后執(zhí)行輸出:

i = 2, j = 1
總結(jié):傳值參數(shù)傳遞的是調(diào)用參數(shù)的一份拷貝,而傳址參數(shù)傳遞的是調(diào)用參數(shù)的內(nèi)存地址,該參數(shù)在方法內(nèi)外指向的是同一個(gè)存儲(chǔ)位置.
這句話可以這樣說更加明白:傳值參數(shù)傳遞的是調(diào)用參數(shù)的拷貝的地址,該參數(shù)在方法內(nèi)外指向的不是是同一個(gè)存儲(chǔ)位置,而傳址參數(shù)傳遞的是調(diào)用參數(shù)的內(nèi)存地址,該參數(shù)在方法內(nèi)外指向的是同一個(gè)存儲(chǔ)位置

?

下面是我對(duì)2個(gè)參數(shù)測(cè)試結(jié)果:

??

?

代碼 using?System;
using?System.Collections.Generic;
using?System.Linq;
using?System.Text;

namespace?ref_out
{
????
class?Program
????{
????????
static?void?Main(string[]?args)
????????{
????????????
int?a,?b;
????????????
//使用out傳值前實(shí)參可以不賦值,即使賦值也沒用,也會(huì)被清空
????????????outTest(out?a,?out?b);
????????????Console.Write(
"a={0},b={1}",?a,?b);

????????????
//即使賦值也沒用,也會(huì)被清空
????????????int?c?=?1,?d?=?2;
????????????outTest(
out?c,?out?d);
????????????Console.Write(
"a={0},b={1}",?c,?d);

????????????
//int?e,?f;//錯(cuò)誤:ref使用前,變量必須賦值?
????????????
//ref使用前,變量必須賦值?
????????????int?e?=?1,?f?=?2;
????????????refTest(
ref?e,?ref?f);
????????????Console.WriteLine(
"e={0};f={1}",?e,?f);


????????}
????????
static?void?outTest(out?int?x,?out?int?y)
????????{
????????????
//定義out參數(shù)的時(shí)候就需要對(duì)參數(shù)進(jìn)行賦值,即參數(shù)需要初始化
????????????x?
=?100;?y?=?20;
????????}
????????
static?void?refTest(ref?int?x,?ref?int?y)
????????{
????????????
//x,y?可以不賦值,參數(shù)可以不初始化,把下面注釋掉也可以
????????????x?=?100;?y?=?200;
????????}
????}
}

?

1、使用ref型參數(shù)時(shí),傳入的參數(shù)必須先被初始化。對(duì)out而言,必須在方法中對(duì)其完成初始化。

2、使用ref和out時(shí),在方法的參數(shù)和執(zhí)行方法時(shí),都要加Ref或Out關(guān)鍵字。以滿足匹配。

3、out適合用在需要retrun多個(gè)返回值的地方,而ref則用在需要被調(diào)用的方法修改調(diào)用者的引用的時(shí)候。

?

注:在C#中,方法的參數(shù)傳遞有四種類型:傳值(by value),傳址(by reference),輸出參數(shù)(by output),數(shù)組參數(shù)(by array)。傳值參數(shù)無需額外的修飾符,傳址參數(shù)需要修飾符ref,輸出參數(shù)需要修飾符out,數(shù)組參數(shù)需要修飾符params。傳值參數(shù)在方法調(diào)用過程中如果改變了參數(shù)的值,那么傳入方法的參數(shù)在方法調(diào)用完成以后并不因此而改變,而是保留原來傳入時(shí)的值。傳址參數(shù)恰恰相反,如果方法調(diào)用過程改變了參數(shù)的值,那么傳入方法的參數(shù)在調(diào)用完成以后也隨之改變。實(shí)際上從名稱上我們可以清楚地看出兩者的含義--傳值參數(shù)傳遞的是調(diào)用參數(shù)的一份拷貝,而傳址參數(shù)傳遞的是調(diào)用參數(shù)的內(nèi)存地址,該參數(shù)在方法內(nèi)外指向的是同一個(gè)存儲(chǔ)位置。

方法參數(shù)上的 ref 方法參數(shù)關(guān)鍵字使方法引用傳遞到方法的同一個(gè)變量。當(dāng)控制傳遞回調(diào)用方法時(shí),在方法中對(duì)參數(shù)所做的任何更改都將反映在該變量中。

若要使用 ref 參數(shù),必須將參數(shù)作為 ref 參數(shù)顯式傳遞到方法。ref 參數(shù)的值被傳遞到 ref 參數(shù)。

傳遞到 ref 參數(shù)的參數(shù)必須最先初始化。將此方法與 out 參數(shù)相比,后者的參數(shù)在傳遞到 out 參數(shù)之前不必顯式初始化。

屬性不是變量,不能作為 ref 參數(shù)傳遞。

如果兩種方法的聲明僅在它們對(duì) ref 的使用方面不同,則將出現(xiàn)重載。但是,無法定義僅在 ref 和 out 方面不同的重載。

out

方法參數(shù)上的 out 方法參數(shù)關(guān)鍵字使方法引用傳遞到方法的同一個(gè)變量。當(dāng)控制傳遞回調(diào)用方法時(shí),在方法中對(duì)參數(shù)所做的任何更改都將反映在該變量中。

當(dāng)希望方法返回多個(gè)值時(shí),聲明 out 方法非常有用。使用 out 參數(shù)的方法仍然可以返回一個(gè)值。一個(gè)方法可以有一個(gè)以上的 out 參數(shù)。

若要使用 out 參數(shù),必須將參數(shù)作為 out 參數(shù)顯式傳遞到方法。out 參數(shù)的值不會(huì)傳遞到 out 參數(shù)。

不必初始化作為 out 參數(shù)傳遞的變量。然而,必須在方法返回之前為 out 參數(shù)賦值。

屬性不是變量,不能作為 out 參數(shù)傳遞。

?

posted on 2009-12-15 23:34 搏擊的小船 閱讀(...) 評(píng)論(...) 編輯 收藏

轉(zhuǎn)載于:https://www.cnblogs.com/guanjie20/archive/2009/12/15/1625181.html

總結(jié)

以上是生活随笔為你收集整理的c#中使用ref和out传值的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。