学习日志:C#-属性

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

一、属性的定义

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

有建议请在评论区提出,有错误请在评论区指出,万分感谢!*^-^*

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值