参考类型v。值类型

时间:2014-07-29 20:17:08

标签: c# pass-by-reference

我有一个问题。当我做的时候

 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;
        }
    }
}

3 个答案:

答案 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#中明确地做到这一点并且是否有意义。