一个简单的C#类的设计与使用

刚接触C#,设计一个简单的Person类看看效果。

文件CSharpClassv.aspx.cs的代码如下所示:

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class CSharpClass : System.Web.UI.Page
{
    //结构Birthday的定义
    public struct Birthday
    {
        public string year;
        public string month;
        public string day;
    }

    //类Person的定义
    public class Person
    {
        private long id;
        private string name;
        private int age;
        private bool isChinese = true;
        private string address;
        private string email;
        private Birthday birthday;

        public long Id {
            get {
                return id;
            }
            set {
                id = value;
            }   
        }

        public string Name
        {
            get
            {
                return name;
            }
            set
            {
                name = value;
            }
        }

        public int Age
        {
            get
            {
                return age;
            }
            set
            {
                age = value;
            }
        }

        public bool IsChinese
        {
            get
            {
                return isChinese;
            }
        }

        public string Address
        {
            get
            {
                return address;
            }
            set
            {
                address = value;
            }
        }

        public string Email
        {
            get
            {
                return email;
            }
            set
            {
                email = value;
            }
        }

        public Birthday Birthday
        {
            get
            {
                return birthday;
            }
            set
            {
                birthday = value;
            }
        }

        public string getWelcomeWords()
        {
            return "<h1>欢迎进入我的C#首页!!!</h1><br>"
                +"请填写你的个人信息:<br><br>";
        }

       
    }

}

一开始,首先定义了一个结构Birthday:

    public struct Birthday
    {
        public string year;
        public string month;
        public string day;
    }

表示一个人的生日的结构,然后将在Person类中引入一个Birthday结构变量作为私有成员。看看Person类的设计,如下:

    public class Person
    {
        private long id;
        private string name;
        private int age;
        private bool isChinese = true;
        private string address;
        private string email;
        private Birthday birthday;

        public long Id {
            get {
                return id;
            }
            set {
                id = value;
            }   
        }

        public string Name
        {
            get
            {
                return name;
            }
            set
            {
                name = value;
            }
        }

        public int Age
        {
            get
            {
                return age;
            }
            set
            {
                age = value;
            }
        }

        public bool IsChinese
        {
            get
            {
                return isChinese;
            }
        }

        public string Address
        {
            get
            {
                return address;
            }
            set
            {
                address = value;
            }
        }

        public string Email
        {
            get
            {
                return email;
            }
            set
            {
                email = value;
            }
        }

        public Birthday Birthday
        {
            get
            {
                return birthday;
            }
            set
            {
                birthday = value;
            }
        }

        public string getWelcomeWords()
        {
            return "<h1>欢迎进入我的C#首页!!!</h1><br>"
                +"请填写你的个人信息:<br><br>";
        }

       
    }

该Person类定义了7个私有成员,然后通过存取器对私有成员进行了访问的定义。

C#中存取器的设计,和Java中非常地不同,但是基本原理是一样的。

C#中,假设类中存在某个私有成员,定义存取器的一般格式如下所示;

         访问修饰符   类型   属性名称
        {
            get
            {
                return 指定私有成员;
            }
            set
            {
                指定私有成员 = value;
            }
        }

例如,上面Person类中:

birthday是Person的一个私有成员,所以定义属性为Birthday,属性名称的命名一般是首字母大写;

读取使用get关键字,使用return返回(一个Person对象)指定私有成员的值。

修改使用set关键字,使用一个局部变量value赋值给(一个Person对象)指定私有成员。

对birthday进行存取的设计如下:

        public Birthday Birthday
        {
            get
            {
                return birthday;
            }
            set
            {
                birthday = value;
            }
        }

可以通过设置set/get与否,来设置该指定私有成员的访问限制。如果只是设计了get,则该指定私有成员只允许读取,而不允许修改。

例如。上面Person类中:

        public bool IsChinese
        {
            get
            {
                return isChinese;
            }
        }

isChinese私有成员之允许被读取,在定义isChinese私有成员的时候,指定了该成员的值:

private bool isChinese = true;

