您的位置:首页 > 编程语言 > C#

C#教学第12讲属性2(学习笔记)

2008-11-16 16:41 253 查看
第12讲属性2

快乐乔巴的博客
视频讲师:陈广老师

大家好,今天我们接着上节课的内容继续讲解属性。把上节课的代码稍作调整。



using System;
class User
{
    private string m_name;
    private string m_sex;
    public string Name
    {
        get
        {
            return m_name;
        }
        set
        {
            m_name = value;
        }
    }
    public string Sex
    {
        get
        {
            return m_sex;
        }
        set
        {
            if (value == "男" || value == "女")
            {
                m_sex = value;
            }
            else
            {
                Console.WriteLine("性别只能为“男”或“女”");
            }
        }
    }
}
class Property
{
    static void Main()
    {
        User zs = new User();
        //调用属性
        zs.Name = "张三";
        zs.Sex = "男";
        Console.WriteLine("姓名:" + zs.Name + " 性别:" + zs.Sex);
    }
}




现在让我们来回顾一下属性,声明一个属性,首先要先声明一个跟这个属性相关联的私有字段。接下来就是属性的声明,属性的声明实现了get和set这2个访问器,也就是accessor,在读取属性值的时候,会执行get访问器,给属性赋值时会执行set访问器,当然我们可以在这2个访问器里加入可以实现特定功能的代码。属性的读取和写入跟字段的读取写入没有什么区别,只是在写入属性值的时候会自动的去执行set访问器里的代码,而执行读取属性值的时候会自动的执行get访问器里的代码。
下面我们来看一下属性的种类,属性有四个种类:
1.可读写(Read/Write)属性:需要实现get与set访问器。
2.只读(Readonly)属性:需实现get访问器。
3.只写(Writeonly)属性:需实现set访问器。
4.Static属性:只能访问静态数据。

下面我们用代码来讲解这几个属性;
我们先来设置一个只写的(Writeonly)生日属性



using System;
using System.Windows.Forms;

class User
{
    //首先声明一个只写的属性,生日
    private DateTime m_Birthday;
    public DateTime Birthday
    { 
        //声明一个只写属性只需要实现set访问器
        set
        { 
            //在这里可以对用户的年龄作一个限制
            //超过百岁的或者3岁以下的都可以怀疑其真实的身份
            if (value < Convert.ToDateTime("1900-1-1") || value.Year > DateTime.Now.Year - 3)
                //弹出对话框
                MessageBox.Show("用户的年龄非法");
            else
                m_Birthday = value;
            
        }
    }
}
class Property
{
    static void Main()
    {
        User zs = new User();
        //设置一个非法的生日
        zs.Birthday = Convert.ToDateTime("1899-01-01");
    }
}



运行后,我们会发现,页面会跳出一个窗体警告用户的年龄非法。
现在我们考虑为User类添加一个年龄的属性,我们可以试想一下,如果年龄的属性设置了可读可写,那么用户第一次注册的时候他写入一个年龄25岁,再10年以后他的年龄还是25岁,这样就非常不合理了。所以呢年龄属性根据他的Birthday也就是他的生日来动态的计算。这样呢,年龄属性就应该声明为一个只读属性,我们来实现年龄的只读属性:

using System;
using System.Windows.Forms;

class User
{
    private DateTime m_Birthday;
    public DateTime Birthday
    { 
        set
        { 
            if (value < Convert.ToDateTime("1900-1-1") || value.Year > DateTime.Now.Year - 3)
                MessageBox.Show("用户的年龄非法");
            else
                m_Birthday = value;
        }
    }
    //年龄只读属性
    public int Age
    {
        //只读的只需实现get访问器
        get
        { 
            //年龄的读取是根据生日来动态的计算
            //当前年份减去生日的年份就是年龄
            return DateTime.Now.Year - m_Birthday.Year;
        }
    
    }
}
class Property
{
    static void Main()
    {
        User zs = new User();
        //首先把生日改成一个合法的年份
        zs.Birthday = Convert.ToDateTime("1980-1-1");
        Console.WriteLine(" 年龄:" + zs.Age);
    }
}



运行代码,我们可以看到1980年出生的,今年是2008年的话就是28岁。
好,下面我们来实现静态属性。现在类里面声明一个计数器,用来记录网站被访问的次数。

using System;
using System.Windows.Forms;

class User
{
    //声明一个私有的静态字段
    private static int m_LoginCount;
    //声明静态属性
    public static int LoginCount
    {
        //我们希望User类被创建的时候,它的私有字段m_LoginCount就会被自动加1
        //要实现这个功能就可以使用构造函数,这样的话只需要实现get访问器(只读)就可以了
        get 
        {
            return m_LoginCount;
        }
    }
    //构造函数
    public User()
    {
        m_LoginCount++;
    }
}
class Property
{
    static void Main()
    {
        //进行计数器的测试
        User zs = new User();
        User ls = new User();
        User ww = new User();
        User ml = new User();

        //然后读取刚才我们声明的静态属性,静态属性直接类User调用
        Console.WriteLine(User.LoginCount);
    }
}




我们进行编译,结果是4。我们代码中创建了4个User类的实例,所以结果为4。
好,我们都已经把各个属性的种类一一描述过了,现在来看一属性最常用的地方。(视频中讲述的是C# develop工具,我用的是Visual Studio2005环境,所以用VS来讲述),我们创建一个Windows应用程序,在工具栏上拖拽一个Button控件到Form窗体上,大家将Button的属性窗体显示出来,可以看到Button按钮的所有属性,如图:


我们在Name属性中输入123这样的字符,接着下一个操作的时候,屏幕上会跳出一个警告的窗体:


为什么会弹出这个窗口呢?这就是Button按钮Name属性的set访问器所作用的效果了。输入合法的Name值,就不会有警告了。
好,今天这节课就讲到这里。

由快乐乔巴听课摘写笔记
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: