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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > C# >内容正文

C#

C#中的引用传递、值传递

發(fā)布時間:2025/3/15 C# 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#中的引用传递、值传递 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、傳遞參數(shù)

  既可以通過值也可以通過引用傳遞參數(shù)。通過引用傳遞參數(shù)允許函數(shù)成員(方法、屬性、索引器、運算符和構(gòu)造函數(shù))更改參數(shù)的值,并保持該更改。

二、傳遞值類型參數(shù)

?  值類型變量直接包含其數(shù)據(jù),這與引用類型變量不同,后者包含對其數(shù)據(jù)的引用。因此,向方法傳遞值類型變量意味著向方法傳遞變量的一個副本。方法內(nèi)發(fā)生的對參數(shù)的更改對該變量中存儲的原始數(shù)據(jù)無任何影響。如果希望所調(diào)用的方法更改參數(shù)的值,必須使用?ref?或?out?關(guān)鍵字通過引用傳遞該參數(shù)。為了簡單起見,下面的示例使用?ref

  1.?通過值傳遞值類型

代碼 class PassingValByVal
{
static void SquareIt(int x)
// The parameter x is passed by value.
// Changes to x will not affect the original value of x.
{
x
*= x;
System.Console.WriteLine(
"The value inside the method: {0}", x);
}
static void Main()
{
int n = 5;
System.Console.WriteLine(
"The value before calling the method: {0}", n);

SquareIt(n);
// Passing the variable by value.
System.Console.WriteLine("The value after calling the method: {0}", n);
}
}

變量?n?為值類型,包含其數(shù)據(jù)(值為?5)。當(dāng)調(diào)用?SquareIt?時,n?的內(nèi)容被復(fù)制到參數(shù)?x?中,在方法內(nèi)將該參數(shù)求平方。但在?Main?中,n?的值在調(diào)用?SquareIt?方法前后是相同的。實際上,方法內(nèi)發(fā)生的更改只影響局部變量?x。

2.通過引用傳遞值類型

下面的示例除使用?ref?關(guān)鍵字傳遞參數(shù)以外,其余與上一示例相同。參數(shù)的值在調(diào)用方法后發(fā)生更改

代碼 class PassingValByRef
{
static void SquareIt(ref int x)
// The parameter x is passed by reference.
// Changes to x will affect the original value of x.
{
x
*= x;
System.Console.WriteLine(
"The value inside the method: {0}", x);
}
static void Main()
{
int n = 5;
System.Console.WriteLine(
"The value before calling the method: {0}", n);

SquareIt(
ref n); // Passing the variable by reference.
System.Console.WriteLine("The value after calling the method: {0}", n);
}
}

?

本示例中,傳遞的不是?n?的值,而是對?n?的引用。參數(shù)?x?不是?int?類型,它是對?int?的引用(本例中為對?n?的引用)。因此,當(dāng)在方法內(nèi)對?x?求平方時,實際被求平方的是?x?所引用的項:n。

?

  3.?交換值類型

更改所傳遞參數(shù)的值的常見示例是?Swap?方法,在該方法中傳遞?x?和?y?兩個變量,然后使方法交換它們的內(nèi)容。必須通過引用向?Swap?方法傳遞參數(shù);否則,方法內(nèi)所處理的將是參數(shù)的本地副本。以下是使用引用參數(shù)的?Swap?方法的示例:
static void SwapByRef(ref int x, ref int y)
{
int temp = x;
x
= y;
y
= temp;
}


三、傳遞引用類型參數(shù)

  引用類型的變量不直接包含其數(shù)據(jù);它包含的是對其數(shù)據(jù)的引用。當(dāng)通過值傳遞引用類型的參數(shù)時,有可能更改引用所指向的數(shù)據(jù),如某類成員的值。但是無法更改引用本身的值;也就是說,不能使用相同的引用為新類分配內(nèi)存并使之在塊外保持。若要這樣做,應(yīng)使用?ref?或?out?關(guān)鍵字傳遞參數(shù)。為了簡單起見,下面的示例使用?ref

  1.?通過值傳遞引用類型

下面的示例演示通過值向?Change?方法傳遞引用類型的參數(shù)?arr。由于該參數(shù)是對?arr?的引用,所以有可能更改數(shù)組元素的值。但是,試圖將參數(shù)重新分配到不同的內(nèi)存位置時,該操作僅在方法內(nèi)有效,并不影響原始變量?arr。 代碼 class PassingRefByVal
{
static void Change(int[] pArray)
{
pArray[
0] = 888; // This change affects the original element.
pArray = new int[5] {-3, -1, -2, -3, -4}; // This change is local.
System.Console.WriteLine("Inside the method, the first element is: {0}", pArray[0]);
}

static void Main()
{
int[] arr = {1, 4, 5};
System.Console.WriteLine(
"Inside Main, before calling the method, the first element is: {0}", arr [0]);

Change(arr);
System.Console.WriteLine(
"Inside Main, after calling the method, the first element is: {0}", arr [0]);
}
}

?

在上個示例中,數(shù)組?arr?為引用類型,在未使用?ref?參數(shù)的情況下傳遞給方法。在此情況下,將向方法傳遞指向?arr?的引用的一個副本。輸出顯示方法有可能更改數(shù)組元素的內(nèi)容,在這種情況下,從?1改為?888。但是,在?Change?方法內(nèi)使用?new?運算符來分配新的內(nèi)存部分,將使變量?pArray?引用新的數(shù)組。因此,這之后的任何更改都不會影響原始數(shù)組?arr(它是在?Main?內(nèi)創(chuàng)建的)。實際上,本示例中創(chuàng)建了兩個數(shù)組,一個在?Main?內(nèi),一個在?Change?方法內(nèi)。

  2.?通過引用傳遞引用類型

本示例除在方法頭和調(diào)用中使用?ref?關(guān)鍵字以外,其余與上個示例相同。方法內(nèi)發(fā)生的任何更改都會影響調(diào)用程序中的原始變量
代碼 class PassingRefByRef
{
static void Change(ref int[] pArray)
{
// Both of the following changes will affect the original variables:
pArray[0] = 888;
pArray
= new int[5] {-3, -1, -2, -3, -4};
System.Console.WriteLine(
"Inside the method, the first element is: {0}", pArray[0]);
}

static void Main()
{
int[] arr = {1, 4, 5};
System.Console.WriteLine(
"Inside Main, before calling the method, the first element is: {0}", arr[0]);

Change(
ref arr);
System.Console.WriteLine(
"Inside Main, after calling the method, the first element is: {0}", arr[0]);
}
}

?

方法內(nèi)發(fā)生的所有更改都影響?Main?中的原始數(shù)組。實際上,使用?new?運算符對原始數(shù)組進行了重新分配。因此,調(diào)用?Change?方法后,對?arr?的任何引用都將指向?Change?方法中創(chuàng)建的五個元素的數(shù)組。

  3.?交換兩個字符串

交換字符串是通過引用傳遞引用類型參數(shù)的很好的示例。本示例中,str1?和?str2?兩個字符串在?Main?中初始化,并作為由?ref?關(guān)鍵字修改的參數(shù)傳遞給?SwapStrings?方法。這兩個字符串在該方法內(nèi)以及Main?內(nèi)均進行交換。
代碼 class SwappingStrings
{
static void SwapStrings(ref string s1, ref string s2)
// The string parameter is passed by reference.
// Any changes on parameters will affect the original variables.
{
string temp = s1;
s1
= s2;
s2
= temp;
System.Console.WriteLine(
"Inside the method: {0} {1}", s1, s2);
}

static void Main()
{
string str1 = "John";
string str2 = "Smith";
System.Console.WriteLine(
"Inside Main, before swapping: {0} {1}", str1, str2);

SwapStrings(
ref str1, ref str2); // Passing strings by reference
System.Console.WriteLine("Inside Main, after swapping: {0} {1}", str1, str2);
}
}

?

本示例中,需要通過引用傳遞參數(shù)以影響調(diào)用程序中的變量。如果同時從方法頭和方法調(diào)用中移除?ref?關(guān)鍵字,則調(diào)用程序中不會發(fā)生任何更改。

四、引用類型的數(shù)據(jù)值傳遞(復(fù)本傳遞)

  類的默認用MemberwiseClone 方法創(chuàng)建一個淺表副本,方法是創(chuàng)建一個新對象,然后將當(dāng)前對象的非靜態(tài)字段復(fù)制到該新對象。如果字段是值類型的,則對該字段執(zhí)行逐位復(fù)制。如果字段是引用 類型,則復(fù)制引用但不復(fù)制引用的對象;因此,原始對象及其復(fù)本引用同一對象。深拷貝,即實現(xiàn)ICloneable接口.ICloneable可用于深拷貝 和淺拷貝。這些都是概念,但是需要我們理解:

