【背景】
访问修饰符是我们的老朋友了,当我们敲代码时怎么也点(.)不出来的时候,可能要考虑访问限制的问题了。最近的学习中,我感觉修饰符不仅仅是public 和private 那么简单,下面是进一步的介绍,供大家学习交流。
【正文】
【访问修饰符有哪些?】
- Public
同一程序集中的任何其他代码或引用该程序集的其他程序集都可以访问该类型或成员。
- Private
只有同一类或结构中的代码可以访问该类型或成员。
- Protected
只有同一类或结构或者此类的派生类中的代码才可以访问的类型或成员。
- Internal
同一程序集中的任何代码都可以访问该类型或成员,但其他程序集中的代码不可以。
- Protected internal
由其声明的程序集或另一个程序集派生的类中任何代码都可访问得类型或成员。从另一个程序集进行访问必须在类声明中发生,该类声明派生自其中声明受保护的内部元素的类,并且必须通过派生的类类型的实例发生。
【示例说明】
—— Public 公有的,是类型和类型成员的访问修饰符,访问不受限制。
using System;
using System.Collections.Generic;
using System.Text;
namespace AccessModifier
{
public class AccessModifierClass //访问修饰类,里面有五种访问修饰方法
{
public string GetPublicString() //公共访问方法
{
return "Public String";
}
protected string GetProtectedString() //受保护访问方法
{
return "Protected String";
}
private string GetPrivateString() //私有访问方法
{
return "Private String";
}
internal string GetInternalString() //内部访问方法
{
return "Internal String";
}
protected internal string GetProtectedInternalString() //受保护或内部访问方法
{
return "Protected Internal String";
}
void AvailableAccessModifier() //同一个类中,所有方法都可以访问
{
this.GetPublicString();
this.GetPrivateString();
this.GetInternalString();
this.GetProtectedInternalString();
this.GetProtectedString();
}
}
public class TestAccessModifierClass1
//同一程序集不同类中,GetPrivateString和GetProtectedString方法不能访问
{
void AvailableAccessModifier()
{
AccessModifierClass item = new AccessModifierClass();
item.GetPublicString();
item.GetInternalString();
item.GetProtectedInternalString();
}
}
//同一程序集的派生类中,GetPrivateString方法不能访问,
GetProtectedString方法这时可以访问了
public class TestAccessModifierClass2 : AccessModifierClass
{
void AvailableAccessModifier()
{
AccessModifierClass item = new AccessModifierClass();
item.GetPublicString();
item.GetInternalString();
base.GetProtectedInternalString();
base.GetProtectedString();
}
}
}
—— Protected internal 访问级别为internal或protected。同一个程序集中的所有类 或者 派生类可以访问。
using System;
using System.Collections.Generic;
using System.Text;
using AccessModifier; //这里的不同程序集指的是不同命名空间
namespace AccessModifier1
{
public class TestAccessModifierClass3 : AccessModifierClass
{
void AvailableAccessModifier()
{
base.GetPublicString();
base.GetProtectedString();
//TestAccessModifierClass3 类无法访问到 AccessModifierClass 的 GetInternalString 成员,因为它们不在同一个程序集里。
但却可以访问到 sGetProtectedInternalString 方法,因为 TestAccessModifierClass3 是 AccessModifierClass 的继承类。
base.GetProtectedInternalString();
}
}
}
【访问修饰符集合】
声明的可访问性 | 含义 |
public | 访问不受限制 |
protected | 访问仅限于包含类或从包含类派生的类型,实例不能访问。 |
internal | 访问仅限于的当前程序集,其他不能访问 |
peotected internal | 访问仅限于当前程序集或是子类访问,其他不能访问。 |
private | 访问仅限于包含类型,本类成员访问,子类、实例都不能访问。 |
属于 | 默认的成员可访问性 | 该成员允许的声明的可访问性 |
enum | public | 无 |
class |
private
|
public
protected
internal
private
protected internal
|
interface |
public
| 无 |
struct | private |
public
internal
private
|
【总结】
当你不知道一件事情是否正确的时候,与其焦灼忧虑,不如放手一试,去实践~~
c#的访问修饰符就先介绍到这里,java的访问修饰符与之差不多,可以对比着来学习,小编在查阅资料时发现还有声明修饰符、程序集的理解等等问题等我去探究,待小编前去一探究竟,结果将在后续博客中分享,欢迎大家多多指教~~