C#基础知识
来源:互联网 发布:电力网络指 编辑:程序博客网 时间:2024/06/03 20:53
1 C#基本类型
数据类型本质上是数据的存储方式以及其能参与运算的抽象。
数据类型分为值类型和引用类型,值类型建立在栈区,引用类型建立在堆上,并在栈上存有堆地址的指针。
int a = 10;int b = a;//把a的内容复制给b,a和b没有关系Person a = new Person();//对象Person b = a;//将a的内存的指针给b,修改a将导致b修改
1.1 值类型
1.1.1 布尔类型
不能用0和1代替。
1.1.2 整数类型
1.1.3 实数类型
- 精度不高的浮点数运算可以采用float类型,采用double会更加准确,但是会占用更多的内存单元,加重计算机的负担
- 十进制类型(decimal)是C#中专门定义的一种数据类型,它主要是为了方便财务方面的计算。十进制类型的取值范围比双精度类型小的多,但它的精度更高。
- 可以用后缀来表示数值的类型。加M或m表明是十进制,f/F是单精度浮点型,d/D是双精度浮点型。如1.0f。
- 用后缀来表示该变量所需要的类型,能能够确保表达式进行正确的计算,在计算表达式时,编译器会把没有后缀的float和decimal都作为double处理
1.1.4 字符类型
- c#提供的字符类型按照国际上公认的标准,采用Unicode字符集,一个Unicode的标准字符长度是16位。
赋值方式:
char c = 'A';char c = '\x0041';//16进制转义字符char c = '\uAOB1';//表示Unicode'\n'回车
1.1.5 结构类型
- 结构体的定义和C语言稍微有点不一样
[c#]struct position{ public string city; public string street; public uint no;}position p1;
[c]struct position{ string city; string street; uint no;}struct position p1;
1.1.6 枚举类型
- enum关键字用于声明枚举,即由一组称为枚举数列表的命名常数组成的独特类型。每种枚举类型都有基础类型,该类型可以是除char以外的任何类型。
- 枚举原始的默认基础类型是int,默认情况下,第一个枚举数的值是0,后面的每个枚举数的值依次递增1.
- 枚举数可以具有重写默认值得初始值确定项。
enum days {Sat = 1,Sun,Mon, Tue, Wen, Thu, Fri};days day;day = Mon;
1.2 引用类型
1.2.1 类
- 类是面向对象编程的基本单位,是一种包含数据成员、成员函数和嵌套类型的数据结构。
- 类的数据成员有常量、域和事件
- 类的成员函数有方法,属性,索引指示器,运算符,构造函数和析构函数
- 类支持继承机制,通过继承,派生类可以扩展基类的数据成员和成员函数,进而实现代码重用和设计重用的目的。
- 类实际上是创建对象的模板,每个对象都包含数据,并提供了处理和访问数据的方法。类定义了每个对象可以包含什么数据和功能,但类自己不能包含数据。
2个特别的类
- object类
object类是预定义类System.Object的别名,他是所有其他类型的基类。C#中,所有类型都直接或间接从object类中继承。因此,一个object类的变量可以被赋予任何类型的值。
string类
string类是专门用于对字符串的操作,它是预定义类System.String的别名。
- 字符串前可用@,表示可以不进行转义。
@"C:\windows\system32\aaa.txt";//表示路径
string str1 = "mikecat";
- 可以用“+”号连接两个字符串
string str2 = "username:" + "mikecat";
- 访问单个字符,要用下标
char c = str1[10];
- 比较字符串是否相等,可以用比较操作符“==”
bool b = (str1 == str2);
1.2.2 接口
从技术方面将,接口是一组包含了函数型方法的数据结构。通过这组数据结构,客户代码可以调用组件对象的功能。
接口是把一组公共方法和属性组合起来,以封装特定功能的一个集合。它们自己并没有实现,而是通过类来实现接口,这样,类就支持接口所有的属性和方法。
当为类指定接口时,程序员通过接口的定义,就可以了解该类支持的某些属性和行为。用这种方法,许多不同的类就能够实现相同的接口,并以同样的基本方式来使用,但是,他们都有独特的行为。
接口描述了组件对外提供的服务。在组件和组件之间、组件和客户之间,都通过接口进行交互。因此,组件一旦公布,他就只能通过预先定义的接口来对外提供合理的,一致的服务。这种接口定义之间的稳定性,使客户开发者能够构造出坚固的应用。
1.2.3 委托
- 委托继承自System.Delegate类,它相当于函数指针原型。
- 委托提供了一种类型安全的方法来动态的引用类方法。当直接运行时之前都不知道要实现的准确方法时,委托用于接收对方法的引用。通过调用方法所分配的委托,可以执行分配给委托的方法。
- 委托定义了方法的类型,使得可以将方法当做另一个方法的参数来进行传递,这种将方法动态的赋给参数的做法,可以避免在程序中大量使用if-else语句,同时,使得程序具有更好的可扩展性。
- 委托是事件的基础。事件就是当对象或类的状态发生改变时,对象或类发出的信息或通知。发出信息的对象或类称为事件源,对事件进行处理的方法称为接收者,通常,事件源在发出状态改变信息时,并不知道由哪个事件接受者来处理。这就需要一种管理机制来协调事件源和接收者,c++中通过函数指针来实现。在C#中,事件使用委托来为触发时将调用的方法提供类型安全的封装。委托的声明方式如下所示:
public delegate void MyDelegate(string str);
- 委托的定义与方法的定义类似,只是在前面加了一个delegate,但委托不是方法,它是一种类型,用于对与该委托有相同签名的方法进行调用。
- 关键字delegate通知编译器这是一个委托类型,从而在编译的时候对该类进行封装,对这一过程,C#定义了专门的语法来处理。
- 委托不能从一个委托类型进行派生,因为它也是默认sealed的。它既可以对静态方法进行调用,也可以对实例方法进行调用。
- 每个委托类型包含一个自己的调用列表,当组合一个委托或从一个委托中删除一个委托时,都将产生新的调用列表。两个不同类型的委托即使它们有相同的签名和返回值,却还是两个不同类型的委托。但其实,在使用中可以看作是相同的。
- 当调用委托的方法发生了异常时,首先在调用该委托的方法中搜寻catch语句块,如果没有,则去该委托调用的方法中去寻找有没有catch语句块,这与调用方法发生异常的处理是一样的。
1.2.4 数组
- 数组是一种特殊实体,所有的数组隐含继承自System.Array类型。
- System.Array基类提供在数组处理期间所使用的各种方法,数组也是索引检查的,也就是说,任何试图对无效索引的访问都将产生异常错误。
- 数组是具有相同类型的一组数据,当访问数组中的数据时,可以通过下标来表明。C#中,数组元素可以为任何数据类型。
1.3 类型转换
- 当有不同类型的数据混合运算的时候,int->long->float->double->
- 整型提升,short,byte,char参与运算的时候均转为int
1.3.1 隐式转换
- 从int,uint或long到float的转换以及从long到double的转换的精度可能会降低,但数值大小不受影响。
- 不存在到char类型的隐式转换。
- 不存在浮点型与decimal类型之间的隐式转换
- int类型的常数表达式可转换为sbyte,byte,short,ushort,uint或long,前提是,常数表达式的值处于目标类型的范围之内。
- 隐式转换实际上就是从低精度的数据类型向高精度的数据类型的转换
1.3.2 显示转换
- 显示转换又称为强制类型转换,与隐式类型转换相反,显示转换需要用户明确地知道转换的类型。当可能会丢失数据或发生错误时,就必须进行显示转换。
- 显示数值转换可能导致精度损失或引发异常
- 将decimal值转换为整型时,该值将舍入为与零最接近的整数值。如果结果整数值超过目标类型的范围,则会引发OverflowException。
- 将double或float值转换为整型时,值会被截断。如果该结果整数值超出了目标值的范围,其结果将取决于溢出检查上下文。在checked上下文中,将引发OverflowException,而在unchecked上下文中,结果将是一个未指定的目标类型的值。
- 将double转换为float时,double值将舍入为最接近的float值,如果double值因为过小或者过大而使目标类型无法容纳它,则结果将为0或者无穷大。
- 将float或double转换为decimal时,源值将转换为decimal表示的形式,并舍入为第28个小数位之后最接近的数(如果需要),根据源值的不同可能会产生以下结果
- 如果源值过小而无法表示为decimal,那么结果将为0
- 如果源值为NaN(非数字值)、无穷大或因过大而无法表示为decimal,则会引发OverflowException
- 将decimal转换为float或double时,decimal值将舍入为最接近的double或float值。
1.3.3 编程中常用的类型转换
- 字符串转成数值
double a = double.parse(s);//parse是解析的意思
- 数值转成字符串
string s = a.toString();string s = "123" + 10;//结果是12310
- 使用convert
Convert.toInt32(textbook1.text);Convert.ToDateTime(2009-10-1 14:00);
2 变量和常量
2.1 变量的命名
2.2 常量
- 常数是另一种类型的字段,它保存的是在编译程序时要赋予的值,并且从那以后,在任何情况下都不会发生更改。常数是使用const关键字声明的,常数可以使代码更容易让人阅读。
const int speedLimit = 55;const double pi = 3.14159265358979323846264338327950;
- 从数据类型角度看,常量的类型可以是任何一种值类型或引用类型。
3 运算符和表达式
3.1 算术运算符
- 加法运算符
- 减法运算符
- 乘法运算符
- 除法运算符
- 求余运算符
3.2 关系运算符
- 比较运算符
is运算符
- is运算符被用于动态地检查运行时对象类型是否与给定的类型兼容。运算“e is T”的结果,是返回一个布尔值。它表示e是否能够通过引用转换等成功地转换为T类型。
- 通常用来检查变量是否为指定的类型。
bool result = 1.0 is double;//返回truebool result = 1.0 is float;//返回false,小数点没有后缀默认为double
- as运算符
- as运算符用于通过引用转换,将一个值显示的转换成指定的引用类型。
- 不像显示类型转换,as不会产生任何异常。如果转换不可以进行,那么,结果值为null。形如“e as T”的运算中,e是一个表达式,T是一个引用类型,返回值得类型总是T的类型,并且结果总是一个值。
3.3 赋值运算符
3.4 逻辑运算符
在逻辑表达式求值的过程中,不是所有的逻辑运算符都被执行。有时候,不需要执行所有的运算符,就可以确定逻辑表达式的结果。只有在必须执行下一个逻辑运算符后才能求出逻辑表达式的值时,才继续执行该运算符。这种情况称为逻辑表达式的“短路”。
例如a是一个布尔值或逻辑表达式,bool——exp是一个逻辑表达式,那么:
- 对于a&&(bool-exp),只有a为true时,才继续判断值,如果a为false,逻辑表达式的值已经确定为false,就不需要继续求值。
- 对于a||(bool-exp),只有a为false时,才继续判断值,如果a为true,逻辑表达式的值已经确定为true,就不需要继续求值。
3.5 位运算符
- 左移运算将操作数按位左移,高位被丢弃,低位顺序补0
- 右移运算时,如果操作数x是int或long型的,x的低位被丢弃,其他各位顺序依次右移,如果x是非负数,最高位设成零;如果x是负数,则最高位设成1。而当x的类型为uint或ulong型时,x的低位将被丢弃,其他各位顺序依次右移,高位设成0.
3.6 其他运算符
3.6.1 ?:运算符
?:运算符是三元运算符,包括三个表达式。第一个表达式是布尔表达式,当第一个表达式计算结果为真时,第二个表达式的值就会返回。这是做出决定并根据决定的结果返回选择的一种简洁办法。通常,三元运算符又称为条件运算符。
int c = (a>b) ? a : b;
3.6.2 sizeof()运算符
用于读取类型,并返回类型的字节数。
int i_size = sizeof(int);
3.6.3 typeof()运算符
用于返回Type对象,获得系统原型对象的类型
Console.WriteLine(typeof(int));//输出Int32
3.6.4 checked()运算符
用于检测某些操作的溢出条件,下面的例子通过试图分配一个值到无法容纳该值的short变量,来引起系统错误。
short val1 = 20000.val2 = 20000;short val3 = checked((short)(val1 + val2));//错误
3.6.5 unchecked()运算符
如果不管溢出与否,都必须忽略这个错误并接受该结果,就可以使用下面例子所示的unchecked()运算符。
short val1 = 20000,val2 = 20000;short val3 = unchecked((short)(val1 + val2));//错误被忽略
3.6.5 自增/自减运算符
- 对于前缀运算符,遵循“先增减,后使用”的原则
- 对于后缀运算符,遵循“先使用,后增减”的原则
3.7 运算符的优先级和结合性
- 在计算表达式时,每个运算符都会按顺序处理,但这并不意味着从左到右地运用这些运算符
var1 = var2 + var3;
其中的+运算符是在=运算符之前进行计算的。
- 当一个操作数出现在两个有相同优先级的运算符之间时,运算符按照出现的顺序由左到右执行。
- 建议在写表达式时,如果无法确定运算符的有效顺序,则尽量采用括号来保证运算的顺序,这样,也使程序一目了然,而且自己在编程时能够思路清晰。
运算符的优先级顺序
4 控制语句
几个小技巧
- 注意书写格式,特别是缩进
- 将后面的花括号去掉,在重新输入,就会自动排版
- Ctrl+E+D,格式化文档
- Ctrl+E+F,格式化选中部分
5 数组
- 数组是多个相同数据类型的集合,属于引用类型
- C#声明数组时,不能指定其长度(数组中元素的个数)。
int a[5];//非法int [] a = new int[3];
- s数组时引用类型,它的元素相当于类的成员变量,因此数组一经分配空间,其中的每个元素也被按照成员变量同样的方式被隐式初始化
int [] a = new int[3];//a[0]则是0
- 每个数组都有一个属性Length指明它的长度
- foreach可以方便的处理数组、集合中的各元素。foreach是只读式的遍历
int []ages = new int[10];foreach(int age in ages){ //...}
- Array.Copy()方法提供了数组元素复制功能
- 交错数组是数组的数组
int [][]t = new int[3][];t[0] = new int[2];t[1] = new int[4];t[2] = new int[3];
参考文献:
杨恒.C#课程设计案例精编[M]2版,北京:清华大学出版社,2016
网易云课堂,计算机专业课程体系,C#程序设计,唐大仕,北京大学
- C#基础知识
- c# 基础知识
- c#基础知识
- C#基础知识
- c#基础知识
- C# 基础知识
- C#基础知识
- C# 基础知识
- c# 基础知识
- C#基础知识
- C#基础知识
- C#基础知识
- C# 基础知识
- C#基础知识
- c#基础知识
- C#基础知识
- C#基础知识
- C#基础知识
- app跳转到京东的某个页面
- 转义序列小结
- 第一次使用博客,希望能坚持下去!
- Docker Error with
- [境内法规]中国人民银行关于印发《反洗钱现场检查管理办法(试行)》的通知—银发〔2007〕175号
- C#基础知识
- 数字三角问题(dp)
- 剑指offer--调整数组顺序使奇数位于偶数前面
- VC++ 串口编程
- java面试知识点整理之web系列
- test
- 修改Android签名密码-别名
- Linux shell判断文件或目录是否存在
- Android Jenkins+Git+Gradle持续集成-实在太详细