C#中变量分为引用变量和数值变量,它们的区别在于它们的存储方式和数据类型。
引用变量和数值变量的概念
引用变量指的是具有内存地址的变量,该变量存储的是对象在内存中的地址。引用变量指向对象存储在堆内存中的地址而不是实际的值。当程序使用引用变量时,实际上是通过内存地址来操作堆中的对象。引用变量主要用于引用类型数据,如类、接口、委托等。
数值变量指的是实际的数值,它是直接存储在栈内存中的,并且可直接操作它存储的值。数值变量主要用于值类型数据,如枚举、结构体、基础数据类型等。
引用变量和数值变量的比较
存储方式的差异
引用变量使用堆内存来存储对象,而数值变量使用栈内存来存储实际的数值。
传递方式的差异
引用变量在参数传递时,传递的是对象在堆内存中的地址,因此当对象改变时,在堆内存中内存地址没有变化,因此这个引用变量依旧指向对象新的地址,会看到这个改变;而数值变量在参数传递时,传递的是实际的值,因此如果在函数中改变数值变量的值,函数外的数值变量是无法看到这个改变的。
示例1:引用变量的例子
using System;
class TestClass
{
static void Main()
{
int[] myList = {10, 20, 30, 40}; // 定义一个整型数组
ChangeArray(myList); // 调用方法
foreach (int i in myList) // 遍历整型数组
{
Console.Write(i + " "); // 输出遍历的数值
}
Console.ReadKey();
}
static void ChangeArray(int[] arr) // 定义一个方法
{
arr[0] = 100; // 将整型数组的第一个元素更改为100
}
}
这个例子中,定义了一个整型数组,调用ChangeArray
方法,将数组的第一个元素从10改成了100,因为这个数组是引用类型,传入ChangeArray
方法中的是这个数组在内存中的地址,我们可以修改这个地址中的值,因为它被一个引用变量引用起来了,所以在ChangeArray
方法中更改后只要这个地址不变,那么调用该方法的测试框架所看到的数据就会变。
示例2:数值变量的例子
using System;
class TestClass
{
static void Main(string[] args)
{
int a = 10; // 定义一个整型变量a,并赋值为10
ChangeValue(a); // 调用方法
Console.WriteLine(a); // 输出整型变量a
Console.ReadKey();
}
static void ChangeValue(int a) // 定义一个方法
{
a = 100; // 改变整型变量a的值为100
}
}
这个例子中,定义了一个整型变量a
,调用ChangeValue
方法,将a
的值从10改成了100。因为这个整型变量是数值类型,传入ChangeValue
方法中的只是这个数值,而不是这个数值在内存中的地址,因此在ChangeValue
方法中更改后,原始的变量a
并没有受到影响,因此后面输出的10依然保持不变。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#: 引用变量与数值变量的区别 - Python技术站