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

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);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值