国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C#引用類型作為方法的參數分析

2020-01-24 02:17:30
字體:
來源:轉載
供稿:網友

本文實例分析了C#引用類型作為方法的參數。分享給大家供大家參考。具體如下:

在c#或java中,參數傳遞都是傳遞的參數本身的值,

對于值類型,傳遞的是值本身。

對于引用類型,定義引用類型變量的時候,一個是在棧中的變量,存儲的是一個指針,指向在堆中分配的對象實例的地址,當然,如果對象沒有實例化,給null值的時候例外。

傳遞引用類型變量的時候,傳遞的也是值,

但它的值是內存地址,地址指定堆中的對象。

所以當我們在方法中改變對象內容的時候,我們外圍 的引用類型變量操作的對象也發生了變化,因為他們指向的是同一個。

但是如果我們在操作的方法中對 對象進行了新的實例化,則就會在堆中新生成一個對象,和原來的就是兩個不同的對象了,在操作的方法結束,這個對象如果沒有特別處理,就沒有變量指向它了,它就會被銷毀。

示例:

復制代碼 代碼如下:
new Thread(() =>
{
try
{
StringBuilder sb = null;
//addline(ref sb);
addline(sb);
rtb_log.InvokeIfRequired(()=> rtb_log.AppendText(sb.ToString()+"/r/n"));
}
catch (Exception ex)
{
rtb_log.InvokeIfRequired(() => rtb_log.AppendText(ex.Message + "/r/n"));
}
finally { if (conn != null && conn.State == ConnectionState.Open) conn.Close(); }
}).Start();
void addline( StringBuilder sb)
{
if (sb == null) sb = new StringBuilder();
sb.Append("hello world!");
}

調用時會發生 對象空引用的異常。

原因是因為在方法中進行了對象的初始化,但是外圍的sb和方法中的sb是兩個不同的變量,在方法中分配了對象實例后,外圍 的sb指定的還是null.

如果想解除這個異常,有幾個方法,第一個是對對象進行有效初始化,不要置為null值,如果這里可以直接new StringBuilder()。不要在方法內部再實例化。第二個是如果對象在外圍無法初始化,像接口對象,需要延遲到方法中進行初始化的,可以使用返回值的方式或者是ref參數的方法。

例如:

復制代碼 代碼如下:
void addline(ref StringBuilder sbx)
{
if (sbx == null) sbx = new StringBuilder();
sbx.Append("hello world!");
}

 
或者
復制代碼 代碼如下:
StringBuilder addline2(StringBuilder sbx)
{
if (sbx == null) sbx = new StringBuilder();
sbx.Append("hello world!");
return sbx;
}

希望本文所述對大家的C#程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 旌德县| 如皋市| 寿光市| 张家界市| 寻乌县| 平乐县| 潮州市| 武宁县| 马山县| 兰溪市| 中方县| 桐柏县| 淅川县| 阿鲁科尔沁旗| 兴安盟| 正镶白旗| 调兵山市| 嘉义县| 蕉岭县| 杨浦区| 当雄县| 谢通门县| 信阳市| 桑植县| 呼图壁县| 临澧县| 苍溪县| 天津市| 定襄县| 紫云| 福泉市| 郎溪县| 黄平县| 阜阳市| 溧水县| 南漳县| 隆回县| 湘潭市| 盐边县| 华坪县| 新安县|