C#学习笔记(九)
- 第六章 面向对象编程(一)类与对象、字段与属性
- 一、类与对象正确的理解
- 1. 什么是类?
- 2.什么是对象?
- 3. 类与对象的区别
- 二、类的基本规范和对象使用
- 1. 类的规范
- 三、类的访问修饰符(简述)
- 1. 项目和程序集
- 2. 类的访问修饰符public和internal
- 四、字段与属性
- 1.字段
- 字段的修饰符public 和 private
- 2.属性
- 2.1属性的定义与发展史
- 2.1.1 .NET2.0时代
- 2.1.2属性的结构
- 2.2.3 为什么用属性
- 2.1.4 .NET3.0时代
- 2.1.5 .NET4.6时代
- 2.1.6 class类型的属性以及属性数组
第六章 面向对象编程(一)类与对象、字段与属性
在 C#程序中,类是程序的基本单元,程序不管多么简单多么复杂,都是由不同的类组成。如何写好项目需要的类?
一、类与对象正确的理解
1. 什么是类?
举个例子,如何在程序中创建一张居民身份证。
首先身份证包含的信息有:姓名、性别、民族、出生日期、住址、身份证号。
public class ID_card{public string name;// 姓名public string sex;// 性别public string nation;// 民族public string address;// 住址public string IDnumber;// 身份证号码public DateTime dateBirth;// 出生日期}
这是一张身份证上所要包含的信息,将身份证抽象为一个类命名为ID_card,类里面使用字段定义信息姓名、性别、民族、出生日期、住址、身份证号。这就创建了一个类。
2.什么是对象?
上述 “什么是类?”中创建了一张居民身份证,但是如何将身份证发放给个人比如这个人叫“流星”,这就需要为“流星”制作身份证卡片,于是这个世界多出了一张卡片。
在代码中如何实现
ID_card card_202410161024=new ID_card();card_202410161024.name = "流星";card_202410161024.sex = "男";card_202410161024.nation = "汉";card_202410161024.address = "上海";card_202410161024.IDnumber = "3421234567832";card_202410161024.dateBirth = new DateTime(2000, 10, 17, 12, 30, 0);
创建一个对象是通过 new 关键字来实现的,通过上面的代码就将ID_card这个类实例化并产生了一个对象命名为card_202410161024。
3. 类与对象的区别
类定义的是一个“概念模型”,在这个模型中规定对象的“属性”和“方法”。对象是按照类这个模型创造出来的真实“实体”,每个属性都有特定的“值”。(属性的概念后面记录)
二、类的基本规范和对象使用
1. 类的规范
类的基本规范如下:
访问修饰符 class 类的名称
{// 字段部分字段 1 的类型 字段 1 名称字段 2 的类型 字段 2 名称
…// 属性部分属性 1 属性 2
…
// 方法部分方法 1方法 2…
}
以上是类的标准规范,具体根据需要定义。
三、类的访问修饰符(简述)
1. 项目和程序集
简单点项目包括:控制台应用程序,Windows应用程序,类库(Class Library)等,而程序集叫Assembly(也就是我们创建项目中的AssemblyInfo.cs文件),
一个项目也就是一个程序集,介绍上面的目的为了说明,一个项目的internal无法在另一个项目中调用。
原文链接:https://blog.csdn.net/xiaolei1982/article/details/2257280
2. 类的访问修饰符public和internal
public:公共的
internal:内部的
在类的规范中 class 前可手动添加访问修饰符public或internal,若不添加默认为internal修饰。
在一个类定义和使用它的地方,如果都在一个程序集内,是可以不添加的 public 的,默认 internal 的意思就是程序集内部。如果定义和使用在
不同的程序集中,就必须添加。
如图所示在ConsoleApp1项目中有两个类文件分别是Class1.cs与Program.cs,这两个类文件属于同一个程序集,这两个类文件中的类,即使使用internal修饰也可以相互使用,因为他们本身就是在同一内部。
四、字段与属性
之前一直提到属性但从来没用过,字段和属性有着千丝万缕的联系,如果没有很好的理解字段那属性是无法讲解的。
1.字段
在面向对象的学习中会遇到两种变量一种是“局部变量”,一种是“成员变量”。
- 局部变量,定义在方法内部,作用范围只限于方法内部。
- 成员变量,也就是“字段”。字段是定义在类的内部,方法外面。它不属于某一个特定方法,而是供这个类内部所有的方法使用的。所以成员变量的作用范围是整个类的内部。
字段的修饰符public 和 private
类的修饰符有 public 和 internal,字段的修饰符是 public 和 private 两种,当没有添加任何修饰符的时候默认是 private。
private:私有的
后面实际开发中我们很少用 public修饰字段,因为字段设计的初衷是给类内部使用,而非外部使用。这里所说的外部使用,就是通过对象的方式去调用字段。如下图所示private所修饰的weight,无法通过对象调用。
2.属性
2.1属性的定义与发展史
2.1.1 .NET2.0时代
在一个类中定义一些属性
namespace ConsoleApp1
{class Class3{
// 属性1private int Str1 = 30;public int STR1{get{return Str1;}set{if (value>100){Str1 = 100;}if(value<0){Str1 = 0;}}}
// 属性2private string name = string.Empty;public string Name{get{return name;}set{name = value;}}
//属性3public double Weight{get{double weight = 99.99;return weight;}}}
}
get:获取
set:设置
2.1.2属性的结构
属性包括两部分,一部分是 get,用来获取属性的值,也就是我们在通过对象调用属性的时候,如果是读取属性值,这个 get 被调用。其实 get 的本质就是一个方法。另一部分是set,set 其实也是一个方法,我们给属性赋值的时候,这个方法被调用。除此以外呢,我们发现当读取或者赋值属性的时候,其实操作的是一个对应的私有字段,比如STR1属性,对应的是Str1 这个私有字段。当调用 get 的方法的时候是读取这个字段的值,当调用 set 方法的时候,我们所赋值的具体数据首先会到 value 这个“中间变量”中,然后通过 value传给对应的私有字段Str1 。
2.2.3 为什么用属性
- 属性轻松增加业务逻辑
假设微信中的转账金额不能小于0,不能大于100。当为转账金额STR1赋值时,它自身就具有这个业务逻辑,消除了安全隐患。 - 只读属性轻松控制。
上面的代码中Weight是一个只读属性,只需要将set删除就可以实现。get内部也可以增加相应的逻辑。 - 不得不用属性
很多控件中只能调用和解析对象的属性,不能用字段。所以不得不用解析。 - 字段的作用
出现属性这一概念后,字段的作用好像就是为解析服务的,字段起到服务于属性的作用。
强调:属性一般都是 public 做修饰符,使用 private 是不合理的设计。
字段一般都是 private 做修饰符,个别情况可以使用 public,但是很少。
2.1.4 .NET3.0时代
对于可读可写、没有任何业务逻辑的属性可以简化书写为如下格式:
public string Name{get;set;}public double Weight{get;set;}
可以发现除了没有业务逻辑外,私有字段也消失了,所以数据保存到了哪里?
其实编译器自动帮我们生成了一个私有字段,只是不能被我们直接使用,其实我们也没有必要使用。
.NET3.0时代对于可读可写、没有任何业务逻辑的属性可以简化,但是其它的属性还需要遵从.NET2.0时代的格式。
2.1.5 .NET4.6时代
4.6 的时候我们可以只有一个 get,并且也可以直接添加业务逻辑,我们还可以直接给属性赋值。
public string Name{get;set;} = "流星";public double Weight{get;} = 99.9;public double hi{get{double ti= 99.99;return hi;}set{}}
2.1.6 class类型的属性以及属性数组
进一步如何使用后面学习