第十三讲:属性&析构函数
为什么需要属性?
字段要么完全公开(pulic),要么只给他儿子、孙子公开,要么只是给本项目内公开,要么隐藏(private)。
——有什么办法可以实现可见但只读?
给字段赋值的时候完全不设防
——有什么办法可以在赋值之前先检查值呢?
C#的属性可以解决处理这些问题。
构造函数
-
为什么需要构造函数?
-
实例化对象到底干了神马?? 真的只是为了在内存中去开个房间那么简单?
-
好吧,就算是真的,假设我希望在开房间的时候顺便做点神马,比如————
买点零食
,晚上饿了吃 -
其实我是想说在实例化对象的时候顺便将一些要给对象的数据同步赋值上去而已。 在类里边直接进行,
public + 类名(参数) {}
/// <summary> /// 实例化一个具有全部参数的对象 /// </summary> /// <param name="Name">商品名称</param> /// <param name="Price">价格</param> /// <param name="Color">颜色</param> public Products(string Name,decimal Price,string Color) { _name = Name; _price = Price; _color = Color; }
给字段赋值的时候完全不设防
——有什么办法可以在赋值之前先检查值呢?
public string Name
{
get { return _name; }
set
{
if (value == null)
_name = "啥子哦,想骗我";
else
_name = value;
}
}
- 构造函数是在实例化对象时自动调用的函数
——必须与类名相同
——无返回值类型
——实例化对象的时候总是会执行构造函数
——如果没有明显申明,则c#提供一个默认的空构造函数。
关上身后的每一扇门
- 做人要做无憾的人生?
- 做事不能留尾巴。
- 但是:前面我们总是在不断的申明对象,都没有回收对象(准确说我们在内存中制造垃圾)
析构函数是实现销毁一个类的实例的方法成员。
-
—析构函数不能有参数
-
—不能任何修饰符而且不能被调用。
-
—前缀‘~’以示区别
~Products() { //要清理那些非托管的资源就写代码 }
使用析构函数——注意事项
- 不能在结构中定义析构函数。只能对类使用析构函数。
- 一个类只能有一个析构函数。
- 无法调用析构函数。它们是被自动调用的。
- 析构函数既没有修饰符,也没有参数。
- 凡托管资源,c#均可自动回收,只有使用了非托管资源才需要专门使用析构函数来释放。
小结
-
为什么需要属性?
—控制读写权限
—更安全的赋值
-
构造函数是做什么的?
—在实例化的时候做一些事情。
-
析构函数的作用
— 清理非托管资源