C#的数据类型可以分为两类:值类型和引用类型。
值类型包括一些基本类型(例如,char、int和float),枚举类型和结构类型;而引用类型包括类类型、接口类型、数组类型和委托(delegate)类型。
值类型和引用类型的区别在于,值类型的变量直接存放实际的数据,而引用类型的变量存放的则是数据的地址,即对象的引用。
值类型变量直接把变量的值保存在堆栈中,引用类型的变量把实际数据的地址保存在堆栈中,而实际数据则保存在堆中。注意,堆和堆栈是两个不同的概念,在内存中的存储位置也不相同,堆一般用于存储可变长度的数据,如字符串类型;而堆栈则用于存储固定长度的数据,如整型类型的数据int(每个int变量占用四个字节)。由数据存储的位置可以得知,当把一个值变量赋给另一个值变量时,会在堆栈中保存两个完全相同的值;而把一个引用变量赋给另一个引用变量,则会在堆栈中保存对同一个堆位置的两个引用,即在堆栈中保存的是同一个堆的地址。在进行数据操作时,对于值类型,由于每个变量都有自己的值,因此对一个变量的操作不会影响到其他变量;对于引用类型的变量,对一个变量的数据进行操作就是对这个变量在堆中的数据进行操作,如果两个引用类型的变量引用同一个对象,实际含义就是它们在堆栈中保存的堆的地址相同,因此对一个变量的操作就会影响到引用同一个对象的另一个变量。
方法中的参数传递
定义方法时可以将参数传入方法中进行处理,也可以将方法中处理过的信息返回给调用者。传递变量参数到方法的方式有下面几种:
1) 传递值类型的参数
值类型参数的格式为:
参数类型 参数名
定义值类型参数的方式很简单,只要注明参数类型和参数名即可。当该方法被调用时,便会为每个值类型参数分配一个新的内存空间,然后将对应的表达式运算的值复制到该内存空间。在方法中更改参数的值不会影响到这个方法之外的变量。
【例】方法中值类型参数的传递。
using System;
using System.Collections.Generic;
using System.Text;
namespace ValueTransferExample
{
class Program
{
public static void AddOne(int a)
{
a++;
}
static void Main()
{
int a = 3;
Console.WriteLine("调用AddOne之前,a={0}", a);
AddOne(a);
Console.WriteLine("调用AddOne之后,a={0}", a);
Console.ReadLine();
}
}
}
输出结果:
调用AddOne之前,a=3
调用AddOne之后,a=3
2) 传递引用类型的参数
引用类型参数的格式为:
ref 参数类型 参数名
与传递值类型参数不同,引用类型的参数并没有再分配内存空间,实际上传递的是指向原变量的指针,既引用参数和原变量保存的是同一个地址。为了和传递值类型参数区分,前面加上ref关键字(Reference),在方法中修改引用参数的值实际上也就是修改被引用的变量的值。
【例】方法中引用类型参数的传递。
using System;
using System.Collections.Generic;
using System.Text;
namespace ReferenceTransferExample
{
class Program
{
public static void AddOne(ref int a)
{
a++;
}
static void Main()
{
int x = 3;
Console.WriteLine("调用AddOne之前,x={0}", x);
AddOne(ref x);
Console.WriteLine("调用AddOne之后,x={0}", x);
Console.ReadLine();
}
}
}
输出结果:
调用AddOne之前,x=3
调用AddOne之后,x=4
若转载请注明出处: Spirit's Home
本文地址: http://www.7788sky.cn/post/csharp_ref.html
0 Response to “C#数据类型中的引用类型及方法中的参数传递”