当为任何一个Person对象分配内存的时候,isChinese成员自动设置为true值,并且可以通过访问属性IsChinese获取该私有成员的值。

Person类中定义了一个简单的方法:

        public string getWelcomeWords()
        {
            return "<h1>欢迎进入我的C#首页!!!</h1><br>"
                +"请填写你的个人信息:<br><br>";
        }

返回一个欢迎词,及其提示信息,可以通过Person对象来访问该方法。

为了能体现我们设计的Person类能够被使用,设计了一个简单的例子。

一个页面为CSharpClass.aspx,上面放置了一些控件,代码如下所示:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="CSharpClass.aspx.cs" Inherits="CSharpClass" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>我的C#首页</title>
</head>
<body>
    <form id="form1" runat="server">
    <div style="text-align: left">
        <asp:Label ID="pageTitle" runat="server"></asp:Label><br />
        <br />
        <asp:Label ID="Label1" runat="server" Text="身份证号:"></asp:Label>
        <asp:TextBox ID="yourId" runat="server"></asp:TextBox><br />
        <asp:Label ID="Label2" runat="server" Text="你的姓名:"></asp:Label>
        <asp:TextBox ID="yourName" runat="server"></asp:TextBox><br />
        <asp:Label ID="Label3" runat="server" Text="你的年龄:"></asp:Label>
        <asp:TextBox ID="yourAge" runat="server"></asp:TextBox><br />
        <asp:Label ID="Label4" runat="server" Text="你的住址:"></asp:Label>
        <asp:TextBox ID="yourAddress" runat="server"></asp:TextBox><br />
        <asp:Label ID="Label5" runat="server" Text="你的邮箱:"></asp:Label>
        <asp:TextBox ID="yourEmail" runat="server"></asp:TextBox><br />
        <asp:Label ID="Label6" runat="server" Text="你的生日:"></asp:Label>&nbsp;<br />
        <asp:TextBox ID="birthYear" runat="server"></asp:TextBox>
        年<br />
        <asp:TextBox ID="birthMonth" runat="server"></asp:TextBox>月<br />
        <asp:TextBox ID="birthDay"
            runat="server"></asp:TextBox>日<br />
        <asp:Button ID="submit" runat="server" OnClick="submit_Click" Style="position: relative"
            Text="确 定" /><br />
        <asp:Label ID="submitSuccess" runat="server"></asp:Label><br />
        <br />
        <asp:Label ID="displayTitle" runat="server"></asp:Label><br />
        <br />
        <asp:Label ID="isChinese" runat="server"></asp:Label><br />
        <asp:Label ID="display" runat="server"></asp:Label></div>
    </form>
</body>
</html>

调试,就能看到这个页面,如图所示:

页面加载的时候,触发了Page_Load方法,在该方法中初始化一个Person对象,调用Person的getWelcomeWords()方法,返回的欢迎词及其提示信息赋值给名称为pageTitle的Label控件。Page_Load方法如下所示:

    protected void Page_Load(object sender, EventArgs e)
    {
        Person pp = new Person();
        pageTitle.Text = pp.getWelcomeWords();
       
    }

填写信息完成以后,单击按钮提交信息,但是这里并没有使用Form表单提交,只是对按钮添加了点击事件,如下所示:

    protected void submit_Click(object sender, EventArgs e)
    {
        Person p = new Person();
        p.Id = Convert.ToInt64(yourId.Text);
        p.Name = yourName.Text;
        p.Age = Convert.ToInt16(yourAge.Text);
        p.Address = yourAddress.Text;
        p.Email = yourEmail.Text;
        Birthday birth;
        birth.year = birthYear.Text;
        birth.month = birthMonth.Text;
        birth.day = birthDay.Text;
        p.Birthday = birth;
        if (p.IsChinese)
        {
            isChinese.Text = "你是一个中国人!";
        }
        else
        {
            isChinese.Text = "你竟然不是一个中国人!";
        }

        submitSuccess.Text = "<font color='red'>恭喜你,信息已经成功提交!</font>";
        displayTitle.Text = "<b>你的个人信息如下所示:</b>";
        string info = "<br><b>ID:</b>" + p.Id
                    + "<br><b>姓名:</b>" + p.Name
                    + "<br><b>年龄:</b>" + p.Age
                    + "<br><b>住址:</b>" + p.Address
                    + "<br><b>邮箱:</b>" + p.Email
                    + "<br><b>生日:</b>" + p.Birthday.year + "年" + p.Birthday.month + "月" + p.Birthday.day + "日";
        display.Text = info;
    }

