New和Object之间有什么不同,以及它在堆栈和堆中的工作方式

时间:2018-05-31 01:26:21

标签: c# object

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

Student student = new Student();

当我创建一个对象时,它也会在我们的堆栈中创建一个地址。同时它需要更多的RAM空间,因为你需要读出它。那么为什么我们仍然希望在此之下使用呢?

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

1 个答案:

答案 0 :(得分:1)

我觉得你在很多方面都很困惑。 newobject几乎不在同一领域。让我解释一下:

:一种。 “当我编码如下时,它将在我们的堆栈和堆上创建一个地址”

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

<强> B中。 object不会用于创建任何内容,至少不会像new那样。

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

您可以轻松地这样做:

int x = 0;
int y = x;

<强>℃。 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#syntax``

我不确定你是否来自不同的编程语言,但是在C / C ++ / C#中,使用()括号进行强制转换,而不是使用[]括号,因此它应该是{{ 1}}。

int y = (int)object大括号用于索引。

<强>电子。我们希望我们[]收件箱/取消装箱

您在第二个示例中正在执行装箱/拆箱操作,将object投射到int并返回。这种模式在仿制药之前的日子里更为常见。如果我想要一个可用于任何类型的项目列表,我可以使用object

问题是,他们可以在那里放置他们想要的任何类型。他们可以将object[]intstring[]Guid等全部放在同一个数组中,并且每次都必须将值/ unbox转换为值他们想要,这对表现不利。现在,使用泛型,我们可以Student,这个集合只允许List<int>,它不会打包它们或让我转换为int

我最近使用它的一种方法是处理int时。做一些事情,以便用户可以使用泛型从一个enum投射到另一个enum

如果我这样做了:

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

它会产生错误,即使我们可以从任何给定的enum转换为另一个,通常,即使它知道这两种类型都是enum s。

所以我要做的就是:

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

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