刚接触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> <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: |
堆栈跟踪:
|
实际上是类型不匹配,应该定义为long型,因为int型不能满足:
private long id;
同时将从文本框中获取到的文本信息转换为int64类型:
p.Id = Convert.ToInt64(yourId.Text);
这样调试就没有问题了。