本文最后更新于 2024-05-07,文章可能存在过时内容,如有过时内容欢迎留言或者联系我进行反馈。
前言 {#%E5%89%8D%E8%A8%80}
重要性:
【1】属性是我们开发中只要用到对象,很多时候,都会使用。同时属性也有一定的特殊性,所以,属性学习,是一个难点(相对的)。
【2】对象引用类型。解决我们将对象做为数据传递中,数据更新的同步问题。
一、对象的属性(Propery) {#%E4%B8%80%E3%80%81%E5%AF%B9%E8%B1%A1%E7%9A%84%E5%B1%9E%E6%80%A7%EF%BC%88propery%EF%BC%89}
我们学习软件开发的目的是什么?就是数据处理和获取信息。始终围绕"数据"展开!
所以,我们必须考虑数据如何存取的问题。
我们想到:各种数据库(关系型的SQLServer、MySql)还是非关系的(Redis、MongoDB...)
其实,我程序中,数据库处理最多的,就是内存中读取,以上数据库,只是"最后"做持久化。
我们程序中,大部分数据是有规律的。所以,我在做数据存储的时候,在内存中,我们必须用一定的方式把它保存起来。
对象有两大特征:静态特性之属性,动态特征之方法。
属性就是用来存取数据的。当然,我们对于临时数据的存储还有各种各样的局部变量。
1、对象中字段的基础使用 {#1%E3%80%81%E5%AF%B9%E8%B1%A1%E4%B8%AD%E5%AD%97%E6%AE%B5%E7%9A%84%E5%9F%BA%E7%A1%80%E4%BD%BF%E7%94%A8}
**结论:**当我们定义一个字段后,通过对象去使用,只要我们的数据符合字段的数据类型,赋值就是成功的。
**问题:**对于非法数据,字段是无法自己过滤的!必须要解决!
希望:我们设计一个对象,希望这个对象有基本的自我保护能力!
**解决:**我们通过生活的案例分析,想到,给属性增加自我的基本保护能的方法是添加业务!
**案例:**我们发现,属性本身没有保存数据,用户通过属性赋值、取值,最后其实都是操作的对应的私有字段。
属性本质是什么?属性的本质,其实就是两个对应的方法!
private int _courseId = 0;
public int CourseId
{
get { return _courseId; }//读取字段值
set//给字段赋值
{
if (value < 0)
_courseId = 1000;
else
_courseId = value;
}
}
**结论1:**属性可以添加我们需要的业务!
private int _courseYears;
public int CourseYears
{
get
{
return DateTime.Now.Year - _publishDate.Year;
}
}
**结论2:**属性不仅可以增加业务,还可以设置为只读属性!
**对比:**字段如果我们加上readonly也可以让它变成只读!但是两个有本质区别!
属性,不仅是可以做成只读,而且,可以增加业务!
public int Points
{
get { return (_coursePrice / 100) * 2; }
}
**结论3:**属性不仅可以只读,而且,可以没有私有字段,只有自己的业务部分!
补充结论:属性的业务可以非常简单,也可以复杂,比如读取数据库,读取文件等都可以放到属性中。
【字段和属性对比的初步结论】属性的操作和可用性比字段丰富的多!!!!!
字段和属性的比较,我们就好比买车一样,很多功能配置,你可以不用,但是不能没有!
2、字段和属性的对比 {#2%E3%80%81%E5%AD%97%E6%AE%B5%E5%92%8C%E5%B1%9E%E6%80%A7%E7%9A%84%E5%AF%B9%E6%AF%94}
【1】修饰类型
- 字段:本身就是为了让你在类的《内部使用》,所以,一般字段都是private,也就是不希望你通过对象去使用字段。
- 属性:本身就是为了让你从类的《外面使用》,所以,一般属性都是public,也就是说希望通过对象去使用属性。不过我们发现,属性本身其实并没有真正的保存数据,属性的数据保存到了私有字段。属性其实就是外界访问私有字段的一个入口。当然属性也可以没有私有字段。这种属性就是纯业务属性。
【2】业务使用
- 字段:不能增加任何的业务!
- 属性:可以增加我们需要的任意业务,可以在get中,也可以在set中,非常灵活。
【3】赋值取值
- 字段:可以"任意"赋值和取值。
- 属性:可以非常灵活的控制只读属性。同时,属性和字段是可以独立使用的。也就属性不见得有私有字段。
【4】强制要求
- 当我们封装一个对象的时候,对外提供的只有属性,一般不能用字段,尤其是对于数据展示类型的控件
- 控件只是解析属性,而不解析字段
3、属性的变化过程 {#3%E3%80%81%E5%B1%9E%E6%80%A7%E7%9A%84%E5%8F%98%E5%8C%96%E8%BF%87%E7%A8%8B}
【1】刚才给大家演示的,都是在.NET 2.0时代的时候使用的。
【2】.NET 3.0时代,出现了自动属性。
- 自动属性:就是只有标准的set和get的情况下,我们可以省略私有的字段。
【3】.NET 4.6时代属性更加简化和灵活
二、对象引用类型 {#%E4%BA%8C%E3%80%81%E5%AF%B9%E8%B1%A1%E5%BC%95%E7%94%A8%E7%B1%BB%E5%9E%8B}
我们常用的数据类型分类有两种,一种是值类型,一种是引用类型
-
**值类型:**所谓值类型就是我们给一个变量赋值的时候,如果这个变量被传递,则这个变量会被复制一份。
那也就意味着,我们操作新的变量,对原有变量没有影响。
int a=10; int b=a; b++; a=? b=? 结论:a是10 b就是11
**值类型:**int、double、....
-
引用类型: 所谓引用类型,顾名思义,就是一个变量创建后,如果给这个变量作为其他变量的值,其他的
变量会执行这个原有变量,那就说,你修改了其中一个变量,两者都会变化。**引用类型:**数组、集合、对象