C#属性和属性访问器

导言:在C#中,对字段的封装,一个比较常见的方法是设置属。封装的意义在于保护或者防止代码(数据)被我们无意中破坏。在面向对象程序设计中,数据被看作是一个中心的原素并且和使用它的函数结合的很密切,所以有效的封装字段,可以保护它不被其它的函数意外的修改。

什么是属性

属性的定义遵循:[访问权限修饰符] 要访问的字段的类型 属性名 {}。因此要明白,属性不是原有字段,而是对字段进行访问的“中介”的名字。属性拥有两个类似于函数的块,一个块用于获取属性的值,一个块用于设置属性的值。而这两个块也称为属性访问器,分别用get和set关键字来定义,可以用于控制属性的访问级别。

由此可以总结出:“属性”整体,是通过属性(属性名)以及属性访问器来实现的。还有一点需要注意的是,编程规范要求属性和其访问的字段名一致,但首字母大写。

属性的定义

简单的原理

现在假设有以下两个类:

public class Person1
{
	public string name;
}
public class Person2
{
	private string name;
	public string Name
	{
		get { return name; }
		set { name = value; }
	}
}

value表示用户或外界提供或传入的值。

类Person1的name字段未封装,意味着其name字段直接通过public修饰符暴露给系统中其他的类了,所以在其他类中可直接访问这个字段。

类Person2的name字段通属性进行了封装,在其它类中就不能直接对这个字段进行直接操作,需要注意,属性的初衷就是保护字段,所以被保护的字段要用private修饰符来修饰。

当我们实例化Person1时,系统在为实例化的对象分配内存空间时,会将name字段的内存空间声明为公有的。这意味着之后对name字段的所有操作,都是直接操作内存空间中的name字段;

但当我们实例化Peraon2时,系统会先将name的内存空间声明为私有,再为这个内存空间指定属性Name。之后对于name的所有操作,都需要通过对Name这个对象进行间接地操作,以此达到对name字段封装的目的。

只读只写属性

在有些情况,我们的属性可以不用将两个访问器都实现,但至少要有一个访问器。如下代码所示:

private string name1;
public string Name1
{
	// 当属性只有get访问器时,它就成了只读属性
	get { return name1; }
}

private string name2;
public string Name2
{
	// 当属性只有set访问器时,它就成了只写属性
	set { name2 = value; }
}

访问器的访问权限

访问器上可以包含可访问修饰符,如下所示,我们将get访问器设置为共有,将set访问器设置为私有,这有助于控制属性的设置方式。需要注意的是,在get和set访问其中,必须有一个具备着属性的访问级别。还是如下代码,如果将get的访问级别设置为protected,编译器就会报错,因为它们两个都不具备属性的public访问级别。

private string name;
public string Name
{
	get { return name; }
	private set { name = value; }
}

访问器可以使用的访问修饰符取决于属性的可访问性,访问器的可访问性不能高于它所属的属性,也就是说,私有属性的访问器不能包含任何可访问修饰符,因为private的访问级别最低;而公共属性的访问器使用所有的可访问修饰符,因为public的访问级别最高。访问级别请看文章底部。

补充一句,属性也可以使用virtual、override和abstract关键字来修饰,但字段不行。

自动实现的属性

如果属性的set和get没有任何逻辑,就可以使用自动实现的属性。在Visual Studio中,写好字段后,光标停留在,按下快捷键Crtl + R,E即可快速补充属性的实现,如图所示:
在这里插入图片描述

属性的更多作用

属性的作用不仅仅在于保护私有字段,更多的时候,它被用于实现一些限制功能。比如说当我们想给给name字段赋值的时候想要先进行一些逻辑判断,就可以这样写:

private string name;
public string Name
{
	get { return name; }
	set
	{
		// 如果value是空的就将“空”赋值给name
		name = String.IsNullOrEmpty(value) ? "空" : value;
	}
}

由此也能知道,访问器其实就是一个方法。

最后来做一个属性访问器的用法总结吧:

  1. 隐藏组件或类内部的真实成员。
  2. 用来建立约束,比如,实现只读或能写这种约束。
  3. 用来响应属性变化事件,当字段要产生变化时需要满足某一条件才行,只需要将其写在set方法即可。

小彩蛋——访问权限修饰符

作用:可以用来修饰类、字段,属性和方法,用来描述被修饰的内容可访问的范围。

访问权限修饰符介绍

以下的访问级别从大到小依次介绍。

public
  • 可以用来修饰类、字段、属性和方法。
  • 在整个解决方案都能访问。
protected internal
  • 可以用来修饰、字段、属性和方法。
  • 在当前项目中任何地方都能访问。
  • 在基类,子类,派生类(子类的子类等等等等)中都能访问。
  • 在跨项目的子类,派生类中都能访问。
internal
  • 可以用来修饰类、字段、属性和方法。
  • 在当前项目中任何地方都能访问。
  • 类的默认访问权限是internal。
protected
  • 可以用来修饰字段、属性和方法。
  • 在当前类中可以访问。
  • 在基类,子类,派生类(子类的子类等等等等)中都能访问。
  • 在跨项目的子类,派生类中都能访问。
private
  • 可以用来修饰字段、属性和方法。
  • 只能在当前类中访问。
  • 字段、属性和方法的默认访问权限是private。

注意事项

  • 父类的访问权限一定要大于子类的访问权限。
class A { }

public class B : A {} // 这样是不允许的
  • 在public修饰的类的字段和方法中,不能使用非publick修饰的类。解决方法有三种:类A也声明为public;类B去掉public;去掉字段或方法前的public。根本原因就是A的默认访问权限是internal,要低于public。
class A { }

public class B
{
	public A a1; // 这样是不允许的
	public void Set(A a2) // 这样也是不允许的
    {
	}
}

要时时刻刻记得加上访问权限。

至于解决方案和项目是什么意思?请看图,上方就是解决方案,而下方两个就是项目。。
在这里插入图片描述

如果本文对你有所帮助,还请动动小手点个赞再走啦~~~

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值