C#基础:值类型、引用类型与ref关键字
2015-06-18 10:10
441 查看
在C#中,ref的意思是按引用传递。可以参考C++:
view plaincopy to clipboardprint?
int a = 10, b = 20;
void swap(int x, int y)
{
int temp = x;
x = y;
y = temp;
}
如果简单的调用这个swap,比如:swap(a, b),那么你根本没办法交换这两个变量的值,因为x和y都是形参,在swap返回的时候,x和y都被释放了。但如果是这样定义swap:
view plaincopy to clipboardprint?
void swap (int& x, int& y)
{
int temp = x;
x = y;
y = temp;
}
也就相当于x与a,y与b指向同一个内存地址,那么对x的操作也就相当于对a的操作。那么在C#里面,这种效果对于值类型是很明显的。
view plaincopy to clipboardprint?
class Program
{
static void Test(ref int b)
{
b = 2;
}
static void Main(string[] args)
{
int b = 1;
Test(ref b);
Console.WriteLine(b);
}
}
此时的输出是2,也就是Test方法中的b与Main中的b指向同一个内存地址,那么对Test.b的操作也就是对Main.b的操作。你如果把程序改成:
view plaincopy to clipboardprint?
class Program
{
static void Test(int b)
{
b = 2;
}
static void Main(string[] args)
{
int b = 1;
Test(b);
Console.WriteLine(b);
}
}
那么输出的还是1,因为Test.b不是Main.b的引用,也就是一个单独的形参。现在再看对于引用类型,会是什么效果:
view plaincopy to clipboardprint?
class TestClass
{
public int b;
}
class Program
{
static void Test(TestClass b)
{
b.b = 2;
}
static void Main(string[] args)
{
TestClass b = new TestClass();
b.b = 1;
Test(b);
Console.WriteLine(b.b);
}
}
上面的代码,输出的是2,因为b是引用类型,在只需修改b的成员的时候,加不加ref关键字都一样。引用类型本身并不包含数据,仅仅维持了对数据的引用。
因此,使用ref参数,对值类型对象的作用显而易见,而对于引用类型,如需修改引用类型内部的数据,则无需使用ref关键字;否则,当被调用函数内部需要更改引用本身时,比如在函数内部重新定位对象的引用,则需要使用ref关键字。
view plaincopy to clipboardprint?
int a = 10, b = 20;
void swap(int x, int y)
{
int temp = x;
x = y;
y = temp;
}
如果简单的调用这个swap,比如:swap(a, b),那么你根本没办法交换这两个变量的值,因为x和y都是形参,在swap返回的时候,x和y都被释放了。但如果是这样定义swap:
view plaincopy to clipboardprint?
void swap (int& x, int& y)
{
int temp = x;
x = y;
y = temp;
}
也就相当于x与a,y与b指向同一个内存地址,那么对x的操作也就相当于对a的操作。那么在C#里面,这种效果对于值类型是很明显的。
view plaincopy to clipboardprint?
class Program
{
static void Test(ref int b)
{
b = 2;
}
static void Main(string[] args)
{
int b = 1;
Test(ref b);
Console.WriteLine(b);
}
}
此时的输出是2,也就是Test方法中的b与Main中的b指向同一个内存地址,那么对Test.b的操作也就是对Main.b的操作。你如果把程序改成:
view plaincopy to clipboardprint?
class Program
{
static void Test(int b)
{
b = 2;
}
static void Main(string[] args)
{
int b = 1;
Test(b);
Console.WriteLine(b);
}
}
那么输出的还是1,因为Test.b不是Main.b的引用,也就是一个单独的形参。现在再看对于引用类型,会是什么效果:
view plaincopy to clipboardprint?
class TestClass
{
public int b;
}
class Program
{
static void Test(TestClass b)
{
b.b = 2;
}
static void Main(string[] args)
{
TestClass b = new TestClass();
b.b = 1;
Test(b);
Console.WriteLine(b.b);
}
}
上面的代码,输出的是2,因为b是引用类型,在只需修改b的成员的时候,加不加ref关键字都一样。引用类型本身并不包含数据,仅仅维持了对数据的引用。
因此,使用ref参数,对值类型对象的作用显而易见,而对于引用类型,如需修改引用类型内部的数据,则无需使用ref关键字;否则,当被调用函数内部需要更改引用本身时,比如在函数内部重新定位对象的引用,则需要使用ref关键字。
相关文章推荐
- C#基础语法:as 运算符使用实例
- C#基础语法:结构和类区别详解
- C# 获取xml属性名称
- 可变参数和不可变参数的比较
- C#基础语法:可空类型详解
- C#基础语法:方法参数详解
- C# Lock关键字
- C# 理解lock
- C#精粹,一本都不能少
- c# xml和类互转,支持泛型
- C#ref,out变量巧用篇
- C# WinForm 禁止最大化、最小化、双击标题栏、双击图标等操作
- WinForm+C#代码实现控制应用程序自启动功能
- C#中,变量前的@符号
- C#中,变量前的@符号
- C#图形化界面--L型骨牌
- 【C#】教你纯手工用C#实现SSH协议作为GIT服务端
- C# 类型基础
- 怎样用C#读取Excel文件
- C#下AxShockwaveFlash的成员函数