C# 访问修饰符
封装 被定义为”把一个或多个项目封闭在一个物理的或者逻辑的包中”。在面向对象程序设计方法论中,封装是为了防止对实现细节的访问。
抽象和封装是面向对象程序设计的相关特性。抽象允许相关信息可视化,封装则使开发者实现所需级别的抽象。
C# 封装根据具体的需要,设置使用者的访问权限,并通过 访问修饰符 来实现。
一个 访问修饰符 定义了一个类成员的范围和可见性。C# 支持的访问修饰符如下所示:
- Public:所有对象都可以访问;
- Private:对象本身在对象内部可以访问;
- Protected:只有该类对象及其子类对象可以访问
- Internal:同一个程序集的对象可以访问;
- Protected internal:该程序集内的派生类访问,是protected和internal的交集;
一、Public 访问修饰符
Public
访问修饰符允许一个类将其成员变量和成员函数暴露给其他的函数和对象。任何公有成员可以被外部的类访问。
下面的实例说明了这点:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
<span class="hljs-keyword">using</span> System; <span class="hljs-keyword">namespace</span> <span class="hljs-title">RectangleApplication</span> { <span class="hljs-keyword">class</span> <span class="hljs-title">Rectangle</span> { <span class="hljs-comment">//成员变量</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">double</span> length; <span class="hljs-keyword">public</span> <span class="hljs-keyword">double</span> width; <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">double</span> <span class="hljs-title">GetArea</span>() </span>{ <span class="hljs-keyword">return</span> length * width; } <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">Display</span>() </span>{ Console.WriteLine(<span class="hljs-string">"长度: {0}"</span>, length); Console.WriteLine(<span class="hljs-string">"宽度: {0}"</span>, width); Console.WriteLine(<span class="hljs-string">"面积: {0}"</span>, GetArea()); } }<span class="hljs-comment">// Rectangle 结束</span> <span class="hljs-keyword">class</span> <span class="hljs-title">ExecuteRectangle</span> { <span class="hljs-function"><span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">Main</span>(<span class="hljs-params"><span class="hljs-keyword">string</span>[] args</span>) </span>{ Rectangle r = <span class="hljs-keyword">new</span> Rectangle(); r.length = <span class="hljs-number">4.5</span>; r.width = <span class="hljs-number">3.5</span>; r.Display(); Console.ReadLine(); } } } |
当上面的代码被编译和执行时,它会产生下列结果:
1 2 3 4 |
长度: <span class="hljs-number">4.5</span> 宽度: <span class="hljs-number">3.5</span> 面积: <span class="hljs-number">15.75</span> |
在上面的实例中,成员变量 length
和 width
被声明为 public
,所以它们可以被函数 Main()
使用 Rectangle
类的实例 r
访问。
成员函数 Display()
和 GetArea()
可以直接访问这些变量。
成员函数 Display()
也被声明为 public
,所以它也能被 Main()
使用 Rectangle
类的实例 r
访问。
二、Private 访问修饰符
Private
访问修饰符允许一个类将其成员变量和成员函数对其他的函数和对象进行隐藏。只有同一个类中的函数可以访问它的私有成员。即使是类的实例也不能访问它的私有成员。
下面的实例说明了这点:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
<span class="hljs-keyword">using</span> System; <span class="hljs-keyword">namespace</span> <span class="hljs-title">RectangleApplication</span> { <span class="hljs-keyword">class</span> <span class="hljs-title">Rectangle</span> { <span class="hljs-comment">//成员变量</span> <span class="hljs-keyword">private</span> <span class="hljs-keyword">double</span> length; <span class="hljs-keyword">private</span> <span class="hljs-keyword">double</span> width; <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">Acceptdetails</span>() </span>{ Console.WriteLine(<span class="hljs-string">"请输入长度:"</span>); length = Convert.ToDouble(Console.ReadLine()); Console.WriteLine(<span class="hljs-string">"请输入宽度:"</span>); width = Convert.ToDouble(Console.ReadLine()); } <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">double</span> <span class="hljs-title">GetArea</span>() </span>{ <span class="hljs-keyword">return</span> length * width; } <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">Display</span>() </span>{ Console.WriteLine(<span class="hljs-string">"长度: {0}"</span>, length); Console.WriteLine(<span class="hljs-string">"宽度: {0}"</span>, width); Console.WriteLine(<span class="hljs-string">"面积: {0}"</span>, GetArea()); } }<span class="hljs-comment">//end class Rectangle </span> <span class="hljs-keyword">class</span> <span class="hljs-title">ExecuteRectangle</span> { <span class="hljs-function"><span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">Main</span>(<span class="hljs-params"><span class="hljs-keyword">string</span>[] args</span>) </span>{ Rectangle r = <span class="hljs-keyword">new</span> Rectangle(); r.Acceptdetails(); r.Display(); Console.ReadLine(); } } } |
当上面的代码被编译和执行时,它会产生下列结果:
1 2 3 4 5 6 7 8 |
请输入长度: <span class="hljs-number">4.4</span> 请输入宽度: <span class="hljs-number">3.3</span> 长度: <span class="hljs-number">4.4</span> 宽度: <span class="hljs-number">3.3</span> 面积: <span class="hljs-number">14.52</span> |
在上面的实例中,成员变量 length
和 width
被声明为 private
,所以它们不能被函数 Main()
访问。
成员函数 AcceptDetails()
和 Display()
可以访问这些变量。
由于成员函数 AcceptDetails()
和 Display()
被声明为 public
,所以它们可以被 Main()
使用 Rectangle
类的实例 r
访问。
三、Protected 访问修饰符
Protected
访问修饰符允许子类访问它的基类的成员变量和成员函数。这样有助于实现继承。我们将在继承的章节详细讨论这个。更详细地讨论这个。
四、Internal 访问修饰符
Internal
访问说明符允许一个类将其成员变量和成员函数暴露给当前程序中的其他函数和对象。换句话说,带有 internal
访问修饰符的任何成员可以被定义在该成员所定义的应用程序内的任何类或方法访问。
下面的实例说明了这点:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
<span class="hljs-keyword">using</span> System; <span class="hljs-keyword">namespace</span> <span class="hljs-title">RectangleApplication</span> { <span class="hljs-keyword">class</span> <span class="hljs-title">Rectangle</span> { <span class="hljs-comment">//成员变量</span> <span class="hljs-keyword">internal</span> <span class="hljs-keyword">double</span> length; <span class="hljs-keyword">internal</span> <span class="hljs-keyword">double</span> width; <span class="hljs-function"><span class="hljs-keyword">double</span> <span class="hljs-title">GetArea</span>() </span>{ <span class="hljs-keyword">return</span> length * width; } <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">Display</span>() </span>{ Console.WriteLine(<span class="hljs-string">"长度: {0}"</span>, length); Console.WriteLine(<span class="hljs-string">"宽度: {0}"</span>, width); Console.WriteLine(<span class="hljs-string">"面积: {0}"</span>, GetArea()); } }<span class="hljs-comment">//end class Rectangle </span> <span class="hljs-keyword">class</span> <span class="hljs-title">ExecuteRectangle</span> { <span class="hljs-function"><span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">Main</span>(<span class="hljs-params"><span class="hljs-keyword">string</span>[] args</span>) </span>{ Rectangle r = <span class="hljs-keyword">new</span> Rectangle(); r.length = <span class="hljs-number">4.5</span>; r.width = <span class="hljs-number">3.5</span>; r.Display(); Console.ReadLine(); } } } |
当上面的代码被编译和执行时,它会产生下列结果:
1 2 3 4 |
长度: <span class="hljs-number">4.5</span> 宽度: <span class="hljs-number">3.5</span> 面积: <span class="hljs-number">15.75</span> |
在上面的实例中,请注意成员函数 GetArea()
声明的时候不带有任何访问修饰符。如果没有指定访问修饰符,则使用类成员的默认访问修饰符,即为 private
。
五、Protected Internal 访问修饰符
Protected Internal
访问修饰符允许在本类,派生类或者包含该类的程序集中访问。这也被用于实现继承。