.net中的readonly属性和函数有什么区别?

sam*_*amy 16 .net grammar specifications

除了架构观点,我想知道.net在readonly属性和函数之间是否存在任何差异.属性只是功能的概念包装吗?

    Private m_Property As String 
    Public ReadOnly Property PropertyGet() As String
        Get
            Return m_Property
        End Get
    End Property

    Public Function FunctionGet() As String
        Return m_Property
    End Function
Run Code Online (Sandbox Code Playgroud)

拆解IL显示除了名称之外没有区别,但是在另一个级别有差异吗?吸气剂只是一个简短的功能(!?)手?


Edit:哇,我真的很抱歉无法标记多个答案.

第一个回答指出使用属性序列化是通向启蒙的道路,因为我已经完全放弃了这个方面.在此之前,财产与功能的解释为"是"与"确实"感觉是任意的.现在,我更多地了解它.

我认为关于财产不是耗时的共识源于"是"/可序列化的概念.如果我的财产与数据库进行对话以存储"是"值,则会以可怕的方式中断.

Fre*_*örk 15

差异在于更具语义功能; 物业吸气剂实际上是引擎盖下的一个功能.不同的是,作为程序员,你经常期望调用属性getter是一个非常便宜的操作,而调用函数可能会更昂贵.

请注意,情况不一定如此; 你可以很好地实现非常轻量级的功能,以及非常重的属性getter,但是根据经验,属性getter通常不应该只是简单地获取值.

  • 对我而言,不仅如此-它是数据与行动的关系。您的对象可以*执行*对数据库的调用,但是数据库中的数据不是对象的属性。例如,您的应用程序可以从数据库中构建一个“ costumer”对象数组,这些对象将代表数据的实际模型,因此它们的属性将是它们自己的,并且在其他特征之间,该“ costumer”将可序列化,而“数据库”则不会。此外,属性“绝不能”引起异常,并且数据访问,本机互操作等都不安全。只是我的2美分。 (2认同)

vc *_* 74 9

如果您使用数据绑定有一个重要的区别,您根本无法绑定到方法,您只能绑定到属性.


Mar*_*s L 6

整个属性的设计(可能)是为了避免获得一堆单独的GetSomething()和SetSomething(var x)方法,该方法曾经在2000年代初期成为Java数据访问的规范。这样可以避免公开暴露变量。

相信我,这些课程看起来很糟糕。我个人认为,属性概念是可读性和结构上的一大飞跃。


Wil*_*ler 5

属性结合了字段和方法的概念.实际上,属性像字段一样被加入,但底层的代码片段是方法.如果我可以说,属性的字段部分允许您像字段一样访问值,但允许您欺骗此getter函数和setter过程.属性最常用于控制分配或返回的字段值.在重复自己的风险之下,他们作为一个领域被访问.

另一方面,函数,过程(在OOP中称为方法)按定义例程来处理信息.需要对一个对象或一条信息进行处理,例如,遇到函数的名称并不罕见,例如DoThis,DoThat......它们可以在字段或属性上使用,但已知函数不仅仅影响字段,或控制字段上的值.与属性相反的函数可以有多个参数,可选参数,甚至是泛型!

我想补充一点,据我所知,财产不能是匿名的,也不是通用的.注意,我不是说一个属性不能返回泛型,我说属性本身不能通用.一个函数可以是和anonymous,和generic.

简而言之,属性是在字段上使用的概念,用于获得对字段值的控制,而功能是实施者,我们期望它们执行任务,而不仅仅是分配.