程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#援用類型作為辦法的參數剖析

C#援用類型作為辦法的參數剖析

編輯:C#入門知識

C#援用類型作為辦法的參數剖析。本站提示廣大學習愛好者:(C#援用類型作為辦法的參數剖析)文章只能為提供參考,不一定能成為您想要的結果。以下是C#援用類型作為辦法的參數剖析正文


本文實例剖析了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#法式設計有所贊助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved