C#笔记-基础知识(三)

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的方法为位标志的值提代更多的格式化信息。

原文地址:https://www.cnblogs.com/blackcatx/p/5924730.html