注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

樱之花

叶散的时候,你明白欢聚;花谢的时候,你明白青春.

 
 
 

日志

 
 
关于我

分类中“我的实验室”是我在日常工作中的一些知识总结,有些写的比较匆忙,可能大家在阅读时会产生困扰,后期有时间我会重新整理编辑,谢谢大家的到访,您们的支持是我前进的动力!

网易考拉推荐

ASP.NET类中的字段和属性有什么区别  

2012-02-25 10:19:01|  分类: .NET/C# |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

在类的实际应用中,我们发现在成员数据中可以同时定义字段和属性,二者取值和赋值的方式看上去似乎一样,那么为什么要分这两种方式呢?实际它们是有区别的,一般来说ASP.NET类中的字段原则上不给外面类直接调用,字段要提供给外面的类调用最好的方式是通过调用属性。属性共用了字段和方法的部分特性,属性的Get和Set里面可以写一些代码,比如对内部字段进行一些简单的控制。简单说,Property类似method(方法),被编译成 get_id 和 set_id 两个方法,而不是一个简单的id属性。只是,编译器以及设计器比较高级,让用户以为Property是跟Field差不多一样的东西。因此表面上看,属性更加容易控制读写以及读写的规则。
现在我们着重讲下属性。以下是一个简单代码,红色部分我们可以看到,如果对属性id赋值时,如果值小于0程序会把属性赋值为0,这里就完成对属性的自定义控制。当然我们也可以直接使用m_id字段,我们可以把一些业务规则放在调用该字段前处理,只是实现的方式不一样罢了。

Public Class viewType
        Private m_id as integer

        Property id() As Integer
            Get            '当读取属性取值的时候发生
                Return m_id
            End Get
            Set(ByVal value As Integer)            '当属性被赋值的时候发生
                If value<0 Then value=0
                m_id = value
            End Set
        End Property
End Class

我们再举另外一个VCD的例子,这里我参考了网上的资料(http://hi.baidu.com/%C1%AC%B6%F9/blog),这边讲的是定义一台VCD,要把它的颜色设置为红色,宽度不能大于50:
Partial Class _4
    Inherits System.Web.UI.Page
    Class vcd
        Dim w As Integer'定义一个整形字段
        Public color As String
        Property width() As Integer'定义类字段
            Get
                Return w'获取变量的值
            End Get
            Set(ByVal value As Integer)
               If value > 50 Or value < 10 Then
                    w = 50
                Else
                    w = value
                End If

            End Set
        End Property
    End Class
    Protected Sub Page_Load1(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim a As vcd
        a = New vcd
        a.color = "red"
        a.width = 80'给类属性赋值

        Response.Write("你购买VCD<br> 颜色是:" & a.color & " <br> 宽度是:" & a.width)        
    End Sub
End Class

按F5预览结果:
你购买VCD
颜色是:red
宽度是:50 '这里已不是80

因此我们发现了属性的特点是,可以执行一些想要的操作比如限制输入太大的值等。

一个属性一定是ReadWrite, ReadOnly, 或 WriteOnly的
上面的例子演示的是ReadWrite的属性。下面的例子将演示如何创建ReadOnly和 WriteOnly的属性。
Public ReadOnly Property FullName as String
Get
Return m_FirstName & " " &m_LastName
End Get
End Property

Public WriteOnly Property Password as String
Set
m_Password = Value
End Set
End Property

请注意,当你省略了Get块或Set块时,你一定要使用ReadOnly或WriteOnly关键字

索引属性和默认属性
一个属性可以被指定一个或多个索引。这可以使属性具有数组的特点。请看下面的类:
Class Class1
Private m_Names As String() = {"Ted", "Fred", "Jed"}
' an indexed property
Readonly Property Item(Index As Integer) As String
Get
Return m_Names(Index)
End Get
End Property
End Class

在客户端,你可以用下面的例子访问Item属性。
Dim obj As New Class1
Dim s1 String
s1 = obj.Item(0)

如果把这个例子作进一步的改进,你可以把一个索引属性标记为类的默认属性。为了实现这一点,只要把Default关键字加到上一个例子中就可以了,就像这样:
Default Readonly Property Item(Index As Integer)…

一旦你为一个索引属性标记了Default关键字,客户端的代码就可以省略属性的名字而使用对象引用,就像使用一个数组一样。
Dim obj As New Class1
Dim s1 String
s1 = obj(0)

请注意,对于默认属性有一个重要的限制,即非索引属性不可以被标记为默认属性。这个限制在Visual Basic.NET中体现了出来,因为你不可以用Set语句来指定一个对象引用。既然Set语句不再被Visual Basic.NET所支持,那么非索引的默认属性将导致无法解决的多义性问题。

  评论这张
 
阅读(1321)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017