欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C#引用类型作为方法的参数分析

程序员文章站 2023-12-17 13:50:46
本文实例分析了c#引用类型作为方法的参数。分享给大家供大家参考。具体如下: 在c#或java中,参数传递都是传递的参数本身的值, 对于值类型,传递的是值本身。 对于引...

本文实例分析了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#程序设计有所帮助。

上一篇:

下一篇: