(先声明这个实例是什么类型)
    Student stu=null;空指针
    stu 没有指向任何
    内存地址
    Student stu= new Student();
    stu 指针指向了一个新分配的
    内存地址

    {(1)把Student.class文件加载到内存
    (2)在栈内存为s开辟空间
    (3)在堆内存为学生对象申请空间
    (4)给学生的成员变量进行默认初始化。null,0
    (5)给学生的成员变量进行显示初始化。
    (6)通过构造方法给成员变量进行初始化。
    (7)对象构造完毕,把地址赋值给s变量}


    依赖关系 互相引用
    名称空间 以树形结构组织类
    使用类需要提前注明名称空间
    查找类对应的名称空间 将鼠标放在特定的类上
    类重名有冲突时,注明其名称空间
    Assembly类库引用是使用名称空间的物理基础(类、名称空间) dll
    如何添加类库
    表 接口 建模—去伪存真

    Console.Readline();
    数组大小 不能让系统默认初始化为0 [10] {1,2,3,4,5}
    New操作符 开辟数组
    访问字典时 [ ]内可以不是整数
    泛型类 不完整 <,,,,>其中填索引类型
    typeof 得到某种数据类型对应的名称空间、方法等的信息

    C# 不能换变量类型
    new:调用实例构造器和实例初始化器(eg:new Form(){ 参数 })

    int[] myArray = { …… }(可不用= new int[10])

    var person = new{Name=“”,Age= }
    是为匿名类型创建对象并且用隐式类型变量引用这个实例

    New操作符 会使不同的类紧耦合 依赖注入可缓解

    Check 检查溢出

    Convert.ToXXX( ); λ表达式代替delegate作为操作符被使用

    定义静态函数的好处:
    静态函数不能被其它文件所用;
    其它文件中可以定义相同名字的函数,不会发生冲突;

    静态数据成员没有进入程序的全局名字空间,因此不存在与程序中其它全局名字冲突的可能性;可以实现信息隐藏。静态数据成员可以是private成员,而全局变量不能;

    this.
    匿名方法
    Object 根源
    四种方法(所有数据类型均有)
    double.Parse( string类型 ) 解析正确的字符串类型

    显式转换 convert类
    不同类:Stone 类 转换为 Monkey 类:Monkey ss = (Monkey)stone;


    需将public static explicit/implicit operator Monkey(Stone stone)
    { 具体语句 } (返回类类型的数据)
    写在被转换的类中

    Decimal 精度更高的小数
    literal value 字面值
    type member 类型成员


    基本组件:表达式(语法实体 求值得到4类结果) 命令 声明……
    (成员访问表达式 可得到结果-方法)
    运算后得到某某数据类型 也成为某某类型的表达式


    typeof(x)中的x,必须是具体的类名、类型名称等,不可以是变量名称
    Type t = typeof(int);
    取得int的类型,存于Type类的对象t

    foreach 语句用于枚举一个集合的元素,并对该集合中的每个元素执行一次相关的嵌入语句 最佳应用场合:对集合元素进行遍历
    foreach(数据类型 标识符 in 表达式)

    属性可以实时动态计算出对象或类型的状态
    private 字段(小写)
    一对方法保护字段: Get字段名() Set字段名(参数)
    永远使用属性来暴露数据
    public int Age
    {

    {
    return age;
    }


    {
    if (value >= 0 && value <= 120)
    {
    age = value;
    }

    {
    throw new Exception(“Age value has error.”);
    }
    }
    }


    某某类型的变量 以某某参数的形式传入…
    ref+数据类型+变量名 实参形参指向相同地址
    ref 显式指出 改变实参的值

    输出形参通常用在需要产生多个返回值的方法中


    Console.Writeline(“ {0}, {1}”);
    {0}:占位符,表示这里是第0个用户要放入内容的地方。

    Params 必须是形参列表的最后一个
    使用 params 后,不再需要单独声明数组

    具名参数的优点:
    ·
    提高代码可读性
    ·
    参数置不在受参数列表约束的位
    Eg:
    PrintInfo(age: 24, name:”Wonder”);
    static void PrintInfo(string name, int age)


    扩展方法(this 参数) 必须是公有、静态
    this 参数必须是形参列表中第一个
    class Program
    {
    static void Main(string[] args)
    {
    double x = 3.14159;
    // double 类型本身没有Round 方法,只能使用 Math.Round。
    double y = x.Round(4);
    Console.WriteLine(y);
    }
    }

    static class DoubleExtension
    {
    public static double Round(this double input,int digits)
    {
    return Math.Round(input, digits);
    }
    }

    *
    委托:
    1.使用已有的委托:
    Action XXX = new Action ( 对应的方法 ); (XXX是委托名)
    XXX();
    Func 泛型委托
    Func<方法的返回类、参数的类型> XXX = new Func <方法的返回类、参数的类型>;

    2.自定义委托:位置放正确 主类之外
    委托与所封装的方法必须“类型兼容”
    声明方法与委托声明的返回值类型+参数列表 保持一致
    public delegatedouble Calc(double x, double y);//对目标方法的约束
    声明委托类型后, 用 new 关键字来创建实例委托对象,且与一个特定的方法有关。当创建委托时,传递到 new语句的参数就像方法调用一样书写,但是不带有参数



    委托的常规使用:把方法当参数传给另一个方法






    *
    事件=通知+可选参数
    发生-响应 5个部分5个动作 隐含订阅关系

    事件拥有者和响应者 —基于对象或类
    事件成员(event,对象成员)
    事件处理器(方法成员)—-本质是一个回调方法

    用于事件订阅的处理器(方法)与事件遵守同一个约定(委托)



    Eg:
    鼠标点击→电信号发送→操作系统查看鼠标指针位置 →包含按钮的窗口处于被激活状态→按钮变成被按下状态(内部逻辑的执行:检测到连续按下—点击——click事件发生———事件订阅者开始工作)

    格式: 事件+=
    自动生成事件处理器



    事件拥有者和响应者的关系大全:
    ①事件拥有者→事件响应者
    ②事件拥有者和事件响应者相同
    ③事件拥有者是事件响应者的一个字段成员
    用方法订阅自己成员的某个事件

    已有的类不能修改(不能自己添加事件处理器)

    一个事件可以挂接多个事件处理器,反之也可**