C#引用类型作为方法的参数分析
2018-10-12 14:06
701 查看
本文实例分析了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# 方法传参时,传入值类型、引用类型、string引用类型、ref修饰参数时分析
- C# 值类型和引用类型 以及作为方法参数的区别
- 复习一下基础:'C# 值类型和引用类型 以及作为方法参数的区别'
- c# 当引用类型作为方法的参数
- C++编程中将引用类型作为函数参数的方法指南
- C# 引用类型作为函数参数时
- C#定义泛型方法错误-类型“T”必须是引用类型才能用作泛型类型或方法“System.Data.Linq.Table<TEntity>”中的参数“TEntity”
- .net学习之.net和C#关系、运行过程、数据类型、类型转换、值类型和引用类型、数组以及方法参数等
- C# 引用类型作为函数参数时
- C# 可访问性不一致:参数类型比方法可访问性低 问题分析
- C#中引用类型做方法参数时,加ref或out,与不加ref或out到底有什么区别?
- C# 值类型 引用类型 作为参数传递区别
- java 引用类型作为方法参数使用问题
- C# 引用类型作为函数参数时
- C# 引用类型作为函数参数时一些需要注意的地方
- 问题(怎样在dephi中引用.net中定义的类.方法参数,参数类型为XMLdocument?我要调用此方法并把实例花的xmldocument类型的变量作为参数给它。)
- C# 001 --- 正确的删除一个控件的事件函数 --- 解决错误: “A”不包含“B”的定义,并且找不到可接受类型为“A”的第一个参数的扩展方法“B”(是否缺少 using 指令或程序集引用?)
- C# 引用类型作为函数参数时
- C# 参考之方法参数关键字:params、ref及out 引用-http://www.cnblogs.com/hunts/archive/2007/01/13/619620.html
- 对C#中HashTable的Add方法参数类型的探讨