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

时间:2010-10-22 12:32:21

标签: .net grammar specifications

除了架构观点,我想知道readonly属性和函数之间的.net是否有任何区别。属性只是函数的概念包装吗?

    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

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


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

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

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

12 个答案:

答案 0 :(得分:15)

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

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

答案 1 :(得分:9)

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

答案 2 :(得分:6)

整个属性的东西 - 可能 - 被设想为避免获得一堆独立的GetSomething(),SetSomething(var x)方法,这些方法曾经是例如Java在21世纪初用于数据访问的标准。这是为了避免公开暴露的变量。

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

答案 3 :(得分:5)

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

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

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

简而言之,属性是在字段上使用的概念,用于控制字段值,而函数是实施者,我们希望它们执行任务,而不仅仅是分配。

答案 4 :(得分:2)

是的,属性只是Set / Get方法的高级概念。

答案 5 :(得分:2)

属性与函数相同。 但是属性表示您正在获取(或设置)对象的“属性”(成员变量),并且这些getter / setter是耗时的函数,即f.e.计算某些东西或查询数据库。 因此,它们是一种有用的语法糖(如果它们被正确实施)。

答案 6 :(得分:2)

获取属性应该是纯粹的,如果你查看.net代码合同,你会发现他们认为getter是纯粹的。因此,调用属性获取一次,两次或10次不应该与对象有任何区别,在对象上调用方法时,可能会导致对对象状态的多次更改。

答案 7 :(得分:1)

属性get / set是syntatcit sugar。 VB中的Readonly只是一种指定你只需要get'function'的方法

然后看起来你应该通过引用(ByRef)将属性传递给方法,但是当你指出它是一个函数而不是实际类型时。

当操作昂贵时,我倾向于使用吸气剂功能,例如GetCustomersFromDatabase()

答案 8 :(得分:1)

我想添加,作为使用属性的con,序列化理解属性的概念并使用它们,而它不知道有关getter / setter方法的任何信息。 另外,如果您使用的紧凑式房产如下:

public int MyProperty { get; private set; }

您可以从源文件中节省大量代码,使其更具可读性。

答案 9 :(得分:0)

关键字readonly只是意味着“亲爱的编译器不要指望一个setter”“如果我这样做,就惩罚我”。这是VB语法的决定。幕后功能和属性获取者是相同的。

答案 10 :(得分:0)

类的正常调试监视窗口将显示非索引属性的值,但不显示函数的结果。我对StringBuilder类的一个烦恼是,它没有当前字符串内容的属性,这使得监视窗口的效果远远低于其他情况。

此外,与方法不同,非索引属性在名称后不需要a();我认为C#中的索引属性需要使用[]而不是()作为参数。

答案 11 :(得分:0)

我刚刚意识到,您可以以与使用方法完全相同的方式发送属性中的参数。这意味着您可以编写如下内容:

Private _ClientName As String

Public WriteOnly Property ClientName(isValid As Boolean) As String
    Set(value As String)
        If isValid Then
            _ClientName = value
        End If
    End Set
End Property

然后您可以这样写:

ClientName(debt = 0) = "Richard"

或者这是验证任何标签控件的文本集的另一种思路:

Public WriteOnly Property OnlyNumbers(label As Label) As String
    Set(value As String)
        If Double.TryParse(value, New Double) Then
            label.Text = value
        End If
    End Set
End Property

然后您可以像这样使用它:

OnlyNumbers(lblTotal) = debt

我不确定这是否被视为对财产的“良好做法”或至少对“正确”的使用。