什么是对象创建
本文关键字:创建 对象 什么 | 更新日期: 2023-09-27 18:05:37
我写了一些简单的代码。
class Customer
{
public string FirstName;
public string LastName;
}
class Worker
{
public int Wage;
}
class Program
{
Customer C = new Customer();
C.FirstName = "James";
C.LastName = "Cronin";
}
我知道它不会打印任何东西,因为没有任何方法。但是我就是看不懂下面的代码。
Customer C = new Customer();
我知道new Customer
是用于创建Customer
对象的实例,C
是指向该对象在堆中的位置的对象引用变量。我得到C
必须是引用类型来指向对象的位置,这就是为什么我使用Customer
类型作为类的引用类型。
但是为什么C
必须有Customer
变量?我的意思是,既然C
只是指向对象的位置,为什么C
不能是任何其他类,如Worker
类?
正如已经说过的,这是因为c#是强类型的<——强类型在。net框架中意味着什么?
但这里有一个小的思维实验。只需考虑内存中客户和工作人员的大小。Worker有一个变量,而customer有两个,所以它们在内存中的大小"不可能"相同。
如果你想去掉这个声明
Customer c = new Customer();
你可以很容易地说
var c = new Customer();
这不会在内存或IL中改变一点,我通常不推荐这样做,因为可读性(有时它更可读),但如果这是你的项目,你对它很满意,那么就这样做。
也许还有一些事情需要记住:假设我们有一个包含Customers的泛型列表,你想迭代它,你的程序知道对象的大小,可以简单地从一个对象跳到另一个对象,而不需要读取每个对象。
这些例子很简单,但我希望你能明白。你不能把一升牛奶放进一个500毫升的空橙汁瓶子里而不避免有人混淆
编辑:由于我不是微软的员工,我对CLR的所有细节都不了解,所以我不能说太多细节,但我猜它很像java,其中大部分细节都放在程序的IL表示中。所以你的类工作者有不同的大小和不同的指针指向不同大小的变量,而不是客户。因此,当程序执行时,程序必须知道指向哪里以及对象的大小,这样它才能知道对象中的另一个对象在哪里,或者方法在哪里开始。我猜你可以写一本关于这些东西的书,然后在上面草草写一下。但写了这么多之后,它要复杂得多:"这里是指向对象的指针,这里是指向对象的指针,有什么区别?";)
对象基本上是根据蓝图分配和配置的内存块。
您的案例中的蓝图是一个Customer
类,并且在执行Customer C = new Customer();
行时发生内存分配。
MSDN上的更多阅读
class Program
{
static void Main(string[] args)
{
ClassB b = new ClassB()
{
PropclassA = new ClassA()
{
TestProp = 10,
}
};
ClassB b1 = new ClassB();
b1.PropclassA.TestProp = 100;
}
}
class ClassA
{
public int TestProp { get; set; }
}
class ClassB
{
public ClassB()
{
PropclassA = new ClassA();
}
public ClassA PropclassA { get; set; }
}