c#值类型与引用类型的区别

发布时间:2020-09-24编辑:脚本学堂
c#两大数据类型:值类型(struct)与引用类型(class),在实际的c#编程中应用广泛。本文通过具体的实例,为大家介绍c#中值类型(变量)与数值类型(变量)的区别。

c#两大数据类型:值类型(struct)与引用类型(class),在实际的c#编程中应用广泛。
本文通过具体的实例,为大家介绍c#中值类型(变量)与数值类型(变量)的区别。

1、首先来看值类型作为参数
当使用值向方法传递参数时,编译程序将实参的值做一份拷贝,并将此拷贝传递给该方法。
被调用的方法不会修改内存中实参的值。使用值参数时,可以保证实际值是安全的。
在调用方法时,如果形式化参数的类型是值参数的话,调用的实参的值必须保证是正确的值表达式。

以下的示例,并未实现交换值的目的:
 

复制代码 代码示例:
using System;
class Test
{
static void Swap(int x,int y){
int temp=x;
x=y;
y=temp;
}
static void Main(){
int i=1,j=2;
Swap(i,j);
Console.WriteLine("i={0},j={1}",i,j);
}
}
 

输出:
i=1,j=2

2、引用类型作为参数
引用型参数并不开辟新的内存区域。
使用引用型参数向方法传递形参时,编译程序将把实际值在内存中的地址传递给方法。
在方法中,引用型参数通常已经初始化。
例如,下面这个例子:
 

复制代码 代码示例:
using System;
class Test
{
static void Swap(ref int x,ref int y){
int temp=x;
x=y;
y=temp;
}
static void Main(){
int i=1,j=2;
Swap(ref i,ref j);
Console.WriteLine("i={0},j={1}",i,j);
}
}
 

输出:
i=2,j=1

Main函数中调用了Swap函数,x代表i,y代表j,成功实现了i和j的值交换。
注意:在方法中使用引用型参数,可能导致多个变量名指向同一处内存地址的情况发生。
如下面这个例子:
 

复制代码 代码示例:
class A
{
string s;
void F(ref string a,ref string b){
s="One";
a="Two";
b="Three";
}
void G(){
F(ref s,ref s);
}
}
 

在方法G对F调用时,s的引用被同时传递给了a和b。此时,s,a,b同时指向了同一块内存区域,显然这并不是我们所期望看到的。
通过以上三个例子,我想你已经对C#值类型与引用类型的区别有所理解,祝您学习愉快。