您的位置:首页 > 编程语言 > C#

C# 修饰符的访问权限 与 类的初始化顺序

2010-02-24 10:53 357 查看
using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication2
{
/*
* public (可以修饰类)
同一程序集中的任何其他代码或引用该程序集的其他程序集都可以访问该类型或成员。

private (成员的默认访问修饰符)
只有同一类或结构中的代码可以访问该类型或成员。

protected
只有同一类或结构或者派生类中的代码可以访问该类型或成员。

internal (可以修饰类,类的默认修饰符)
同一程序集中的任何代码都可以访问该类型或成员,但其他程序集中的代码不可以。

protected internal
同一程序集中的任何代码或其他程序集中的任何派生类都可以访问该类型或成员。

* 当用internal修饰类(c#默认不加修饰符就是internal)可能会出现问题:当你在继承或者是实例化一个internal类的时候你的访问权限不能打破原来internal类的访问限制。
例:internal class A{}
public class B:A{}是不允许的;
public class C{ public A a=new A();}是不允许的.
*
程序动行的结果是:
继承类静态成员DriveB_b初始化
继承类实例变量DriveB_c初始化
基类静态成员初始化
基类实例变量BaseA_c初始化
基类构造方法被调用
继承类构造方法被调用

得出初始化顺序结论:

1)继承类静态成员变量初始化
2)继承类实例变量初始化
3)基类静态静态成员变量初始化
4)基类实例变量初始化
5)基类构造方法调用
6)继承类构造方法调用。

*/

class BaseA
{
static DisplayClass a = new DisplayClass("基类静态成员初始化");

DisplayClass BaseA_c = new DisplayClass("基类实例变量BaseA_c初始化");

public BaseA()
{
Console.WriteLine("基类构造方法被调用");
}
}

class DriveB : BaseA
{
static DisplayClass DriveB_b = new DisplayClass("继承类静态成员DriveB_b初始化");

//static BaseA DriveB_a = new BaseA();

DisplayClass DriveB_c = new DisplayClass("继承类实例变量DriveB_c初始化");

public DriveB()
{
Console.WriteLine("继承类构造方法被调用");
}
}

class DisplayClass
{
public DisplayClass(string diplayString)
{
Console.WriteLine(diplayString);
Console.WriteLine();
}
}
/// <summary>
///
/// </summary>
class Program
{
static void Main(string[] args)
{
DriveB d = new DriveB();

Console.Read();
}
}

}

////

using System;
class A
{
public static int X;
static A()
{
X = B.Y + 1;
}
}
class B
{
public static int Y = A.X + 1;
static B() { Y = A.X + 1; }
static void Main()
{
Console.WriteLine("X={0},Y={1}", A.X, B.Y);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: