.net C#属性:它们是如何实例化的?
这可能是一个非常简单的问题,但我试图理解编译的一些内部工作原理 简单地说,想象一个任意对象被实例化。然后在堆上分配此对象。该对象有一个PointF类型的属性(即值类型),带有一个get和一个set方法 想象一下get和set方法包含一些用于执行其工作的计算。如何以及在何处(堆栈/堆)以及何时实例化此代码.net C#属性:它们是如何实例化的?,.net,properties,compilation,.net,Properties,Compilation,这可能是一个非常简单的问题,但我试图理解编译的一些内部工作原理 简单地说,想象一个任意对象被实例化。然后在堆上分配此对象。该对象有一个PointF类型的属性(即值类型),带有一个get和一个set方法 想象一下get和set方法包含一些用于执行其工作的计算。如何以及在何处(堆栈/堆)以及何时实例化此代码 这就是这个问题的背景: 我正在为一个对象编写get和set方法,这些方法需要经常访问。get和set代码本身相当庞大,因此我担心在最坏的情况下,这些方法会被实例化为对象或值类型,每个属性的访问
这就是这个问题的背景:
我正在为一个对象编写get和set方法,这些方法需要经常访问。get和set代码本身相当庞大,因此我担心在最坏的情况下,这些方法会被实例化为对象或值类型,每个属性的访问都包含所有内部代码。另一方面,在创建主对象时,可能会实例化代码,并简单地将CPU告知jmp属性代码start。无论如何,这就是我想要澄清的。它们与方法没有区别。它们与方法没有区别。我不确定实例化是什么意思,但是如果您担心getter的运行时间,可以考虑缓存响应。不过,在我确认getter确实会影响程序的性能之前,我不会这么做。我不确定实例化是什么意思,但是如果您担心getter的运行时间,可以考虑缓存响应。不过,在我确认getter确实会影响程序的性能之前,我不会这么做。我没有我的副本,但是getter和setter属性只是类上带有特殊修饰的方法。Jeffery Richter的优秀著作将包含所有的细节。我没有带我的副本,但是属性的getter和setter只是类上具有特殊装饰的方法。杰弗里·里克特(Jeffery Richter)的优秀著作将包含所有细节。可执行代码既不在堆栈上也不在堆上分配,而是在需要时由JIT'er编译,并留出一次相应的内存。也就是说,你在担心什么本质上不是问题。另外,不要再去猜测垃圾收集器在内存分配方面做了什么——它可以让你不再担心这个问题。可执行代码既不是在堆栈上也不是在堆上分配的,而是在需要时由JIT'er编译的,相应的内存会留出一次。也就是说,你在担心什么本质上不是问题。另外,不要再去猜测垃圾收集器在内存分配方面做了什么——它可以帮你消除这种担忧。方法(或属性)不会被实例化。你似乎在想我曾经做过的事情——创建一个类的实例不仅为数据分配空间,也为代码分配空间。事实并非如此
即使是C++,这种方式也会被分配数据,以及指向函数指针数组的指针——虚函数表或VTABLE。vtable中的条目将指向虚拟方法。非虚拟方法不需要vtable中的条目
在这两种情况下,无论实例化了多少对象,代码都只有一个副本。方法(或属性)不会被实例化。你似乎在想我曾经做过的事情——创建一个类的实例不仅为数据分配空间,也为代码分配空间。事实并非如此即使是C++,这种方式也会被分配数据,以及指向函数指针数组的指针——虚函数表或VTABLE。vtable中的条目将指向虚拟方法。非虚拟方法不需要vtable中的条目
在这两种情况下,无论实例化了多少对象,代码都只有一个副本。根据属性和方法,它们确实有一些本质的区别。特别是在返回数组时,属性会在返回整个数组之前执行整个数组的浅层复制,因此在这种情况下,您需要使用自定义函数 然而,正如我上面解释的,我想知道如果我以任何方式使用属性而不是函数,程序是否会受到性能损失。总的来说,由于一些无法解释的原因,我确实发现属性平均比函数慢5%。这可能是因为属性拥有一系列“不可见”对象,如PropertyDescriptor等。除此之外,这些实现似乎相当相似。根据属性和方法,它们确实有一些本质的区别。特别是在返回数组时,属性会在返回整个数组之前执行整个数组的浅层复制,因此在这种情况下,您需要使用自定义函数然而,正如我上面解释的,我想知道如果我以任何方式使用属性而不是函数,程序是否会受到性能损失。总的来说,由于一些无法解释的原因,我确实发现属性平均比函数慢5%。这可能是因为属性拥有一系列“不可见”对象,如PropertyDescriptor等。除此之外,实现似乎非常相似。在getter或setter中嵌入大量功能并不是一个好主意,与其使用Get*和Set*方法,不如使用Get*和Set*方法——这向使用者提供了一个提示,说明所涉及的功能不仅仅是琐碎的功能。在getter或setter中嵌入大量功能并不是一个好主意,而应改为使用Get*和Set*方法——这向使用者提供了一个提示,说明其中包含的功能不止一个