• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

c#当引用类型作为方法的参数

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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;

}

 

   


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#WebApi上传文件发布时间:2022-07-13
下一篇:
C#中实现VB中的CreateObject方法发布时间:2022-07-13
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap