51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

【CSharp】面向对象中的属性和对象引用类型分析

本文最后更新于 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}

我们常用的数据类型分类有两种,一种是值类型,一种是引用类型

  1. **值类型:**所谓值类型就是我们给一个变量赋值的时候,如果这个变量被传递,则这个变量会被复制一份。

    那也就意味着,我们操作新的变量,对原有变量没有影响。

    int a=10; int b=a; b++; a=? b=? 结论:a是10 b就是11

    **值类型:**int、double、....

  1. 引用类型: 所谓引用类型,顾名思义,就是一个变量创建后,如果给这个变量作为其他变量的值,其他的
    变量会执行这个原有变量,那就说,你修改了其中一个变量,两者都会变化。

    **引用类型:**数组、集合、对象


赞(1)
未经允许不得转载:工具盒子 » 【CSharp】面向对象中的属性和对象引用类型分析