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同时指向了同一块内存区域。

相关文章

  • ZooKeeper的安装及部署教程

    ZooKeeper的安装及部署教程

    Zookeeper是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护、名字服务、分布式同步、组服务等,这篇文章主要介绍了ZooKeeper的安装及部署,需要的朋友可以参考下
    2019-06-06
  • C#控制台程序的开发与打包为一个exe文件实例详解

    C#控制台程序的开发与打包为一个exe文件实例详解

    所谓控制台程序,就是没有界面,运行程序后只有一个黑色的类似cmd窗口,通过这个窗口进行交互,下面这篇文章主要给大家介绍了关于C#控制台程序的开发与打包为一个exe文件的相关资料,需要的朋友可以参考下
    2023-05-05
  • C# WebClient类用法实例

    C# WebClient类用法实例

    这篇文章主要介绍了C# WebClient类用法实例,本文讲解使用WebClient下载文件、OpenWriter打开一个流使用指定的方法将数据写入到uri以及上传文件示例,需要的朋友可以参考下
    2015-07-07
  • C# this关键字的四种用法

    C# this关键字的四种用法

    这篇文章主要为大家详细介绍了C# this关键字的四种用法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • C#实现动态显示及动态移除图片方法

    C#实现动态显示及动态移除图片方法

    这篇文章主要介绍了C#实现动态显示及动态移除图片方法,对于C#的初学者了解图像操作有一定的帮助,需要的朋友可以参考下
    2014-07-07
  • 深入理解C# abstract和virtual关键字

    深入理解C# abstract和virtual关键字

    深入理解C# abstract和virtual关键字,学习c#的朋友可以参考下。
    2011-06-06
  • C#中实现线程安全单例模式的多种方法

    C#中实现线程安全单例模式的多种方法

    在C#中实现线程安全的单例模式通常涉及确保类的实例在多线程环境中只被创建一次,并且这个实例在应用程序的生命周期内是唯一的,以下是几种常见的方法来实现线程安全的单例模式,需要的朋友可以参考下
    2025-01-01
  • C#预定义数据类型之值类型和引用类型介绍

    C#预定义数据类型之值类型和引用类型介绍

    这篇文章主要介绍了C#预定义数据类型之值类型和引用类型介绍,本文着重讲解了引用类型中的object(对象)类型和string(字符串)类型,需要的朋友可以参考下
    2015-03-03
  • 详解C#正则表达式Regex常用匹配

    详解C#正则表达式Regex常用匹配

    这篇文章主要介绍了C#正则表达式Regex常用匹配,利用Regex类实现验证,感兴趣的小伙伴们可以参考一下
    2015-12-12
  • c#中WinForm用OpencvSharp实现ROI区域提取的示例

    c#中WinForm用OpencvSharp实现ROI区域提取的示例

    已经自学OpencvSharp一段时间了,现在就分享一下我的学习过程,本文主要介绍了c#中WinForm用OpencvSharp实现ROI区域提取的示例,具有一定的参考价值,感兴趣的可以了解一下
    2022-05-05

最新评论