C#: 引用变量与数值变量的区别

 更新时间:2013年03月05日 14:35:47   作者:  
在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#枚举中使用Flags特性

    详解C#枚举中使用Flags特性

    这篇文章主要介绍了C#枚举中使用Flags特性的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • C#编写COM组件的方法分析

    C#编写COM组件的方法分析

    这篇文章主要介绍了C#编写COM组件的方法,结合实例形式分析了C#编写COM组件的具体步骤与相关实现技巧,需要的朋友可以参考下
    2017-06-06
  • c# 从内存中释放Selenium chromedriver.exe

    c# 从内存中释放Selenium chromedriver.exe

    这篇文章主要介绍了c# 从内存中释放Selenium chromedriver.exe的方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下
    2021-01-01
  • C#图片处理如何生成缩略图的实现

    C#图片处理如何生成缩略图的实现

    本文主要介绍了C#图片处理如何生成缩略图的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • C#自定义字符串替换Replace方法实例

    C#自定义字符串替换Replace方法实例

    这篇文章主要介绍了C#自定义字符串替换Replace方法,以两个不同实例对比分析了C#自定义字符串替换Replace的方法,是C#关于字符串操作的典型应用,需要的朋友可以参考下
    2014-11-11
  • C#形状原点变换的方法

    C#形状原点变换的方法

    这篇文章主要介绍了C#形状原点变换的方法,涉及C#图形绘制中原点变换的实现技巧,需要的朋友可以参考下
    2015-06-06
  • 一道关于C#参数传递的面试题分析

    一道关于C#参数传递的面试题分析

    这篇文章主要介绍了一道关于C#参数传递的面试题,实例分析了C#参数传递的相关使用技巧,需要的朋友可以参考下
    2015-05-05
  • C#实现页面GZip或Deflate压缩的方法

    C#实现页面GZip或Deflate压缩的方法

    这篇文章主要介绍了C#实现页面GZip或Deflate压缩的方法,涉及C#通过GZipStream与DeflateStream实现页面压缩的相关技巧,需要的朋友可以参考下
    2015-06-06
  • C#选择排序法实例分析

    C#选择排序法实例分析

    这篇文章主要介绍了C#选择排序法,实例分析了C#排序算法的实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-04-04
  • Unity3D实现相机跟随控制

    Unity3D实现相机跟随控制

    这篇文章主要为大家详细介绍了Unity3D实现相机跟随控制,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07

最新评论