写到如今的代码,基本上只会使用public, private,有时候感觉相对于自己编程的年龄,许多知识点都缺少努力钻究的基本精神,总是坚持能用就行。真是汗颜……
特别在本文记录一下基本访问修饰符的知识。
访问修饰符 说明
public 公有访问。不受任何限制。
private 私有访问。只限于本类成员访问,子类,实例都不能访问。
protected 保护访问。只限于本类和子类访问,实例不能访问。
internal 内部访问。只限于本项目内访问,其他不能访问。
protected internal 内部保护访问。只限于本项目或是子类访问,其他不能访问
sealed 可以用来限制扩展性,如果密封了某个类,则其他类不能从该类继承
msdn的解释如下:internal指的是同一个程序集,内部成员和类型才是可以访问的.内部访问通常用于基于组件的开发,因为它使一组组件能够以私有方式进行合作,而不必向应用程序代码的其余部分公开
一个成员或类型只能有一个访问修饰符,使用 protectedinternal 组合时除外。
命名空间上不允许使用访问修饰符。命名空间没有访问限制。
根据发生成员声明的上下文,只允许某些声明的可访问性。如果在成员声明中未指定访问修饰符,则使用默认的可访问性。
不嵌套在其他类型中的顶级类型的可访问性只能是 internal 或 public。这些类型的默认可访问性是 internal。
嵌套类型是其他类型的成员,它们可以具有下表所示的声明的可访问性。
基础代码:
namespace asyncHelperTest { class test { public void mainfun() { BaseClass c1 = new BaseClass(); //这里声明类的实例后,实例对象可以调用访问成员函数1,5,4,见图2 } } public class BaseClass { public string GetaPublicString1() { return "Public String"; } protected string GetaProtectedString2() { return "Protected String"; } private string GetaPrivateString3() { return "Private String"; } internal string GetaInternalString4() { return "Internal String"; } protected internal string GetaProtectedInternalString5() { return "Protected Internal String"; } public void Test() { //这里可访问全部成员函数1,2,3,4,5,见图1 } } class AClass:BaseClass { void test2() { //这里可以访问成员函数1,2,4,5,见图3 //这里是继承基类BaseClass的,是它的子类 } } } =====另一个工程================================= using asyncHelperTest; namespace ConsoleApp1 { class Program { static void Main(string[] args) { var c1 = new BaseClass(); //这里直接声明另一个程序集的类BaseClass成员,可以访问成员函数1,见图5 } } class FClass: BaseClass { private void test2() { //这里可以访问成员函数1,2,5,见图4 //这里是另一个项目,也就是程序集和类BaseClass是不同的。 } } }
图1
图2
图3
图4
图5
最后一个话题是关于C#sealed 修饰符,它是指密封类,摘抄网络资料如下:
一、密封类
1. 密封类的定义
如果我们不希望自己编写的类被继承;如果有的类已经没有再被继承的必要,这时,我们可以使用sealed修饰符在类中进行声明,以达到该类不能派生其它类的目的,该类就被称为密封类。
2. 密封类与抽象类
密封类不能同时又是抽象类,因为密封类不能用作基类、也不能被继承,而抽象类总是希望被继承的。
3. 什么情况下使用密封类
需要阻止其它程序员无意中继承该类的时候;在程序运行时需要起到优化效果的时候,可以使用密封类。
4. 示例
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Test
{
class Program
{
sealed class A // 密封类。不能从该类再派生出其它类
{
public int x;
public int y;
}
static void Main(string[] args)
{
// C#密封类-www.baike369.com
A a = new A();
a.x = 10;
a.y = 20;
Console.WriteLine("x = {0}; y = {1}", a.x, a.y);
Console.ReadLine();
}
}
}
运行结果:
x = 10; y = 20二、密封方法
1. 密封方法
对类中的方法可以使用sealed修饰符,我们称该方法为密封方法。
不是类的每个成员方法都可以作为密封方法,密封方法必须对基类的虚方法进行重载,提供具体的实现方法。所以,在方法的声明中,sealed修饰符总是和override修饰符同时使用,sealed修饰符位于override修饰符前面。
2. 示例
class A
{
public virtual void F()
{
Console.WriteLine("A.F");
}
public virtual void G()
{
Console.WriteLine("A.G");
}
}
class B : A
{
sealed override public void F()
{
Console.WriteLine("B.F");
}
override public void G()
{
Console.WriteLine("B.G");
}
}
class C : B
{
override public void G()
{
Console.WriteLine("C.G");
}
}
类B对基类A中的两个虚方法都进行了重载,其中F方法使用了sealed修饰符,成为一个密封方法。G方法不是密封方法,所以在B的派生类C中,可以重载方法G,但是不能重载方法F。

