提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
一、属性的定义
C#的“属性”可能不同于你之前所理解的Java和C++的“属性”,C#的“属性”实际上是所谓面向对象三大特征中“封装”的“get”方法以及“set”方法.
二、为什么需要属性
我们先来看一个样例
class Cat {
public string name;
public int age;
}
在这个样例中,由于两个属性都是public
访问权限,类使用者可能会出现因为不小心改变属性的值,而导致程序出现Runtime Error
或是bug
.
所以,我们需要对其进行封装,并加上限制条件,如下:
using System;
class Cat {
private string name;
private int age;
public string GetName() {
return name;
}
public void SetName(string val) {
// 如果使用侮辱性名字,就抛出异常
if (val == "Super Boy") {
throw new Exception("Dont use this name!");
}
name = val;
}
public int GetAge() {
return age;
}
public void SetAge(int val) {
// 如果年龄小于0,那么抛出异常
if (age < 0) {
throw new Exception("Age must be non-negative!");
}
age = val;
}
}
// 使用
class MainClass {
static void Main(string[] args) {
Cat myCat = new Cat();
myCat.SetName("awa");
// myCat.SetName("Super Boy"); // 这样会抛出异常
myCat.SetAge(114);
Console.WriteLine("name=" + myCat.GetName() + " age=" + myCat.GetAge());
}
}
这样,通过对于设置函数的限制,我们可以防止一些由于不正常属性值而造成的错误.
但是,如果使用上面那样的写法,代码就显得过于冗余了.
所以,C#语言为我们提供了一个“语法糖”——属性.
三、如何编写属性
依旧是上面那个样例,我们使用C#的“属性”来书写代码,如下:
using System;
class Cat {
// 我们必须使用这两个变量来存储属性的真正值
private string _name;
private int _age;
public string Name {
get { return _name; }
set { // 设置只有本类的函数可以更改名字
if (value == "Super Boy") { // value关键字表示输入进来的值
throw new Exception("Dont use this name!");
}
_name = value;
}
}
public int Age {
get { return _age; }
set {
if (value < 0) {
throw new Exception("Age must be non-negative!");
}
_age = value;
}
}
}
// 使用
class MainClass {
static void Main(string[] args) {
Cat myCat = new Cat();
// myCat.Name = "Super Boy"; // 抛出异常
myCat.Name = "awa";
myCat.Age = 114;
Console.WriteLine("name=" + myCat.Name + " age=" + myCat.Age);
}
}
“属性”允许我们像访问正常的成员变量那样修改和获取对象中属性的值,但是又可以加上限制条件(对访问权限的限制和对值的限定).
同时,C#允许我们“偷个懒”*^-^*.
实现除了名字的修改不加限制,其余与上面相同的效果,Cat类可以写成这样:
class Cat {
private int _age;
public string Name {
get; // 如果没有别的限制,就只是返回_name的话,可以这么写
private set;// 如果没有别的限制,就只是设置_name的话,可以这么写
}
public int Age {
get => _age;
set {
if (value < 0) {
throw new Exception("Age must be non-negative!");
}
_age = value;
}
}
}
是不是很方便呢*^-^*
参考文献
菜鸟教程-C#属性
博客园-【.NET C#基础】属性 - 本质是方法 - HiroMuraki
有建议请在评论区提出,有错误请在评论区指出,万分感谢!*^-^*