在定义类的成员过程中会定义成员的类型如下
访问修饰符 | 说 明 |
public | 所属类的成员以及非所属类的成员都可以访问 |
private | 只有所属类的成员才能访问(默认的访问修饰符) |
protected | 所属类或派生自所属类的成员可以访问 |
internal | 当前程序集可以访问 |
internal protected | 当前程序集或所属类的派生类可以访问 |
那么这个时候你所定义的成员是五种类型中的一种,当定义为public时,说明所有都可以对这个类中的此成员对其进行访问,那么就容易出现危险,这时就要将类成员类型改为private形,这是如何对其成员进行访问呢?
利用属性,在c#类中属性是可以对其类私有成员对其进行读取和设置的,利用的是get访问器和set访问器如下
C#中属性采用如下方式进行声明:
[属性修饰符] 属性的类型 属性名称
{
set{}
get{}
}
属性的优点是在于它有良好的封装性。属性不允许外部程序直接访问类的成员,而是通过属性中的访问器对其进行访问(利用get和set对属性的成员的值进行读写)。
根据get和set访问器是否存在,属性可分成如下类型:
读写(read-write)属性:同时包含 get 访问器和 set 访问器的属性。
只读(read-only)属性:只具有 get 访问器的属性。将只读属性作为赋值目标会导致编译时错误。
只写(write-only)属性:只具有 set 访问器的属性。除了作为赋值的目标外,在表达式中引用只写属性会出现编译时错误。
/*习题:在User类中添加两个私有的成员变量,用来表示生日和年龄,并设计相应的属性完成对其的访问,要求生日是只写属性,并能判断出如果用户输入的生日年份小于1900年,或当前年龄小于3岁,给出输入错误提示信息,年龄是只读属性。设计一个测试类来对User类进行使用。*/
//代码为:
namespace ConsoleApplication1
{
public class User
{
private string name;
private string sex;
private DateTime birthday;
private int age;
public string Name
{
get { return name; }
set { name = value; }
}
public string Sex
{
get { return sex; }
set {
if (value == "男" || value == "女")
{ sex = value; }
else
{ Console.WriteLine("输入不合理!"); } }
}
public DateTime Birthday
{
set {
if (value.Year <= 1900 || DateTime.Now.Year - value.Year <= 3)
{ Console.WriteLine("用户输入不合理!"); }
else
{ birthday = value; } }
}
}
public int Age
{
get {
age = DateTime.Now.Year - birthday.Year;
return age; }
}
}
class Program
{
static void Main(string[] args)
{
User zs = new User();
zs.Name = "张三";
zs.Sex = "男";
zs.Birthday = Convert.ToDateTime("1990-2-1");
Console.WriteLine("姓名:" + zs.Name + "\n性别:" + zs.Sex+"\n年龄:
“+zs.Age);
Console.ReadLine();
}
}
}
属性的使用原则:属性和变量都可以用来表示事物的状态,但属性可以实现只写或只读并且可以对用户指定的值进行有效性检查,从而保证只有正确的状态才会得到设置,而变量不能
在c#中一般采取一下使用原则
(1)若在类的内部记录事物的状态信息,则用变量。变量一般用private修饰,以防止对外使用。
(2)对外公布事物的状态信息,则使用属性。属性一般与某个或某几个变量有对应关系。
属性,从外部(类的使用者)来看,类似于类的成员变量。从内部(类的作者)来看,类似于类的方法。