当我编码如下时,它将在我们的堆栈和堆中创建一个地址。
Student student = new Student();
当我创建一个对象时,它也会在我们的堆栈中创建一个地址。同时它需要更多的RAM空间,因为你需要读出它。那么为什么我们仍然希望在此之下使用呢?
int x=0;
object student=x
int y=(int)student
答案 0 :(得分:1)
我觉得你在很多方面都很困惑。 new
和object
几乎不在同一领域。让我解释一下:
:一种。 “当我编码如下时,它将在我们的堆栈和堆上创建一个地址”
不正确。如果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[]
,int
,string[]
,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
可以转换为任何其他变量。