代碼 class ClassA : ICloneable
{
public string str;
public SubClass subclass;
public ClassA()
{
str
= "classA str";
subclass
= new SubClass();
}
//深復(fù)制,多層不可用MemberwiseClone()完整實現(xiàn)深復(fù)制
public object Clone()
{
// this.a = (string)this.a.Clone();
//this.b = (B)this.b.Clone();
var ne = new ClassA();
ne.str
= this.str;
ne.subclass
= (SubClass)this.subclass.Clone(); //this.b的話還是沒有成功
return ne;
// return this.MemberwiseClone();
}
}

class SubClass : ICloneable
{
public string str;
public SubClass()
{
this.str = "subclass str";
}
//深復(fù)制,因為只一層,所以可以用MemberwiseClone()方法
public object Clone()
{
this.str = (string)this.str.Clone();
return this.MemberwiseClone();
}

轉(zhuǎn)載于:https://www.cnblogs.com/jhxk/articles/2678866.html

總結(jié)

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

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

主站蜘蛛池模板: 六月丁香婷婷综合 | japanese24hdxxxx中文字幕 | 日本 片 成人 在线 九色麻豆 | 国产亚洲性欧美日韩在线观看软件 | 免费啪视频在线观看 | 欧美黑人性猛交xxxx | 久草最新 | 日本免费黄色大片 | 五月天综合网站 | 草久av| 五月网 | www.自拍偷拍 | 黄色片免费的 | 精品久久久久久久中文字幕 | 69sex久久精品国产麻豆 | 国产精品区在线 | 日本国产高清 | 日韩中文字幕一区二区 | 国产一区二区小说 | 欧美不卡视频 | 免费黄网站在线观看 | 欧美色v | 国产在线视频91 | 欧美亚洲| 潘金莲三级80分钟 | 欧美在线性 | 国产精品露脸视频 | 狠狠干香蕉 | 日韩理论视频 | www.热久久 | 手机电影在线观看 | 色婷婷久久五月综合成人 | 欧美天天色| 在线播放少妇奶水过盛 | 夜夜夜夜夜操 | 波多野吉衣在线观看视频 | wwww黄色片 | 天堂视频中文在线 | 人妖性做爰aaaa | 久久久精品影视 | 中国大陆一级毛片 | 国产探花精品在线 | 欧美二区在线 | 亚洲免费观看高清完整 | 蜜桃av在线看 | 激情男女视频 | 亚洲精品久久久久久久蜜桃臀 | 色呦呦呦呦 | 久久综合爱 | 国产xxxx孕妇 | 丰满岳妇乱一区二区三区 | 亚洲一页 | 91美女在线视频 | 国产综合精品 | 国产一区二区三区免费观看 | 欧美交换| 成人免费av | 久久三级网站 | 一区二区在线免费看 | 久久综合九色综合网站 | www精品| 亚洲啪啪网址 | 亚洲毛片在线免费观看 | 无毛av| a片在线免费观看 | 国产一区不卡在线 | 激情五月婷婷色 | 成人福利网址 | 蜜桃又黄又粗又爽av免 | 国产香蕉视频在线观看 | 57pao成人国产永久免费视频 | 好吊色一区二区 | 久久成人a| 玉女心经是什么意思 | 欧美成人三级在线播放 | 狠狠干夜夜草 | 国产极品久久 | 国产成人亚洲精品自产在线 | 国产91绿帽单男绿奴 | 丝袜老师办公室里做好紧好爽 | 天天av天天 | 伦理一级片 | 日韩黄色成人 | 免费一级特黄特色大片 | 超碰2020| 国产美女视频网站 | 日韩av综合网站 | www.日本com| 九一福利视频 | 欧美综合在线视频 | 97视频在线观看免费高清完整版在线观看 | 人妻系列一区 | 久久99精品久久只有精品 | 97超碰免费 | 久久综合一区二区 | 国产精品一区二区黑人巨大 | 蜜桃久久久久久 | 天天综合网天天综合 | 亚洲制服av |