关于C#值类型,引用类型,值传递,引用传递

简介:

说到参数传递,必须得弄清值类型和引用类型:
(
为了容易表达,我暂且命名存放在堆中的内容为堆中对象,存放在栈上的内容为栈中对象。)
值类型存放在栈中,直接访问。如果有:
int a=0;int b=a;就产生了两个栈中对象。
引用类型需要在堆中显式分配,且不能直接访问,需要在栈中分配一个栈中对象(C++叫指针,C#叫引用)指向其堆中对象

如果:
StringBuilder strb = new StringBuilder();
StringBuilder strb2 = strb;
则在堆中只有一个堆中对象,只是栈中有两个栈中对象指向堆中对象。
可以看出:每个变量都是一个栈中对象。不管是值类型还是引用类型,只是值类型的栈中对象就是其内容,而引用类型的栈中对象只是一个指向堆中对象的地址。

判断是值类型还是引用类型:

int a1 = 10;
StringBuilder strb1 = 
new StringBuilder("ABC");

int a2 = a1;
StringBuilder strb2 = strb1;

bool bl1 = object.ReferenceEquals(a1,a2);   //false为值类型(因为值类型要装箱)
bool bl2 = object.ReferenceEquals(strb1,strb2);   //true为引用类型

参数传递分值传递和引用传递两种。
通常,在没有显式指出ref和out时都是值传递

值传递:传的是对象的值拷贝。(即函数内参数对象是调用时传递对象的栈中对象的拷贝。)
引用传递:传的是栈中对象的地址。(即函数内参数对象与调用时传递对象完全是同一栈中对象。)
现在用例子来说明传值跟传地址的不同:

private void button2_Click(object sender, System.EventArgs e)
{
  StringBuilder strb1 = 
new StringBuilder();
  StringBuilder strb2 = 
new StringBuilder();
  Test1(strb1);
  Test2(
ref strb2);
  
string str1 = strb1.ToString(); //str1
:"A"
  string str2 = strb2.ToString(); //str2:"BC"
}

void Test1(StringBuilder strb)
{
  
//strbstrb1是两个栈中对象,但指向相同的地址,这个操作是改变堆中对象
  strb.Append("A");

  
//这里将strb指向一个新的堆中对象,所以后面的操作与strb1指向的栈中对象无关
  strb = new StringBuilder("B");
  strb.Append("C");
}

void Test2(ref StringBuilder strb)
{
  
//这里的strbstrb2是同一个栈中对象,所以改变strb的值使其指向另一个对象也等于改变strb2
  strb = new StringBuilder("B");
  strb.Append("C");
}

 
















本文转自cnn23711151CTO博客,原文链接: http://blog.51cto.com/cnn237111/566155,如需转载请自行联系原作者




相关文章
|
7月前
|
存储 C# C语言
C# OOP之五 深入理解值类型和引用类型
C# OOP之五 深入理解值类型和引用类型
27 0
|
3月前
|
安全 编译器 C#
C#中的可空引用类型:减少空引用异常的利器
【1月更文挑战第9天】C# 8.0中引入的可空引用类型特性,它通过在编译时提供更精确的静态分析,帮助开发者减少运行时的空引用异常。文章详细阐述了可空引用类型的工作原理、如何配置项目以使用此特性,以及在实际编码中如何利用可空引用类型提升代码的健壮性和可读性。
|
8月前
|
存储 C# 图形学
代码解析 C# 引用类型还是值类型
代码解析 C# 引用类型还是值类型
|
4月前
|
存储 C#
C# “值类型“和“引用类型“在内存的分配
C# “值类型“和“引用类型“在内存的分配
|
7月前
|
C#
C#由Dictionary赋值引发的对引用类型使用的思考
C#由Dictionary赋值引发的对引用类型使用的思考
|
安全 编译器 C#
30天C#基础巩固-----值类型/引用类型,泛型,空合并操作符(??),匿名方法
30天C#基础巩固-----值类型/引用类型,泛型,空合并操作符(??),匿名方法
85 0
30天C#基础巩固-----值类型/引用类型,泛型,空合并操作符(??),匿名方法
|
编译器 C#
表达式树练习实践:C#值类型、 引用类型、泛型、集合、调用函数
表达式树练习实践:C#值类型、 引用类型、泛型、集合、调用函数
138 0
|
存储 开发框架 .NET
C#系列之值类型和引用类型
C#系列之值类型和引用类型
132 0
C#系列之值类型和引用类型
|
存储 C#
C# 值类型与引用类型 null与可空类型
本文目录 1. 值类型与引用类型 2. null的含义 3. 可空类型
160 0
|
存储 Java 程序员
C#基础——值类型和引用类型
C#基础——值类型和引用类型
550 0
C#基础——值类型和引用类型