C#引用類型作為方法的參數(shù)分析
本文實(shí)例分析了C#引用類型作為方法的參數(shù)。分享給大家供大家參考。具體如下:
在c#或java中,參數(shù)傳遞都是傳遞的參數(shù)本身的值,
對(duì)于值類型,傳遞的是值本身。
對(duì)于引用類型,定義引用類型變量的時(shí)候,一個(gè)是在棧中的變量,存儲(chǔ)的是一個(gè)指針,指向在堆中分配的對(duì)象實(shí)例的地址,當(dāng)然,如果對(duì)象沒有實(shí)例化,給null值的時(shí)候例外。
傳遞引用類型變量的時(shí)候,傳遞的也是值,
但它的值是內(nèi)存地址,地址指定堆中的對(duì)象。
所以當(dāng)我們?cè)诜椒ㄖ懈淖儗?duì)象內(nèi)容的時(shí)候,我們外圍 的引用類型變量操作的對(duì)象也發(fā)生了變化,因?yàn)樗麄冎赶虻氖峭粋€(gè)。
但是如果我們?cè)诓僮鞯姆椒ㄖ袑?duì) 對(duì)象進(jìn)行了新的實(shí)例化,則就會(huì)在堆中新生成一個(gè)對(duì)象,和原來的就是兩個(gè)不同的對(duì)象了,在操作的方法結(jié)束,這個(gè)對(duì)象如果沒有特別處理,就沒有變量指向它了,它就會(huì)被銷毀。
示例:
{
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!");
}
調(diào)用時(shí)會(huì)發(fā)生 對(duì)象空引用的異常。
原因是因?yàn)樵诜椒ㄖ羞M(jìn)行了對(duì)象的初始化,但是外圍的sb和方法中的sb是兩個(gè)不同的變量,在方法中分配了對(duì)象實(shí)例后,外圍 的sb指定的還是null.
如果想解除這個(gè)異常,有幾個(gè)方法,第一個(gè)是對(duì)對(duì)象進(jìn)行有效初始化,不要置為null值,如果這里可以直接new StringBuilder()。不要在方法內(nèi)部再實(shí)例化。第二個(gè)是如果對(duì)象在外圍無法初始化,像接口對(duì)象,需要延遲到方法中進(jìn)行初始化的,可以使用返回值的方式或者是ref參數(shù)的方法。
例如:
{
if (sbx == null) sbx = new StringBuilder();
sbx.Append("hello world!");
}
或者
{
if (sbx == null) sbx = new StringBuilder();
sbx.Append("hello world!");
return sbx;
}
希望本文所述對(duì)大家的C#程序設(shè)計(jì)有所幫助。
- C# Main方法的傳入?yún)?shù)研究
- C#從命令行讀取參數(shù)的方法
- C#讀取命令行參數(shù)的方法
- C#分析URL參數(shù)并獲取參數(shù)和值對(duì)應(yīng)列表的方法
- C#無限參數(shù)的寫法
- C#傳遞參數(shù)到線程的方法匯總
- c#的params參數(shù)使用示例
- c#數(shù)據(jù)綁定之向查詢中添加參數(shù)(.Net連接外部數(shù)據(jù)庫)
- C#中的多線程多參數(shù)傳遞詳解
- c#線程間傳遞參數(shù)詳解
- c#委托把方法當(dāng)成參數(shù)(實(shí)例講解)
- 深入解析C#中的命名實(shí)參和可選實(shí)參
相關(guān)文章
C# 實(shí)現(xiàn)簡(jiǎn)單打印的實(shí)例代碼
C# 實(shí)現(xiàn)簡(jiǎn)單打印的實(shí)例代碼,需要的朋友可以參考一下2013-03-03
DevExpress之ChartControl創(chuàng)建Drill-Down樣式的Title實(shí)例
這篇文章主要介紹了DevExpress之ChartControl創(chuàng)建Drill-Down樣式的Title實(shí)現(xiàn)方法,以實(shí)例形式講述了創(chuàng)建Drill-Down樣式的Title原理與實(shí)現(xiàn)過程,需要的朋友可以參考下2014-10-10
基于NPOI用C#開發(fā)的Excel以及表格設(shè)置
這篇文章主要為大家詳細(xì)介紹了基于NPOI用C#開發(fā)的Excel以及表格設(shè)置,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02
C# List<T> Contains<T>()的用法小結(jié)
本篇文章主要是對(duì)C#中List<T> Contains<T>()的用法進(jìn)行了總結(jié)介紹,需要的朋友可以過來參考下,希望對(duì)大家有所幫助2014-01-01
C# Winform按鈕中圖片實(shí)現(xiàn)左圖右字的效果實(shí)例
這篇文章主要給大家介紹了關(guān)于C# Winform按鈕中圖片實(shí)現(xiàn)左圖右字效果的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11

