许明会的计算机技术主页

Language:C,C++,.NET Framework(C#)
Thinking:Design Pattern,Algorithm,WPF,Windows Internals
Database:SQLServer,Oracle,MySQL,PostSQL
IT:MCITP,Exchange,Lync,Virtualization,CCNP

导航

class之new和ctor意义及作用域

new关键字计算class占用的字节数,并在堆上分配空间。

class 的ctor默认构造函数实现class内部所有成员的默认值赋值;如果你定义了带参构造函数,那么编译器不会自动生成默认构造;假设类要被继承,尽管派生 类实例化按照派生类的带参构造方式实例化,但是对象生成树还是调用基类的默认构造,所以,一个类如果没有默认构造,该类不能被派生。

作用域(变量或者方法):
private:仅在类内部可访问
protected:仅在类及其派生类内部访问
internal:仅在同一个程序集(dll)内可以访问。程序集内可以包含多个命名空间,每个命名空间也可以包含很多类。
protected internal:当前程序集,或者当前程序集内类的派生类中(可以在不同的命名空间内)我感觉不到和internal有什么区别
using System;

namespace DemoConsole
{
    public class ConsoleBasic
    {
        private void MethodPrivate(){}                            //仅在本类内部可见
        protected void MethodProtected(){}                        //仅在本类和其派生类中可见
        internal void MethodInternal(){}                        //在本程序集内可见
        protected internal void MethodProtectedInternal(){}        //在本程序集,或本程序集内定义该变量的派生类中可见
        protected string token;//="privilege";
        internal string international;
        public string version="4.0";
        
        public void ShowFormat()
        {
            Console.ForegroundColor = ConsoleColor.Cyan;
            Console.BackgroundColor = ConsoleColor.Blue;
            
            Console.WriteLine("\n{0}:\tC Format {0:C}\tF3 Format {0:F3}\n"+
                              "{1}:\t\tN Format {1:N}\tx Format {1:x}\t{1:E}",
                              99989.9876,9999);
            /*
99989.9876:     C Format ¥99,989.99    F3 Format 99989.988
9999:           N Format 9,999.00       x Format 270f   9.999000E+003
             */
        }
    }
    
    public class ConsoleExtend:ConsoleBasic
    {
        public void Show()
        {
            MethodProtected();
            MethodInternal();
            MethodProtectedInternal();
            base.version="5.0";
            base.token="low level";//派生类中可以访问基类的protected成员
            base.international="US";
        }
    }
}

namespace InternalDemo
{
    public class ClassInOtherNamespace
    {
        public void MethodInOtherNamespace()
        {
            DemoConsole.ConsoleExtend ce = new DemoConsole.ConsoleExtend();
            ce.version="in other namespace";//可以在另一命名空间内直接访问public成员
            ce.international="United States";
            ce.MethodInternal();//在同一个程序集内internal成员都可以访问;
            ce.MethodProtectedInternal();
        }
    }
}

posted on 2011-04-21 23:38  许明会  阅读(428)  评论(0编辑  收藏  举报