(先声明这个实例是什么类型)
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事件发生———事件订阅者开始工作)
格式: 事件+=
自动生成事件处理器
事件拥有者和响应者的关系大全:
①事件拥有者→事件响应者
②事件拥有者和事件响应者相同
③事件拥有者是事件响应者的一个字段成员
用方法订阅自己成员的某个事件
已有的类不能修改(不能自己添加事件处理器)
一个事件可以挂接多个事件处理器,反之也可**