我有一个问题。当我做的时候
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;
}
}
}
答案 0 :(得分:2)
new运算符对值和引用类型具有不同的含义。对于引用类型,它意味着在堆上分配和初始化类型;对于值类型,它仅表示初始化。所以
int i=new int();
与
相同int i=0;
请C# reference作为首发。
答案 1 :(得分:1)
如果我正在创建引用类型
您没有创建引用类型。使用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
答案 2 :(得分:1)
根据定义,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时,它会在堆栈上分配,并且因为当方法完成它的执行时它将被释放,如果它是一个引用类型将会很奇怪
这就是"拳击"和#34;拆箱"在框架内。有时价值类型是"盒装"所以你可以将它用作引用类型(并在托管堆上分配)。就个人而言,我不知道是否有办法在C#中明确地做到这一点并且是否有意义。