Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net C#属性:它们是如何实例化的?_.net_Properties_Compilation - Fatal编程技术网

.net C#属性:它们是如何实例化的?

.net C#属性:它们是如何实例化的?,.net,properties,compilation,.net,Properties,Compilation,这可能是一个非常简单的问题,但我试图理解编译的一些内部工作原理 简单地说,想象一个任意对象被实例化。然后在堆上分配此对象。该对象有一个PointF类型的属性(即值类型),带有一个get和一个set方法 想象一下get和set方法包含一些用于执行其工作的计算。如何以及在何处(堆栈/堆)以及何时实例化此代码 这就是这个问题的背景: 我正在为一个对象编写get和set方法,这些方法需要经常访问。get和set代码本身相当庞大,因此我担心在最坏的情况下,这些方法会被实例化为对象或值类型,每个属性的访问

这可能是一个非常简单的问题,但我试图理解编译的一些内部工作原理

简单地说,想象一个任意对象被实例化。然后在堆上分配此对象。该对象有一个PointF类型的属性(即值类型),带有一个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*方法——这向使用者提供了一个提示,说明其中包含的功能不止一个