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

所属分类: 软件编程 / C#教程 阅读数: 94
收藏 0 赞 0 分享

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

更多精彩内容其他人还在看

c#开发word批量转pdf源码分享

已经安装有Office环境,借助一些简单的代码即可实现批量Word转PDF,看下面的实例源码吧
收藏 0 赞 0 分享

c# xml API操作的小例子

这篇文章主要介绍了c# xml API操作的小例子,有需要的朋友可以参考一下
收藏 0 赞 0 分享

c#唯一值渲染实例代码

这篇文章主要介绍了c#唯一值渲染实例代码,有需要的朋友可以参考一下
收藏 0 赞 0 分享

淘宝IP地址库采集器c#代码

这篇文章主要介绍了淘宝IP地址库采集器c#代码,有需要的朋友可以参考一下
收藏 0 赞 0 分享

C#在后台运行操作(BackgroundWorker用法)示例分享

BackgroundWorker类允许在单独的专用线程上运行操作。如果需要能进行响应的用户界面,而且面临与这类操作相关的长时间延迟,则可以使用BackgroundWorker类方便地解决问题,下面看示例
收藏 0 赞 0 分享

c#文本加密程序代码示例

这是一个加密软件,但只限于文本加密,加了窗口控件的滑动效果,详细看下面的代码
收藏 0 赞 0 分享

c#生成站点地图(SiteMapPath)文件示例程序

这篇文章主要介绍了c#生成站点地图(SiteMapPath)文件的示例,大家参考使用
收藏 0 赞 0 分享

C# 键盘Enter键取代Tab键实现代码

这篇文章主要介绍了C# 键盘Enter键取代Tab键实现代码,有需要的朋友可以参考一下
收藏 0 赞 0 分享

C# WinForm导出Excel方法介绍

在.NET应用中,导出Excel是很常见的需求,导出Excel报表大致有以下三种方式:Office PIA,文件流和NPOI开源库,本文只介绍前两种方式
收藏 0 赞 0 分享

C#串口通信程序实例详解

在.NET平台下创建C#串口通信程序,.NET 2.0提供了串口通信的功能,其命名空间是System.IO.Ports,创建C#串口通信程序的具体实现是如何的呢?让我们开始吧
收藏 0 赞 0 分享
查看更多