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