引用类型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;
        }
    }
}

引用类型v.值类型

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#中显式地做到这一点,如果它有意义的话。