/*static的相关内容:静态字段,静态属性,静态方法,,静态构造,静态类,readonly,const,嵌套类,分部类 * static可以理解为全局的,共享同一块内存 * 可以通过default(类型名)得到每个类型的默认值 * 静态字段不从属于字段而是从属与类,而实例字段都是从属于每个字段,针对于每个字段都有不同的值 * 类和对象都能关联数据; * this是用于实例的访问方法,所以你能用this.静态成员进行访问 * 要想在静态方法中获得实例成员的访问,就必须先获得对字段或方法所从属于的那个特定的实例的引用,Main()就是静态方法 * 静态构造器是用于对类(No is instance of Class)进行初始化,没有静态终结器的说法 * 静态构造器不现实调用,相反,CLR在首次访问类的时候自动调用静态构造器,记住,静态构造函数是在运行时调用的, * 静态构造函数在编译成IL语言是变成.cctor(),而实例静态构造函数是.ctor() * 规范:应尽量使用内联(inline),不要使用静态构造函数进行初始化,也避免在声明是进行初始化 * 静态构造函数是private 自己写的话不允许有修饰符 * 由于静态构造器不允许显示调用,所以不允许任何参数 * 有的类不包含任何实例成员,所以这种类就要declare为静态的类,也就是说静态类里面不包含instance成员,跟前面的学习可以知道,实例类可以包含静态成员 * 静态类被编译成IL时会被标记为abstract和sealed表示不可扩展,不能从它派生出任何类 * 静态类被编译曾CIL时,没有实例构造,静态构造是在CLR里面的 * 学习英语:generated生成,via 通过,invoke调用,derived衍生的,nested嵌套的,literal字面的 * 要将永恒不变的值声明为const常量,以后有可能要改变的declare为readonly(只能用于字段,不能用于据不变量) * readonly fileds cannot be set outside the costrustor.要不就直接在声明时设初值(只有两种情况下可以为readonly设置值:声明时,构造函数中) * 在类中可以定义一个类,称为嵌套类,在类中定义的类可以用private,但是在命名空间中只能定义internal和public; * 避免使用公共类型的嵌套类 * 分部类是将一个类的定义划分到多个文件夹下,分布方法只能在分布类中,在编译的时候直接弄成一个类了 * 分布方法不能有访问修饰符或virtual,abstract,override,new,sealed,huo extern修饰符 * User: YuanWei * Date: 2015/1/15 * Time: 16:30 * * */ using System; namespace LearningStatic { // private class Person // { // //会报错:在命名空间中定义的元素无法显示的声明为private,protected或protected internal,但是可以声明为public和internal // } /*分部类:的主要作用是一个类的定义划分到多个文件中,常用于代码生成器,但也可以在同一个类中定义多个分部类 * */ public partial class Person { public string Name{get;set;} public double Height{set;get;} partial void Talk()//分布方法不能有访问修饰符或virtual,abstract,override,new,sealed,huo extern修饰符 {}//私有的 } public partial class Person { partial void Talk(); public DateTime Birthday{get;set;} } // public class Program // { // //会报错,命名空间下已经包含了Program的定义,也就是说同一个明明空间下是不能包含出分部类以外的相同的类 // } class Program { public static void Main(string[] args) { /*有一个灵感:如果想给某个类的实力成员做一个标记的话。可以定义一个static字段,构造函数里每次将这个值赋值给一个字段,然后进行自增 * 那么这每个对象都有特定的标签了 * */ // TODO: Implement Functionality Here Person person=new Person(); // person能够点出来所有的public成员; Employee employee=new Employee(); Console.WriteLine(employee.PI.ToString()); Console.WriteLine(Employee.ID.ToString()); //Console.WriteLine(default(int)); Console.WriteLine(Employee.Sex); Console.WriteLine(Employee.Name); Math.Abs(-1); Console.ReadKey(true); } } public class Employee { public readonly double PI=3.1415926;//实例只读字段,readonly 的值可以在构造函数中修改,而const不可以 public readonly static int ID=23;//静态只读字段有两种写法,readonly的static可以交换,只能在静态构造函数和声明初始化的时候set value. public static readonly int Num=45;//正规的写法 public const string Sex="female";//会自动转换成静态字段,所以可以通过类型名.Sex进行访问,所以通过实例是不能进行访问的 public static string Name; public int Height; public static int Age{get;set;}//静态属性,封装了静态字段,安全度提高 public static void Add() { // this.Name="YuanWei";//错误。不能用this访问静态成员 // 用this点不出来静成员 Employee.Name="HongLi";//用类名能访问的是静态成员 // this.Height=180;//,错误,用this(instance)访问的是实例成员,所以要想在静态方法中访问实例成员的话就要先获得特定对象的引用 //this在静态属性,静态方法或静态字段初始值的设定无效 Employee employee=new Employee(); employee.Height=180; FirstEmployee.Age=20;//可以通过虚类.成员名调用 } public double Say() { // PI=3.1415926;//会报错:Error: read-only fileds cannot be set outside the constructor or when declaring return Math.PI; } // public static Employee()//错误,静态构造函数是不允许出现访问修饰符,所以静态构造函数就是private的 // {} /// <summary> /// 实例构造函数 /// </summary> public Employee() { PI=3.14;//readonly修饰的可以在构造中修改 Employee.Name="XiaoHong"; Console.WriteLine("调用实例构造"); } /// <summary> /// 静态构造函数 /// </summary> static Employee()//优先级高,所以这里面的值会被后调用的值覆盖掉 { Employee.Name="XiaoMing"; Console.WriteLine("调用静态构造"); } } /// <summary> /// 静态类 /// </summary> // public static class NewEmployee:Employee//这种定义是错误的,报错原因是静态类必须从对象派生 // { // // } public static class NewEmployee//会自动生成一个静态构造 { public const int MaxNum=123456;//自动编译成静态的literal字段 public readonly static string N="nI";//编译成静态inionly string字段 // public static const int MinVal=123;//错误,不能将常量标记为静态的 } // public static class NewFirstEmployee:NewEmployee//错误,静态类也不能从静态类派生 // {} public abstract class FirstEmployee:Employee//虚类可以从实例类进行派生 { //会自动生成一个protected的构造函数 } // public static class NewFirstEmployee:FirstEmployee//错误 // {} public abstract class SecondEmployee//抽象类的构造函数都是protected的 { } }
时间: 2024-10-24 12:03:18