日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

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

.net框架读书笔记---引用参数(ref/out)

發(fā)布時間:2025/4/16 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .net框架读书笔记---引用参数(ref/out) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

接上一篇.net框架讀書筆記---方法(類型造器)

  默認(rèn)情況下,CLR假設(shè)所有的方法參數(shù)都是按值傳遞參數(shù)的。當(dāng)參數(shù)為引用類型的對象時,參數(shù)的傳遞是通過傳遞對象的引用(或)指針來完成的。這意味著方法可以改變引用對象,并且調(diào)用代碼可以看到這種改變的結(jié)果。

  對于值類型實例的參數(shù)來說,傳遞給方法的將是值類型實例的一個拷貝。這意味著方法會得到一份屬于它自己的值類型實例的成員。而調(diào)用方法的代碼中的實例不會受到影響。

  除了按值傳遞參數(shù)外,CLR還允許我們按引用的方式來傳遞參數(shù).在C#中可以使用out和ref關(guān)鍵字來做到這一點。out和ref的區(qū)別是:

  • ?一個方法的參數(shù)被標(biāo)識為out,那么調(diào)用代碼在調(diào)用該方法之前可以不初始化該參數(shù),并且調(diào)用方法不能直接讀取參數(shù)的值,它必須在返回之前為該參數(shù)賦值。
  • 一個方法的參數(shù)被表示為ref,那么調(diào)用代碼在調(diào)用該方法前必須首先初始化該參數(shù)。被調(diào)用方法可以任意讀取該參數(shù)、或者為該參數(shù)賦值。

  out關(guān)鍵字示例:

代碼 class Program
{
static void Main(string[] args)
{
int x;//x不必初始化
SetVal(out x);
Console.WriteLine(x);
//顯示為10

}

static void SetVal(out int v)
{
// int x = v;//該行代碼會報錯
v = 10;//SetVal方法必須初始化v;
}
}

?

  上面代碼中,x首先被聲明在線程堆棧上。接著,x的地址被傳遞給SetVal。SetVal的參數(shù)v是一個指向int值類型的指針。在SetVal內(nèi)部,v指向的int被賦值為10.當(dāng)SetVal返回后,Main中的x的值為10,在值類型參數(shù)上使用out會提高代碼的效率,因為它避免l哦值類型的字段在方法調(diào)用時的拷貝操作。

ref關(guān)鍵字示例:

代碼 class Program
{
static void Main(string[] args)
{
int x=5;//x必須初始化
AddVal(ref x);
Console.WriteLine(x);
//顯示為15

}

static void AddVal(ref int v)
{
int x = v;//addVal方法可以直接使用經(jīng)過初始化的v而不報錯
v += 10;
}

}

?

  上面代碼中,x首先被聲明在線程堆棧上,緊接著被初始化為5,隨后x的地址被傳遞給AddVal,AddVal的參數(shù)是一個指向int值類型的指針。在AddVal內(nèi)部,v指向的必須是一個結(jié)果初始化的值,這樣AddVal才可以在任何表達(dá)式中使用該初始值。當(dāng)AddVal返回后,Main中x的值將為15;

  CLR允許根據(jù)out和ref參數(shù)來重載方法,下面代碼合法:

public class Point
{
static void Add(Point p) { }
static void Add(ref Point p) { }
}

?

還有:

public class Point
{
static void Add(Point p) { }
static void Add(out Point p)
{
p
= new Point();//必須給out參數(shù)賦值
}
}

?

但是,僅僅通過out和ref來區(qū)分重載方法是不合法的,下面代碼編譯它不過:

public class Point
{
static void Add(ref Point p) { }
static void Add(out Point p)
{
p
= new Point();//必須給out參數(shù)賦值
}
}

?

因為經(jīng)過jit編譯后打代碼是相同的。

  在值類型參數(shù)上使用out和ref關(guān)鍵字與用傳值的方式來傳遞引用類型的參數(shù)在某種程度上具有相同的行為,前一種情況,out和ref關(guān)鍵字允許被調(diào)用方法直接操作一個值類型實例,調(diào)用代碼必須為該實例分配內(nèi)存,被調(diào)用方法操作該內(nèi)存。對于后一種情況,調(diào)用代碼為引用類型對象分配內(nèi)存,而被調(diào)用方法通過傳入的引用(指針)來操作對象。看下面代碼:

代碼 class Program
{
static void Main(string[] args)
{
FileStream fs;
//打開第一個文件
StartProcessingFiles(ref fs);
for (; fs != null; ContinueProcessingFiles(ref fs))
{
//處理文件
fs.Read();
}
}

static void StartProcessingFiles(ref FileStream fs)
{
fs
= new FileStream();
}

static void ContinueProcessingFiles(ref FileStream fs)
{
fs.Close();
//關(guān)閉上一次操作的文件

//打開下一個文件,沒有返回null
if (noFiles)
fs
= null;
else
{
fs
= new FileStream();
}
}
}

