c# - New 和 Object 之间有什么不同以及它在堆栈和堆中的工作方式
问题描述
当我编写如下代码时,它将在我们的堆栈和堆中创建一个地址。
Student student = new Student();
当我创建一个对象时,它还会在我们的堆栈中创建一个地址。同时它需要更多的 RAM 空间,因为您需要将其读出。那么为什么我们还要在下面使用呢?
int x=0;
object student=x
int y=(int)student
解决方案
我觉得你对很多事情都很困惑。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>
,并且这个集合只允许int
s,它不会将它们装箱或让我强制转换int
。
不过,我最近使用它的一种方法是在处理enum
s. 做一些事情,以便用户可以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
可以转换为任何其他变量。
推荐阅读
- java - 无法覆盖 apache camel 中处理器之间的 bean 属性
- css - Flex justify-content, align-items 在 Safari 或移动浏览器上不起作用
- git - git错误:致命:身份验证失败
- python - Python3 socket.recv 没有确认
- angular - 希望使用材料设计在 Angular 8 中使用动态网格
- c++ - 如何在 Windows 中增加 CPP 的堆栈空间?
- c# - 绑定文本需要在 Xamarin 中重新加载页面
- high-availability - 客户康复后Nomad传播
- android - Whatsapp 如何在 Android 11 上获得 SYSTEM_ALERT_WINDOW 权限?
- python - 无法导入 PyQt5