当前位置: 首页 > 编程笔记 >

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

韦翰音
2023-03-14
本文向大家介绍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#程序设计有所帮助。

 类似资料:
  • 本文向大家介绍C++编程中将引用类型作为函数参数的方法指南,包括了C++编程中将引用类型作为函数参数的方法指南的使用技巧和注意事项,需要的朋友参考一下 有了变量名,为什么还需要一个别名呢?C++之所以增加引用类型, 主要是把它作为函数参数,以扩充函数传递数据的功能。 到目前为止我们介绍过函数参数传递的两种情况。 1) 将变量名作为实参和形参 这时传给形参的是变量的值,传递是单向的。如果在执行函数期

  • 这行不通,因为premiumStrings::contains可以接受任何对象,而不仅仅是字符串。可以将其替换为<代码>(字符串s)- (具体来说,问题是

  • 问题内容: 您认为可以创建类似的东西吗? 问题答案: 是的你可以。 用法示例:

  • 我有一个静态方法的类,如下所示: 如果我想打电话给Foo。foo并确保返回类型为,我可以说

  • C++ 引用 我们已经讨论了如何使用指针来实现引用调用函数。下面的实例使用了引用来实现引用调用函数。#include <iostream> using namespace std; // 函数声明 void swap(int& x, int& y); int main () { // 局部变量声明 int a = 100; int b = 200; cout << "交换前,a 的值:" << a

  • 问题内容: 问题摘要: 我想将具有类型参数(例如)的类作为类型参数传递给泛型方法。 假设我有一个方法: 当然,此方法对于任何类型的类都可以正常使用。我可以这样调用该方法,例如: 问题: 我发现我不能这样做: 从句法上讲,这显然是无效的。但是,我不确定如何实现这样的目标。我当然可以通过,但是泛型类型的添加使其在语法上不再有效,并且我想不出解决方法。 唯一的直接解决方案是这样的事情(看起来很愚蠢):