C#基础:值类型、引用类型与ref关键字

本文详细解析了C#中的ref关键字如何实现按引用传递,包括其在值类型和引用类型中的不同作用,并通过示例代码说明了如何正确使用ref来达到预期的效果。

在C#中,ref的意思是按引用传递。可以参考C++:

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:

void swap (int& x, int& y)    
{    
    int temp = x;    
    x = y;    
    y = temp;    
}   

也就相当于x与a,y与b指向同一个内存地址,那么对x的操作也就相当于对a的操作。那么在C#里面,这种效果对于值类型是很明显的。

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的操作。你如果把程序改成:

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的引用,也就是一个单独的形参。现在再看对于引用类型,会是什么效果:

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关键字。

 

评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值