7.面向对象-封装-成员属性
7.1 知识点
知识回顾
人类
class Person
{
// 特征——成员变量
private int age;
private string name;
private int money;
// 行为——成员方法
public void Speak()
{
Console.WriteLine(name);
}
// 初始化调用——构造函数
public Person(int age)
{
this.age = age;
}
public Person(int age, string name) : this(age)
{
this.name = name;
}
// 释放时调用——析构函数
~Person()
{
}
}
成员属性的基本概念
- 用于保护成员变量。
- 为成员属性的获取和赋值添加逻辑处理。
- 解决3P的局限性。
成员属性的基本语法
// 访问修饰符 属性类型 属性名
// {
// get{}
// set{}
// }
实例:
class Person
{
private string name;
private int age;
private int money;
private bool sex;
public string Name
{
get
{
// 可以在返回之前添加一些逻辑规则
// 意味着这个属性可以获取的内容
return name;
}
set
{
// 可以在设置之前添加一些逻辑规则
// value 关键字用于表示外部传入的值
name = value;
}
}
public int Money
{
get
{
// 解密处理,使要用的值比存储的实际值少5
return money - 5;
}
set
{
// 添加逻辑处理
if (money < 0)
{
money = 0;
Console.WriteLine("钱不能小于0");
}
// 加密处理,使存储的实际值比要用的值多5
money = value + 5;
}
}
}
成员属性中 get 和 set 前可以加访问修饰符
- 加访问修饰符需要注意:
- 默认不加会使用属性声明时的访问权限。
- 加的访问修饰符要低于属性的访问权限。
- 不能让 get 和 set 的访问权限都低于属性的权限。
实例:
public int Age
{
// 加了 private 后,外面只能 set 不能 get
private get
{
return age;
}
// 不能让 get 和 set 的访问权限都低于属性的权限,会报错
// private set 报错
// protected set 报错
set
{
// 添加逻辑处理
if (age < 0)
{
age = 0;
Console.WriteLine("年龄不能小于0");
}
age = value;
}
}
get 和 set 可以只有一个
- 写 get 和 set 时注意:
- 只有一个时,没必要在前面加访问修饰符。
- 一般情况下只会出现只有 get 的情况,基本不会出现只有 set。
实例:
public bool Sex
{
get
{
return sex;
}
// 自只有 set 不会报错
// set
// {
// sex = value;
// }
}
自动属性
- 作用:外部能得不能改的特征。
- 如果类中有一个特征是只希望外部能得不能改的,又没什么特殊处理,那么可以直接使用自动属性。
- 声明时没有对应成员变量的属性,可以理解为自动生成一个成员变量。
public float Height
{
// 没有在 get 和 set 中写逻辑的需求或者想法
get;
private set;
}
成员属性的使用
主函数内:
Person p = new Person();
p.Name = "林文韬"; // 执行的是 set 语句块
Console.WriteLine(p.Name); // 林文韬,执行的是 get 语句块
p.Money = 1000;
Console.WriteLine(p.Money); // 1000,但实际存到内存的是1005
p.Age = 22;
// Console.WriteLine(p.Age); // 成员属性 Age 的 get 是私有,不能访问,会报错
Console.WriteLine(p.Sex); // False,默认值
// p.Sex = true; // 不能修改,没有设置
总结
- 成员属性概念:一般是用来保护成员变量的。
- 成员属性的使用和变量一样,外部用对象点出。
- get 中需要 return 内容;set 中用 value 表示传入的内容。
- get 和 set 语句块中可以加逻辑处理。
- get 和 set 可以加访问修饰符,但是要按照一定的规则进行添加。
- get 和 set 可以只有一个。
- 自动属性是属性语句块中只有 get 和 set,一般用于外部能得不能改这种情况。
7.2 知识点代码
using System;
namespace Lesson5_成员属性
{
#region 知识回顾
//// 人 类
//class Person
//{
// //特征——成员变量
// private int age;
// private string name;
// //金钱
// private int money;
// //行为——成员方法
// public void Speak()
// {
// Console.WriteLine(name);
// }
// //初始化调用——构造函数
// public Person(int age)
// {
// this.age = age;
// }
// public Person(int age, string name) : this(age)
// {
// this.name = name;
// }
// //释放时调用——析构函数
// ~Person()
// {
// }
//}
#endregion
#region 知识点一 成员属性的基本概念
//基本概念
//1.用于保护成员变量
//2.为成员属性的获取和赋值添加逻辑处理
//3.解决3P的局限性
// public——内外访问
// private——内部访问
// protected——内部和子类访问
// 属性可以让成员变量在外部
// 只能获取 不能修改 或者 只能修改 不能获取
#endregion
#region 知识点二 成员属性的基本语法
// 基本语法
// 访问修饰符 属性类型 属性名
// {
// get{}
// set{}
// }
// 实例
class Person
{
private string name;
private int age;
private int money;
private bool sex;
//属性的命名一般使用 帕斯卡命名法
public string Name
{
get
{
//可以在返回之前添加一些逻辑规则
//意味着 这个属性可以获取的内容
return name;
}
set
{
//可以在设置之前添加一些逻辑规则
// value 关键字 用于表示 外部传入的值
name = value;
}
}
public int Money
{
get
{
//解密处理 使要用的值比存储的实际值少5
return money - 5;
}
set
{
//添加逻辑处理
if (money < 0)
{
money = 0;
Console.WriteLine("钱不能小于0");
}
//加密处理 使存储的实际值比要用的值多5
money = value + 5;
}
}
#region 知识点三 成员属性中 get和set前 可以加访问修饰符
// get和set前加访问修饰符需要注意
// 1.默认不加 会使用属性申明时的访问权限
// 2.加的访问修饰符要低于属性的访问权限
// 3.不能让get和set的访问权限都低于属性的权限
//实例
public int Age
{
//加的访问修饰符要低于属性的访问权限
//要保证外面高级的访问权限修饰符有作用
//可以private protected 不能public(同级也会报错)
//public get 报错
//加了private后 外面只能set 不能get
private get
{
return age;
}
//不能让get和set的访问权限都低于属性的权限 会报错
//private set 报错
//protected set 报错
set
{
//添加逻辑处理
if (age < 0)
{
age = 0;
Console.WriteLine("年龄不能小于0");
}
age = value;
}
}
#endregion
#region 知识点四 get和set可以只有一个
//写get和set时注意:
//只有一个时 没必要在前面加访问修饰符
//一般情况下 只会出现 只有 get的情况 基本不会出现只有set
//实例
public bool Sex
{
get
{
return sex;
}
//自只有set不会报错
//set
//{
// sex = value;
//}
}
#endregion
#region 知识点五 自动属性
//作用:外部能得不能改的特征
//如果类中有一个特征是只希望外部能得不能改的 又没什么特殊处理
//那么可以直接使用自动属性
//声明个上面没有对应成员变量的属性
//可以理解为自动生成一个成员变量
public float Height
{
//没有在get和set中写逻辑的需求或者想法
get;
private set;
}
#endregion
}
#endregion
class Program
{
static void Main(string[] args)
{
Console.WriteLine("成员属性");
//主函数内
#region 知识点六 成员属性的使用
Person p = new Person();
p.Name = "林文韬";//执行的是set语句块
Console.WriteLine(p.Name);//林文韬 执行的是get语句块
p.Money = 1000;
Console.WriteLine(p.Money);//1000 但实际存到内存的是1005
p.Age = 22;
//Console.WriteLine(p.Age);//成员属性Age的get是私有 不能访问 会报错
Console.WriteLine(p.Sex);//False 默认值
//p.Sex = true;//不能修改 没有设置
#endregion
}
}
//总结
//1.成员属性概念:一般是用来保护成员变量的
//2.成员属性的使用和变量一样 外部用对象点出
//3.get中需要return内容 ; set中用value表示传入的内容
//4.get和set语句块中可以加逻辑处理
//5.get和set可以加访问修饰符,但是要按照一定的规则进行添加
//6.get和set可以只有一个
//7.自动属性是属性语句块中只有get和set,一般用于 外部能得不能改这种情况
}
7.3 练习题
定义一个学生类,有五种属性,分别为姓名、性别、年龄、CSharp成绩、Unity成绩
有两个方法:
- 一个是打招呼:介绍自己交XX,今年几岁了。是男同学还是女同学
- 另一个是计算自己总分数和平均分并显示的方法
使用属性完成:
- 性别只能是男或女
- 年龄必须是0 ~ 150岁之间
- 成绩必须是0 ~ 100
实例化两个对象并测试
class语句块外 namespace语句块内
// class语句块外 namespace语句块内
// 学生 类
class Student
{
//成员变量
//姓名、性别、年龄、CSharp成绩、Unity成绩
//姓名用了自动属性 因为名字可以不用做逻辑
private int age;
private int cSharp;
private int unity;
private string sex;
//成员属性
//姓名、性别、年龄、CSharp成绩、Unity成绩
//姓名用了自动属性 因为名字可以不用做逻辑
public string Name
{
get;
set;
}
public string Sex
{
get
{
return sex;
}
set
{
//性别只能是男或女 否则不男不女
if (value != "男" && value != "女")
{
sex = "不男不女";
}
else
{
sex = value;
}
}
}
public int Age
{
get
{
return age;
}
set
{
//年龄必须是0 ~150岁之间
if (value < 0)
{
age = 0;
}
else if (value > 150)
{
age = 150;
}
else
{
age = value;
}
}
}
public int CSharp
{
get
{
return cSharp;
}
set
{
//成绩必须是0 ~100
if (value < 0)
{
cSharp = 0;
}
else if (value > 100)
{
cSharp = 100;
}
else
{
cSharp = value;
}
}
}
public int Unity
{
get
{
return unity;
}
set
{
//成绩必须是0 ~100
if (value < 0)
{
unity = 0;
}
else if (value > 100)
{
unity = 100;
}
else
{
unity = value;
}
}
}
//成员方法
//打招呼方法
public void SayHellow()
{
Console.WriteLine("我叫{0},今年{1}岁了,是{2}同学", Name, Age, Sex);
}
//计算自己总分数和平均分并显示方法
public void ShowInfo()
{
int sum = CSharp + Unity;
float avg = sum / 2f;
Console.WriteLine("总分{0},平均分{1}", sum, avg);
}
}
主函数内
// 主函数内
Student s1 = new Student();
s1.Name = "林文韬";
s1.Age = 160;
s1.Unity = 150;
s1.CSharp = 150;
s1.Sex = "超人";
s1.SayHellow();//我叫林文韬,今年150岁了,是不男不女同学
s1.ShowInfo();//总分200,平均分100
Student s2 = new Student();
s2.Name = "亲爱的同学";
s2.Age = 20;
s2.Unity = 80;
s2.CSharp = 90;
s2.Sex = "女";
s2.SayHellow();//我叫亲爱的同学,今年20岁了,是女同学
s2.ShowInfo();//总分170,平均分85
7.4 练习题代码
using System;
namespace Lesson5_练习题
{
#region 练习题一
//定义一个学生类,有五种属性,分别为姓名、性别、年龄、CSharp成绩、Unity成绩
//有两个方法:
//一个打招呼:介绍自己交XX,今年几岁了。是男同学还是女同学
//计算自己总分数和平均分并显示的方法
//使用属性完成:
//性别只能是男或女
//年龄必须是0 ~150岁之间
//成绩必须是0 ~100
//实例化两个对象并测试
//class语句块外 namespace语句块内
// 学生 类
class Student
{
//成员变量
//姓名、性别、年龄、CSharp成绩、Unity成绩
//姓名用了自动属性 因为名字可以不用做逻辑
private int age;
private int cSharp;
private int unity;
private string sex;
//成员属性
//姓名、性别、年龄、CSharp成绩、Unity成绩
//姓名用了自动属性 因为名字可以不用做逻辑
public string Name
{
get;
set;
}
public string Sex
{
get
{
return sex;
}
set
{
//性别只能是男或女 否则不男不女
if (value != "男" && value != "女")
{
sex = "不男不女";
}
else
{
sex = value;
}
}
}
public int Age
{
get
{
return age;
}
set
{
//年龄必须是0 ~150岁之间
if (value < 0)
{
age = 0;
}
else if (value > 150)
{
age = 150;
}
else
{
age = value;
}
}
}
public int CSharp
{
get
{
return cSharp;
}
set
{
//成绩必须是0 ~100
if (value < 0)
{
cSharp = 0;
}
else if (value > 100)
{
cSharp = 100;
}
else
{
cSharp = value;
}
}
}
public int Unity
{
get
{
return unity;
}
set
{
//成绩必须是0 ~100
if (value < 0)
{
unity = 0;
}
else if (value > 100)
{
unity = 100;
}
else
{
unity = value;
}
}
}
//成员方法
//打招呼方法
public void SayHellow()
{
Console.WriteLine("我叫{0},今年{1}岁了,是{2}同学", Name, Age, Sex);
}
//计算自己总分数和平均分并显示方法
public void ShowInfo()
{
int sum = CSharp + Unity;
float avg = sum / 2f;
Console.WriteLine("总分{0},平均分{1}", sum, avg);
}
}
#endregion
class Program
{
static void Main(string[] args)
{
Console.WriteLine("成员属性练习题");
//主函数内
Student s1 = new Student();
s1.Name = "林文韬";
s1.Age = 160;
s1.Unity = 150;
s1.CSharp = 150;
s1.Sex = "超人";
s1.SayHellow();//我叫林文韬,今年150岁了,是不男不女同学
s1.ShowInfo();//总分200,平均分100
Student s2 = new Student();
s2.Name = "亲爱的同学";
s2.Age = 20;
s2.Unity = 80;
s2.CSharp = 90;
s2.Sex = "女";
s2.SayHellow();//我叫亲爱的同学,今年20岁了,是女同学
s2.ShowInfo();//总分170,平均分85
}
}
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com