代码之家  ›  专栏  ›  技术社区  ›  samy

在.net中,只读属性和函数有什么区别?

  •  16
  • samy  · 技术社区  · 14 年前

    从体系结构的角度来看,我想知道.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
    


    Edit :哇,我真的很抱歉没能给你多个答案。

    指出使用属性序列化的第一个答案是通往启蒙的道路,因为我完全忽略了这一点。在此之前,对属性vs函数的解释是“is”vs“does”感觉是任意的。现在,我再摸索一下。

    我认为,人们一致认为,房地产不需要耗费时间,这源于“可序列化” 概念。如果我的属性与数据库对话以存储“is”值,它将以可怕的方式崩溃。

    12 回复  |  直到 14 年前
        1
  •  5
  •   Will Marcouiller    14 年前

    属性结合了字段和方法的概念。事实上,属性的访问方式与字段类似,但底层代码是方法。属性的field部分允许您访问一个值,就像field一样,尽管我可以说,它允许您欺骗这个getter函数和setter过程。属性最常用于控制分配或返回的字段值。冒着重复我自己的风险,它们被作为一个字段访问。

    另一方面,函数、过程,在OOP中都称为方法,都是按定义处理信息的例程。需要在对象或信息块上有一个进程,例如,遇到类似 DoThis , DoThat

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

        2
  •  15
  •   Fredrik Mörk    14 年前

    区别在于语义上的功能性;属性getter实际上是一个隐藏的功能。区别更大的是,作为程序员,您经常希望调用属性getter是一个非常便宜的操作,而调用函数可能会更昂贵。

    请注意,这不一定是这样;您可以很好地实现非常轻量级的函数和非常重的属性getter,但根据经验,属性getter通常只需获取值就可以了。

        3
  •  9
  •   vc 74    14 年前

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

        4
  •  6
  •   Hannele    12 年前

    整个属性的设计可能是为了避免获得一堆单独的GetSomething(),SetSomething(var x)方法,这些方法在2000年代早期的Java中是数据访问的标准。这样可以避免公开的变量。

    相信我,那些课看起来糟透了。我个人认为,物业概念是可读性和结构上的一个飞跃。

        5
  •  2
  •   Sauleil    14 年前

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

        6
  •  2
  •   Tim Schmelter    14 年前

    属性与函数相同。 费时的函数f.e.计算某事或查询数据库。 因此,它们是一种有用的语法糖(如果实现正确)。

        7
  •  2
  •   jasper johnz    14 年前

    get属性应该是纯属性,如果查看.net代码契约,就会发现它们假定getter是纯属性。因此,调用一次get属性、两次get属性或10次get属性都不应该与对象有任何区别,因为在对象上调用方法可能会导致对对象状态的多次更改。

        8
  •  1
  •   Adam Straughan    14 年前

    get/set属性是syntaccit sugar。VB中的Readonly只是一种指定只需要get“函数”的方法

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

        9
  •  1
  •   CodeTwice    14 年前

    我想补充一点,作为使用属性的一个con,序列化理解属性的概念并使用它们,而它对getter/setter方法一无所知。

    public int MyProperty { get; private set; }
    

    您可以从源文件中留出相当多的代码行,使它们更具可读性。

        10
  •  0
  •   RobKop    14 年前

    关键字readonly的意思是“亲爱的编译器不要指望一个setter”,如果我这样做了,惩罚我”。这是VB语法的决定。后台函数和属性getter是相同的。

        11
  •  0
  •   supercat    14 年前

    类的正常调试监视窗口将显示非索引属性的值,但不会显示函数的结果。我对StringBuilder类最讨厌的一点是,它没有当前字符串内容的属性,这使得监视窗口的用处远不如以前。

    另外,与方法不同的是,非索引属性不需要在名称后面加一个();我相信C#中的索引属性需要使用[]而不是()作为参数。

        12
  •  0
  •   alex    6 年前

    我刚刚意识到你可以用一个属性发送参数,就像你用方法发送一样。这意味着您可以编写如下内容:

    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
    

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