C#引用類型作為方法的參數(shù)分析
本文實例分析了C#引用類型作為方法的參數(shù)。分享給大家供大家參考。具體如下:
在c#或java中,參數(shù)傳遞都是傳遞的參數(shù)本身的值,
對于值類型,傳遞的是值本身。
對于引用類型,定義引用類型變量的時候,一個是在棧中的變量,存儲的是一個指針,指向在堆中分配的對象實例的地址,當(dāng)然,如果對象沒有實例化,給null值的時候例外。
傳遞引用類型變量的時候,傳遞的也是值,
但它的值是內(nèi)存地址,地址指定堆中的對象。
所以當(dāng)我們在方法中改變對象內(nèi)容的時候,我們外圍 的引用類型變量操作的對象也發(fā)生了變化,因為他們指向的是同一個。
但是如果我們在操作的方法中對 對象進(jìn)行了新的實例化,則就會在堆中新生成一個對象,和原來的就是兩個不同的對象了,在操作的方法結(jié)束,這個對象如果沒有特別處理,就沒有變量指向它了,它就會被銷毀。
示例:
{
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)用時會發(fā)生 對象空引用的異常。
原因是因為在方法中進(jìn)行了對象的初始化,但是外圍的sb和方法中的sb是兩個不同的變量,在方法中分配了對象實例后,外圍 的sb指定的還是null.
如果想解除這個異常,有幾個方法,第一個是對對象進(jìn)行有效初始化,不要置為null值,如果這里可以直接new StringBuilder()。不要在方法內(nèi)部再實例化。第二個是如果對象在外圍無法初始化,像接口對象,需要延遲到方法中進(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;
}
希望本文所述對大家的C#程序設(shè)計有所幫助。
相關(guān)文章
WPF實現(xiàn)類似ChatGPT逐字打印效果的示例代碼
前一段時間ChatGPT類的應(yīng)用十分火爆,這類應(yīng)用在回答用戶的問題時逐字打印輸出,像極了真人打字回復(fù)消息,本文就來利用WPF模擬一下這種逐字打印的效果吧2023-08-08C#創(chuàng)建Windows服務(wù)的圖文教程
本文主要介紹了C#創(chuàng)建Windows服務(wù)的圖文教程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06C# JavaScriptSerializer序列化時的時間處理詳解
這篇文章主要為大家詳細(xì)介紹了C# JavaScriptSerializer序列化時的時間處理詳解,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-08-08