1.控制台成员:13回车,10换行,有256个ASCII码
Console.Read();//从缓冲区读一个字符,返回该字符的ASCII码值,如果输入的时候是汉字,则会乱码。
Console.ReadLine();
ConsoleKeyInfo cki= Console.ReadKey();//如果ReadKey的参数为true,不显示输入的字符
2.Beep:台式机上是由主板发出的,笔记本是由显卡发出的
3.Namespace可以嵌套,类可以嵌套,方法不可以嵌套,方法只能在方法内部调用方法,不能定义方法
4.readonly: 该常量只能声明类字段,支持实例类型或静态类型,可以在声明的同时初始化或在构造函数中赋值。只读字段属于对象而不属于类,所以只读字段是对象中的常量。
Const常量除了可以声明为类字段外,还可以声明为方法上的局部变量,默认为静态类型(无需用static修饰,否则将导致编译错误,但必须在声明的同时完成初始化)
5.值类型与引用类型:
所有的值类型本质上都是一个结构体,所有的引用类型本质上都是一个类。
值类型存储的时候是存储值本身的,而引用类型存储的是托管堆中存放数据的地址。
当两个值类型相互赋值时,值类型是将值本身复制一次赋给另一个值类型变量。
int a=10;
int b=a;
b=20;
Console.WriteLine(a);//输出10
执行第二句时,只是将a的值复制一份赋给b,b的改变并不影响a。
我们再来看另一个例子:
当把mc1赋值给mc2时,只是把mc1的指针的内容(即该指针指向的内存的地址)赋给mc2,就是说,我们只在线程堆栈中分配一块内存存放mc2这个变量,而并不在托管堆中重新给该对象分配一块内存。换句话说,我们只是给mc1起了个别名mc2,其实mc1,mc2指的是同一个对象,当改变其中任何一个的字段或属性时,另一个也会改变。
6.匿名类型与var
Var是定义变量的一种方式,通常我们不在外部用var,var只是在方法内部定义变量时临时使用。系统在编译时会根据“=”的右边的类型去确定类型。
int? k =
null;//加上问号后就可以赋null值。
var v=new{Action=103,message="hello"};
Console.WriteLine(v.Action);
上面这个匿名操作,其实在new时是有名字的,只是我们访问不到而已。
7.装箱和拆箱必须对应的,装的时候是什么类型,拆的时候也只能是什么类型。 因为你在装箱时它会记住你的原类型。
int i=10;
object o=i;
Console.WriteLine(o.GetType().ToString()); //输出System.Int32
要避免使用装箱和拆箱,可以用转换
int i=10;
object o=i.ToString(); //这个不是装箱,而是类型转换
8.类型转换
Parse
类型.Parse(string)
int i=int.Parse(“123”);
Convert.To类型
强类型转换
int i=Convert.ToInt32(“123”);
Console.WriteLine(
Convert.ToBoolean("aa"));//程序会报错,但当把字符串”aa”换成”true”时,不会报错。
9.Var与dynamic比较:
dynamic表示
“变量的类型是在运行时决定的”,但是var表示“变量的类型是在编译时决定的”。
var让你在初始化变量时少输入一些字,编译器会根据右值来推断出变量的类型。
dynamic更厉害,它告诉编译器,根本就别理究竟是啥类型,运行时再推断不迟。
var只能用于局部变量的定义,你不能把类的属性定义成
var,也不能把方法的返回值类型或者是参数类型定义成var。dynamic就没有这些局限了。
dynamic类型并没有跳过类型校验,只是延迟到了运行时。如果在运行时,检测到类型不兼容,照样会抛出异常。
dynamic s =
"ddd";// dynamic做为参数,可以做为返回值,但var不能做为返回值。