引用类型v.值类型
本文关键字:类型 引用类型 | 更新日期: 2023-09-27 18:15:44
我有一个问题。当我输入
Int32 ii = new Int32();
我正在创建一个具有标识符"ii"的引用类型的值类型吗?如果我正在创建引用类型,那么当我将该引用的副本传递给更改其值的方法时,如何在方法返回时看不到更改?当我运行下面的代码时,我得到"0"。"
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Int32 ii = new Int32();
changeit(ii);
Console.WriteLine(ii.ToString());
Console.ReadLine();
}
static void changeit (Int32 i)
{
i = 2;
}
static void changeit(ref int i)
{
i = 2;
}
}
}
new操作符对于值类型和引用类型具有不同的含义。对于引用类型,这意味着在堆上分配和初始化类型;对于值类型,它意味着只初始化。所以
int i=new int();
与
相同int i=0;
参考c#入门
如果我创建一个引用类型
您没有创建引用类型。使用new
不会将值类型更改为引用类型。
static void Main(string[] args)
{
Int32 ii = new Int32();
changeit1(ii);
Console.WriteLine(ii.ToString());
changeit2(ref ii);
Console.WriteLine(ii.ToString());
Console.ReadLine();
}
static void changeit1(Int32 i)
{
i = 2;
}
static void changeit2(ref int i)
{
i = 2;
}
结果:
0
2
Int32根据定义是一个值类型。根据定义,类型可以是值类型或引用类型,不能更改。
如果你想修改Int32,你应该用关键字"ref"传递它:
static void changeit(ref int i)
{
i = 2;
}
要完成这样的事情,唯一的方法是将Int32封装在一个类中,如:public class DumbClass{
public int YourInt {get; set;}
}
当你把你的整数作为属性,你可以改变它,发送你的DumbClass引用:
static void changeit(DumbClass c)
{
c.YourInt = 2;
}
这是因为类是引用类型(根据定义)。
在引擎盖内,发生了很多事情。框架可能会根据它的心情决定在堆栈或堆中分配变量(因为有时会进行优化)。
通常当你在一个方法中声明一个int类型时,它是在堆栈上分配的,因为当方法完成执行时它会被释放,如果它是一个引用类型会很奇怪。
这就是为什么在框架中有"装箱"answers"拆箱"。有时值类型被"装箱",因此您可以将其用作引用类型(并在托管堆上分配)。就我个人而言,我不知道是否有一种方法可以在c#中显式地做到这一点,如果它有意义的话。