首页 > 解决方案 > New 和 Object 之间有什么不同以及它在堆栈和堆中的工作方式

问题描述

当我编写如下代码时,它将在我们的堆栈和堆中创建一个地址。

Student student = new Student();

当我创建一个对象时,它还会在我们的堆栈中创建一个地址。同时它需要更多的 RAM 空间,因为您需要将其读出。那么为什么我们还要在下面使用呢?

int x=0;
object student=x
int y=(int)student

标签: c#object

解决方案


我觉得你对很多事情都很困惑。new甚至object几乎不在同一个领域。让我解释:

A.“当我编写如下代码时,它将在我们的堆栈和堆中创建一个地址”

不对。如果Student是一个类(通常是),它将进入堆中。但是,如果它是一个结构,它将进入堆栈。这是结构和类之间的主要区别。

B.object不习惯于创造任何东西,至少不像new那样。

object是一种类型。一切都可以隐式转换,object因为一切都继承自它。当您将值类型object转换为 时,会将其从值类型转换为引用类型,因此必须将其“装箱”作为引用,并在从对象转换回值类型时“拆箱”。

你可以很容易地这样做:

int x = 0;
int y = x;

C.new调用您正在创建的类型的构造函数,object不会。如果我们有:

public class Student
{
    public Student() => Console.WriteLine("Student Enrolled");
}

...

var student1 = new Student();
Student student2;

这会打印"Student Enrolled",但只会打印一次,因为student2从未调用过new Student()。如果我这样做了object student3 = new Student();,这将打印出来,但只是因为student仍在调用new,与参与无关object

**D。[object]x是无效的 C# 语法``

我不确定您是否来自其他编程语言,但在 C/C++/C# 中,转换是使用()大括号而不是[]大括号完成的,所以应该是int y = (int)object.

[]括号用于索引。

E. 当我们希望我们object装箱/拆箱时

装箱/拆箱是您在第二个示例中所做的,即int来回object投射。这是一种在仿制药出现之前更为常见的模式。如果我想要一个可用于任何类型的项目列表,我可以使用object[].

问题是,他们可以在里面放任何他们想要的类型。他们可以将int, string[], Guid,Student等都放在同一个数组中,并且每次都必须强制转换/拆箱到他们想要的值,这对性能不利。现在,尽管使用泛型,我们可以这样做List<int>,并且这个集合只允许ints,它不会将它们装箱或让我强制转换int

不过,我最近使用它的一种方法是在处理enums. 做一些事情,以便用户可以enum使用泛型从一个转换到另一个。

如果我这样做了:

public TEnumTo CastToU<TEnumFrom, TEnumTo>(TEnumFrom enumFrom) 
    where TEnumFrom : System.Enum 
    where TEnumTo   : System.Enum 
{
    return (TEnumTo)enumFrom;
}

它会给出一个错误,即使我们可以将任何给定enum的类型转换为另一个,通常情况下,即使它知道这两种类型都是enums。

所以我必须做的是:

public TEnumTo CastToU<TEnumFrom, TEnumTo>(TEnumFrom enumFrom) 
    where TEnumFrom : System.Enum 
    where TEnumTo   : System.Enum 
{
    return (TEnumTo)(object)enumFrom;
}

这是有效的,因为任何变量都可以转换为objectobject可以转换为任何其他变量。


推荐阅读