什么是属性封装?
我们先来看看下面这段代码
class Student
{
public string _name;
public int _age;
}
class Program
{
static void Main(string[] args)
{
Student a = new Student();
Console.WriteLine("请输入学生姓名:");
a._name = Console.ReadLine();
Console.WriteLine("请输入学生年龄");
a._age = int.Parse(Console.ReadLine());
Console.WriteLine("学生姓名:{0},年龄:{1}", a._name, a._age);
Console.ReadLine();
}
}
这是一段很简单的代码,一个学生类,一个测试类,并给这个对象字段进行赋值操作,这只是正常情况下,我记得我在某个博文上看到这么一句话“程序员的25%的时间是用考虑用户会输入什么奇葩数据“,这里age我们并没有什么逻辑判断,因此这里是数据不收我们的控制,用户可以随意的输入数据-1,1000.......等等。
分析:用户可以随意输入数据由两点引起!权限、没有逻辑判断,导致数据不符合常识,那么我先从权限上下手,私有化,但是私有的权限是当前类可以操作外部类操作部了,因此暴露一个方法出去,由这个方法负责当前类字段的和外面的联系,但是!方法封装的是对象的对象的行为!而不是封装数据字段!,所以就用到属性封装!
class Student{
private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
private int _age;
public int Age
{
get { return _age; }
set
{
if (value >= 0 && value <= 100)
_age = value;
else
_age = -1;
}
}
}
class Program
{
static void Main(string[] args)
{
Student a = new Student();
Console.WriteLine("请输入学生姓名:");
a.Name = Console.ReadLine();
Console.WriteLine("请输入学生年龄");
a.Age = int.Parse(Console.ReadLine());
Console.WriteLine("学生姓名:{0},年龄:{1}", a.Name, a.Age);
Console.ReadLine();
}
}
Student类中的name 和age都被封装为读写属性,
get访问器 为只读属性//读 就是返回当前的数据
set访问器 为只写属性//写 就对封装的字段进行赋值,运算等操作
包含get和set访问器 为读写属性//两者特性都同时拥有
从上面我的代码我们可以发现字段的安全性被提高了,这就是属性封装,将字段封装到内部中,提供对外访问我的方式.
属性的类型可以任意类型吗?
可以,对象,数组等等。
属性和方法的区别是什么?
如果从概念上来解释就是属性封装的是字段,方法封装的是对象的行为,从语法上来看,方法有()属性没有()且属性没有返回值。
属性和字段有什么区别了?
如果从概念上来解释就是属性的字段是保护者,负责字段的安全,从语法上看字段的权限是private 属性是public
很多时候我们已经养成了一创建某个字段就会私有化并进行属性封装,但是我们并没有进行什么逻辑判断,如果你是手写代码而不是使用快捷键等操作,效率是很低下的,如下
private string name;
public string Name
{
get { return _name; }
set { _name = value; }
}
在C#更新到3.0的时候提供了一个新特性就是 ” 自动属性封装“!自动属性封装提高了代码的简介性!如下:
private string name;
public string Name
{
get;
set;
}
效果和原写法是一样的,其实这还是不最简介的,如下去掉换行更加简介。
private string name;
public string Name{get;set;}