导言:在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;
}
}
由此也能知道,访问器其实就是一个方法。
最后来做一个属性访问器的用法总结吧:
- 隐藏组件或类内部的真实成员。
- 用来建立约束,比如,实现只读或能写这种约束。
- 用来响应属性变化事件,当字段要产生变化时需要满足某一条件才行,只需要将其写在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) // 这样也是不允许的
{
}
}
要时时刻刻记得加上访问权限。
至于解决方案和项目是什么意思?请看图,上方就是解决方案,而下方两个就是项目。。
如果本文对你有所帮助,还请动动小手点个赞再走啦~~~