先把文本框中的文本信息提取出来,通过创建一个Person对象,通过存取器设置属性值,然后在页面上显示出来。点击“确定”按钮之后,如图所示:

这里,主要为了说明Person类的isChinese私有成员,我们并没有(其实不能设置)设置该私有成员的值,而可以根据存取器定义来读取它的信息:

        if (p.IsChinese)
        {
            isChinese.Text = "你是一个中国人!";
        }
        else
        {
            isChinese.Text = "你竟然不是一个中国人!";
        }

所以,在点击“确定”按钮之后,你可以看到,因为private bool isChinese = true;所以显示指定的消息值。

调试总结:

如果我们在Person类设计的时候,私有成员id定义为:

private int id;

并且,在submit_Click事件中:

    protected void submit_Click(object sender, EventArgs e)
    {
        Person p = new Person();
        p.Id = Convert.ToInt32(yourId.Text);
        p.Name = yourName.Text;
        p.Age = Convert.ToInt16(yourAge.Text);
        p.Address = yourAddress.Text;
        p.Email = yourEmail.Text;
        Birthday birth;
        birth.year = birthYear.Text;
        birth.month = birthMonth.Text;
        birth.day = birthDay.Text;
        p.Birthday = birth;
        if (p.IsChinese)
        {
            isChinese.Text = "你是一个中国人!";
        }
        else
        {
            isChinese.Text = "你竟然不是一个中国人!";
        }

        submitSuccess.Text = "<font color='red'>恭喜你,信息已经成功提交!</font>";
        displayTitle.Text = "<b>你的个人信息如下所示:</b>";
        string info = "<br><b>ID:</b>" + p.Id
                    + "<br><b>姓名:</b>" + p.Name
                    + "<br><b>年龄:</b>" + p.Age
                    + "<br><b>住址:</b>" + p.Address
                    + "<br><b>邮箱:</b>" + p.Email
                    + "<br><b>生日:</b>" + p.Birthday.year + "年" + p.Birthday.month + "月" + p.Birthday.day + "日";
        display.Text = info;
    }

由于页面上文本框中id为18位,上面p.Id = Convert.ToInt32(yourId.Text);是不够用的,所以,单击按钮之后出现下面的异常:

 


异常详细信息: System.OverflowException: 值对于 Int32 太大或太小。

源错误:

只有在调试模式下进行编译时,生成此未处理异常的源代码才会显示出来。若要启用此功能,请执行以下步骤之一,然后请求 URL:

1. 在产生错误的文件的顶部添加一条“Debug=true”指令。例如:

   <%@ Page Language="C#" Debug="true" %>

或:

2. 将以下的节添加到应用程序的配置文件中:

<configuration>
    <system.web>
        <compilation debug="true"/>
    </system.web>
</configuration>

请注意,第二个步骤将使给定应用程序中的所有文件在调试模式下进行编译;第一个步骤仅使该特定文件在调试模式下进行编译。

重要事项: 以调试模式运行应用程序一定会产生内存/性能系统开销。在部署到生产方案之前,应确保应用程序调试已禁用。

堆栈跟踪:

[OverflowException: 值对于 Int32 太大或太小。]
   System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info) +2752901
   CSharpClass.submit_Click(Object sender, EventArgs e) +124
   System.Web.UI.WebControls.Button.OnClick(EventArgs e) +75
   System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +97
   System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +7
   System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +11
   System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +33
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +4919

实际上是类型不匹配,应该定义为long型,因为int型不能满足:

private long id;

同时将从文本框中获取到的文本信息转换为int64类型:

p.Id = Convert.ToInt64(yourId.Text);

这样调试就没有问题了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值