C#: int引用变量与数值变量

本文深入探讨了C#中的引用类型(如类class)和值类型(如结构体struct)的区别。值参数在方法调用时会复制实参值,而引用参数传递的是内存地址,允许方法直接修改原始值。通过示例展示了引用参数如何实现变量值的交换,并对比了C++的相关概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在C#中主要存在两大类型的数据:引用类型(class)和值类型(struct)。本文探讨一下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++与C#数据类型对应关系总结

C++参数含有&,c#也需要用ref关键字。
  2.在c++中声明是char*,调用是char[];c#声明为Intptr,调用使用Marshal.AllocHGlobal(Size)为其赋值。记得释放分配的内存 Marshal.FreeHGlobal(stringPointer);
   而在c#中获取这个值,使用Marshal.Copy(Intptr source.自定义类型 destination, sss, int copy起始位置, int 要copy的数目),destination即是。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值