?

該代碼最大的不同在于有著out和ref修飾的引用類型參數(shù)的方法創(chuàng)建一個對象后,指向新對象的指針會返回到調(diào)用代碼。

  下面代碼演示了使用ref來交換兩個引用:

static public void Swap(ref object a, ref object b)
{
object c = a;
a
= b;
b
= c;
}

?

  CLR為了確保類型安全,按引用傳遞的變量必須和方法聲明的參數(shù)類型完全相同,如下面代碼將會報錯:

代碼 class Program
{
static void Main(string[] args)
{
string s1 = "heaiping";
string s2 = "hap";
Swap(
ref s1, ref s2);

}



static public void Swap(ref object a, ref object b)
{
object c = a;
a
= b;
b
= c;
}
}

?

因為object和string不匹配,要編譯同步代碼必須修改為:

代碼 class Program
{
static void Main(string[] args)
{
string s1 = "heaiping";
string s2 = "hap";
Swap(
ref s1, ref s2);
Console.WriteLine(s1);
Console.WriteLine(s2);
}



static public void Swap(ref string a, ref string b)
{
string c = a;
a
= b;
b
= c;
}
}

?

修正后編譯通過并得到期望值。

轉(zhuǎn)載于:https://www.cnblogs.com/sanjia/archive/2010/04/27/1722533.html

總結(jié)

以上是生活随笔為你收集整理的.net框架读书笔记---引用参数(ref/out)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 中文字幕在线播 | 国产精品一区二区三区在线免费观看 | 韩国伦理片在线播放 | 毛片一二三区 | 亚洲精选一区二区 | 色婷婷av777 麻豆传媒网站 | 伊人网综合视频 | 日韩欧美一区二区区 | 久久精品国产亚洲av高清色欲 | 黄色激情在线 | 干夜夜 | 人人妻人人玩人人澡人人爽 | 亚洲AV无码一区二区三区蜜桃 | 高级家教课程在线观看 | 夜操操 | 四虎午夜 | 亚洲乱码国产乱码精品 | jzzijzzij亚洲成熟少妇18 欧美www在线观看 | 日本一二三区在线视频 | 午夜精品成人毛片非洲 | 无套内谢的新婚少妇国语播放 | 国产乱淫av| 中文在线播放 | 极品尤物魔鬼身材啪啪仙踪林 | 国产在线欧美日韩 | 国产午夜在线一区二区三区 | 精品久久久久久久无码 | 理论片一级| 超碰免费在线播放 | 久久在线免费视频 | 国产外围在线 | 福利片av| 亚洲免费看黄 | 国产美女免费 | 欧美r级在线 | 在线观看免费日韩av | 久久1234 | av在线播放器 | 欧美精品xx| 国产一级免费 | 久久久亚洲一区二区三区 | 亚洲字幕成人中文在线观看 | 国产九九九精品 | 免费毛片一区二区三区久久久 | 国产人澡人澡澡澡人碰视频 | 久久精品视频国产 | 亚洲人av在线 | 人妻夜夜爽天天爽三区麻豆av网站 | 欧美色图亚洲视频 | 涩涩在线播放 | 亚洲v视频 | 糖心logo在线观看 | 夜色一区二区三区 | 2022国产精品 | 国产xxx视频| 美丽的姑娘在线观看 | 国产精品无码AV | 日韩夜夜高潮夜夜爽无码 | 久久久久久久一区二区三区 | 亚洲视频网站在线观看 | 亚欧洲精品在线视频免费观看 | 去毛片 | 麻豆视频传媒入口 | 99热网 | 国产熟女一区二区丰满 | 欧美一区二区三区国产 | 精品福利电影 | 久久久久久网址 | 亚洲激情偷拍 | 国产伦一区二区 | 涩av| 久久偷看各类女兵18女厕嘘嘘 | 成人快色| 99久久久久 | 亚洲欧美日韩中文在线 | 最近中文字幕免费mv视频7 | 午夜精品久久久久久久99 | 免费jizz| caoporm超碰 | 人人爱爱人人 | 裸体av淫导航 | www网站在线免费观看 | jizz成人 | 在线看av的网址 | 亚洲第一视频在线观看 | 72pao成人国产永久免费视频 | 国产精品国产三级国产三级人妇 | 在线观看黄色的网站 | 妓院一钑片免看黄大片 | 伊人影院99 | 奇米网888 | 人人操在线播放 | 在线观看h视频 | 久操热线| 国产精品三级久久久久久电影 | 欧美三级 欧美一级 | 日韩综合网站 | 久久久黄色片 | 艳情五月|