基础
字符串格式说明符
字符串格式说明符:由索引号,对齐说明符、格式字段3个部分组成
- 索引号
尝试引用超出替换值列表长度以外的索引时,不会产生编译错误,但会产生运行时错误(异常) - 对齐说明符
可选,+(默认,可不写)表示右对齐,-号表示左对齐
整数表示使用字符的最少数量 - 格式字段
9个内置格式说明符:
■ C、c:货币,货币符号取决于程序所在PC的区域设置
■ D、d:十进制
■ F、f:定点
■ G、g:常规,在没有指定说明符的情况下,会根据值转换为定点或科学记数法表示的紧凑形式
■ X、x:十六进制
■ N、n:数字,每三个数字间有逗号(或空格,取决于PC定位)分开,b, m, k;精度是小数位数
■ P、p:百分比,数字乘以100后添加%表示,精度为小数位数
■ R、r:往返过程(复杂,不想看)
■ E、e:科学计数法,精度为小数位数
var关键字
常量const
必须有初始化语句,初始化值需要在编译时决定,不能是某对象的引用,因为对象的引用是在运行时决定的
const不是一个修饰符,而是核心声明的一部分,需要放在类型的前面。
本地常量声明在方法体或代码块里,并在声明它的块结束的地方失效。
参数传递机制
形参是本地变量。
实参必须与对应形参类型匹配,或是编译器能把实参隐式转换为形参的类型。
- 值参数
通过将实参的值复制到形参的方式,把数据传递给方法。
方法被调用时,系统操作:
①在栈中为形参分配空间
②将实参的值赋给形参
说明:引用类型复制的是栈中存放的引用,所以在方法内操作形参时,改变了引用指向的数据,故影响到了实参的值。 - 引用参数 ref
实参必须是变量,且在用作实参前必须被赋值。
声明和调用都要ref
关键字
方法被调用前,系统操作:
不为形参在栈上分配内存,而是将形参用作实参的别名,指向相同的内存位置
static void SimpleFunc(MyClass f1)
{
f1.val = 50;
f1 = new MyClass();
}
static void RefFunc(ref MyClass f1)
{
f1.val = 50;
f1 = new MyClass();
}
static void Main()
{
MyClass a1 = new MyClass();
SimpleFunc(f1);
RefFunc(ref f1);
}
- 输出参数 out
声明和调用都需要out
关键字
形参相当于实参的别名,在方法内部,输出参数在能够被读取之前必须被赋值。 - 参数数组 params
一个参数列表中只能有一个参数数组,且必须是最后一个。
声明:在数据类型前使用params
修饰符,后放置一组空的方括号
在使用一个为参数数组分离实参的调用时,编译器的行为:
· 接受实参列表,用它们在堆中创建并初始化一个数组
· 把数组的引用保存到栈中的形参里
· 如果在对应形参数组的位置没有实参,编译器会创建一个有零个元素的数组来使用
如果数组参数是值类型,值被复制,实参不受影响;
如果数组参数是引用类型,引用被复制,实参引用的对象可以被影响。
- 附:可选参数
位置介于非可选参数和数组参数之间
方法的签名
组成:
■ 方法的名称
■ 参数的数目
■ 参数的数据类型和顺序
■ 参数修饰符
字面量
编译器让相同的字符串字面量共享同一内存位置以节约内存。
逐字字面量:@开头
转义字符不会被求值;相邻的双引号被解释为单个双引号
运算符及优先级
引用类型的比较
浅比较:大多数引用在比较相等性时,只比较它们的引用(指向的内存地址)是否相等。
深比较:string类型的对象,将比较它们的长度和内容(区分大小写)是否均相等。
自定义显式转换和隐式转换
隐式转换:implicit
显式转换:explicit(类似隐式,只需把implicit换成explicit)
约束:
不能重定义标准隐式转换或显示转换
对于源类型S和目标类型T:
■ S和T必须是不同类型
■ S和T不能有继承关系
■ 都不能是接口或object
■ 转换运算符必须是S或T的成员
运算符重载 operator关键字
只能用于类或结构
必须同时使用static和public修饰符
一元运算符重载带一个单独的class或struct类型参数
二元运算符重载带两个参数,且至少带一个class或struct类型的参数
递增和递减运算符重载后前置和后置之间没有区别。
switch-case
using语句,及时释放或关闭资源
分配资源(类、接口等)要求实现IDisposable接口
形式一
形式二:
可空类型 Nullable<T>、T?
判断可空类型是否有值:
①与null比较②获取hasValue属性
自定义可空类型
可空结构体:可空结构体只通过Value属性暴露基础类型,不直接暴露任何成员(though public)。
Main方法
四种声明形式:
// type 1:无返回值,无参数。
static void Main(){
}
// type2:无返回值,可以有参数。参数可以为0~n个,空格或制表符隔开。若无传参则args为空数组
static void Main(string[] args){
}
//type3:有返回值,无参数。返回值通常用于报告程序执行成功或失败,0通常表示成功
static int Main(){
}
//type 4:有返回值,可以有参数
static int Main(string[