1.浅比较, 深比较
#浅比较只比较引用,深比较比较长度和内容
2.移位运算符
底层的硬件使用 “二进制补码” 的形式表示有符号二进制数。 正数使用正常的二进制形式。要取一个数的相反数,把这个数按位取反再加1.
这个过程把一个正数转换成它的负数形式。反之亦然。所有负数最左边的比特位都是1 。
3.用户定义的类型转换
class LimitedInt { public static implicit operator int(LimitedInt li) { return li.TheValue; } public static implicit operator LimitedInt(int x) { LimitedInt li = new LimitedInt(); li.TheValue = x; return li; } private int _theValue = 0; public int TheValue{...}; }
显示要用 explicit 替换掉implicit
4.运算符重载
运算符重载不可以创建新运算符, 不能改变运算符的语法;不能重新定义运算符如何处理预定义类型;不能改变运算符的优先级或结合性
重载运算符应该符合运算符的直观含义
5.typeof 运算符
Type t = typeof( someClass )
FileldInfo[] fi = t.GetFields();
MethodInfo[] mi = t.GetMethods();
5.委托
可以认为委托是持有一个或多个方法的对象。被执行时会执行他所有“持有” 的方法
可以把它看一个类型安全的, 面向对象的c++函数指针
委托和类一样, 是一种用户自定义的类型。而委托持有一个或多个方法。
delegate void Mydel(int value); // 声明一个委托类型
#声明一个委托, 看上去和方法声明相似,只是没有实现块。
#使用该委托类型声明一个委托变量。
#创建一个委托的对象,赋值给委托变量。新的委托对象包括指向某个方法的引用,签名(包括ref,out)和返回类型一致。可以增加方法
#可以像调用方法一样调用委托。包含的每一个方法都会被执行。可以是实例方法也可以是静态方法。
#调用带返回值的委托。 最后一个方法返回的值就是委托的返回值, 其它方法返回值都会被忽略
#调用带引用参数的委托时参数值可能会改变。在执行每个方法时的参数值不同
6.委托使用匿名方法
#声明委托yojgjf作为初始化的表达式。
#为委托增加事件时在赋值语句的右边
#除了数组参数,参数列表必须与委托匹配:参数数量,类型及位置, 修饰符
#可以省略圆括号来简化参数列表,但必须满足2个条件:委托参数列表不包含out参数;不使用参数
#如果委托声明有params参数,那么匿名方法的参数列表将忽略params 关键字。
7.Lambda表达式
#允许我们省略类型参数(隐式类型)。 如果只有一个隐式类型参数,我们可以省略圆括号;
#允许表达式的主体是语句块或表达式
#有ref , out 参数时必须注明类型(显式类型)
#如果没有又大火女,必须使用一组空的圆括号
8.装箱
可以将任何值类型转换为object类型; System.ValueType类型
》装箱转换
装箱是返回的是值的引用类型副本,不是在原值上操作,原始值类型和引用类型副本。
》拆箱unboxing 是把装箱后的对象转换回值类型的过程,显示转换
》自定义类型的转换
public static implicit operator int (Person p) //将person 隐式转换为int,
{
return p.Age;
}
public static explicit operator int (Person p) //必须强制类型转换
》is 判定是否可以转换,只可以用于引用转换以及装箱,拆箱转换, 不能用于用户自定义转换。
》as 运算符和强制转换运算符类似,只是不抛出异常, 失败返回null, 只能用于引用转换和装箱转换,
不能用于用户自定义转换或到值类型的转换。
9.溢出检测
代码片段是否被检查称作溢出检测上下文。如果指定一个表达式或代码为checked, CLR会在转换产生溢出时抛出一个OverflowException异常,如果不是checked, 转换会继续而不管是否产生溢出。
unchecked( ... ) 会忽略溢出
11. 字符串前加 @ 字符串中是字面量,转义字符串不会被求值,例外的是相邻的双引号,他们被解释为单个双引号,
string rst = "value 1 5, val2 10";
string vst = @"value 1 5,“” val“” 2 10"; //不解释制表符
12. 定义类的转换,重载运算符
class LimitedInt
{
private int _value = 9;
public static implicit operator int (LimitedInt li)
{
return li._value;
}
public static implicit operator LimitedInt(int x)
{
var li = new LimitedInt();
li._value = x;
return li;
}
public static LimitedInt operator + (LimitedInt x , double y)
{
LimitedInt li = new LimitedInt();
li._value = x._value + (int)y;
return li;
}
}
13. typeof运算符
using System.Reflection;
class Program
{
static voic main()
{
Type t = typeof(LimitedInt);
FieldInfop[] fi = t.GetFields();
MethodInfo[] mi = t.GetMethods();
var s = new LimitedInt();
foreach(MethodInfo m in mi)
Console.WriteLine("Method:{0}", m.Name);
Console.writeLine("{0}", s.GetType().Name);
}
}
14. using语句帮助减少意外的运行时错误带来的潜在问题,包装了资源的使用。它执行下列内容:
*分配资源
*statement放进try块
*创建资源的Dispose 方法的调用, 并把它放进finally块
class Program
{
using(TextWriter tw1 = File.Createtext("aaa.txt"),
tw2 = File.CreateText("bbb.txt"))
{
tw1.WriteLine("for score and seven years ago, ... ");
tw2.writeLine("early to bed; early to rise .. ");
}
using(TextReader tr1 = File.OpenText("aaa.txt"),
tr2 = File.OpenText("bbb.txt"))
{
string InputString;
while( null != (InputString = tr1.ReadLine()))
console.WriteLine(InputSring);
while( null != (InputStinrg = tr2.ReadLine()))
COnsole.WriteLine(InputString);
}
}
》结构是值类型, 结构本身派生自System.ValueType > object
》enum [Flasgs]特性,不会改变计算结果, 但却提供了一些方便的特性,
》》它能知编译器,该枚举成员不公可以用作单独的值, 还可以按位标志进行组合,
》》它允许枚举的ToString的方法为位标志的值提代更多的格式化信息。
》