C#基础知识
标识符与关键字
标识符
一个字符串成为标识符的三个条件:
- 只包含字母(包括大小写)、数字、@符号以及下划线"_"。
- 首位可以是字母、数字下划线和@符号,但不能是数字。
- 不能为C#的关键。
关键字
C#中有77个关键字:

数据类型
整型
| 类型 | 说明 | 取值范围 |
|---|---|---|
| byte | 无符号的8位整数 | 0~255 |
| sbyte | 有符号的8位整数 | -128~127 |
| char | 16位Unicode字符 | U+0000~U+FFFF,如字符'x'的Unicode编码为:"\0041" |
| short | 有符号的16位整数 | -215~215-1 |
| ushort | 无符号的16位整数 | 0~65535 |
| int | 有符号的16位整数 | -231~231-1 |
| uint | 有符号的16位整数 | 0~231-1 |
| long | 有符号的16位整数 | -263~263-1 |
| ulong | 无符号的16位整数 | 0~264-1 |
浮点型
- 单精度浮点数在机内占4个字节、有效数字8位、表示范围:-3.40E+38 ~ +3.40E+38
- 双精度浮点数在机内占8个字节、有效数字16位、表示范围:-1.79E+308 ~ +1.79E+308
- decimal ,28-29 个有效位,表示范围:(-7.9 x 1028 - 7.9 x 1028) / (100 - 28)
decimal price;
decimal discount;
decimal discount_price;
//注意:必须要带“m”,否则将和标准的浮点类型一样。而我们要求的却是
//用来计算货币类的浮点数,但是可以给其赋整数值。
// decimal 对小数的运算更加的准确。
price = 19.95m;
discount = 0.15m;
discount_price = price - (price * discount);
Console.WriteLine("Discounted price : " + discount_price);
Console.ReadKey();
科学计数法形式:如:123e3或123E3,其中e或E之前必须有数字,且e或E后面的指数必须为整数(当然也包括负整数),比如7.823E5 = 782300 这里E5表示10的5次方,再比如54.3E-2 = 0.543这里E-2表示10的-2次方。

运算符
运算符的优先级顺序

运算符重载
很全面且有相关的实例:https://www.cnblogs.com/52XF/p/yunsuanfuchognzai.html
try语句分析
面试踩的坑:https://www.cnblogs.com/aspirant/p/6789040.html
类
类代表一组具有公共属性的和行为的对象。类的修饰符有以下几种;
- 无修饰符或internal:只能在同一程序集中访问。
- public:同一程序集中访问或引用该程序集的其他程序集都可以访问。
- abstrac或abstrac internal:只能在同一程序集中访问,该类只能被继承,无法实例化。
- public abstrac:同一程序集中访问或引用该程序集的其他程序集都可以访问,该类只能被继承,无法实例化。
- sealed或internal sealed:只能在同一程序集中访问,该类不能被继承,可被实例化。
- public sealed:同一程序集中访问或引用该程序集的其他程序集都可以访问,该类不能被继承,可被实例化。
类的初始化顺序:初始化该类的实例化字段->调用基类的构造函数,如果未指明基类将调用System.Object的构造函数->3、调用子类的构造函数
字段与属性
字段最好设置为private类型,保证类内部成员的完整性。属性的定义主要与get访问器和set访问器组成,get访问器负责对字段进行读取,set访问器负责对字段进行赋值。
构造函数
实例构造函数:用于创建和初始化类的实例,可以进行方法重载。
静态构造函数:用于初始化类中的静态成员,在创建第一个实例或引用任何静态成员之前,CLR将自动调用静态构造函数且只会执行一次,声明时无法指定任何的访问修饰符,不带任何的参数,不能直接调用静态的构造函数。
索引器
https://www.cnblogs.com/lgx5/p/9448361.html
面向对象
https://blog.csdn.net/sugar_no1/article/details/86366714
理解类型
C#中的类型分为两大类:值类型和引用类型。值类型的实例通常被分配在线程的堆栈上,变量保存的内容就是实例数据本身。引用类型的实例则被分配在托管堆上,变量保存的是实例数据的内存地址。值类型的管理由操作系统负责,而引用类型的管理则由垃圾回收器(又称为Garbage Collection, GC )负责。
以下为值类型:
有符号整型:int、long、short和sbyte
无符号整型:uint、ulong、ushort和byte
字符类型:char
浮点型:float, double,decimal
布尔类型:bool
枚举类型:enum
结构体类型:struct
以上值类型以外的都是引用类型,如string,数组,接口类型,委托类型等。
- 实参和形参:实参指的是调用方法时,传递给对应参数的值,形参指的是方法中定义的参数。
- 值类型的按值传递:传递的是该值类型实例的一个副本,也就是说形參接收到的是实參 的一个副本,被调用方法操作的是实参的一个副本罢了。所以此时,方法中对参数的改变不会影 响到实参的值。
- 引用类型的按值传递:传递和操作的目标是指向对象的地址.而传递的实际内容是对 地址的复制。由于地址指向的是实参的值,当方法对地址进行操作时,实际上操作了地址所指向 的值,所以调用方法后原来实參的值就会被修改。
- string引用类型參数按值传递:string具有不变性,一旦一个string类型被赋值,则它就是不可改变的,即不能通过代码去修改它的值。所以string类型是引用类型但是它在按值传递时不会自身的值不会改变,系统会重新分配一块内存空间来存放传入方法后改变的string。
- 值类型和引用类型参数的按引用传递:在按引用传递时,不管參数是值类型还是引用类型,其本质都是一样的,都是通过ref或out 关键字来告诉编译器,方法传递的是参数地址,而非参数本身。
- ref和out:ref是作为输入输出用的,out仅仅是作为输出用的,当一个方法仅仅是为了返回多个值使用out,既要传入值又要输出值可以用ref,ref必须在方法外初始化后才可以使用,out则不用。
可空类型、匿名方法和拓展方法
- 可空类型:也是值类型的一种,但是它是包含null值的值类型。eg:int? nullInt=null;
- 空合并操作符:即??操作符,它会对左右两个操作数进行判断:如果左边的数不为null,就返回左边的数;如果左边的操作数为null,就返回右边的操作数。该操作符只能用于可空类型和引用类型,其他的值类型不能使用,因为值类型是不能与null比较的。
- 拓展方法
using System;
using System.Collections.Generic;
namespace ConsoleApp1
{
//扩展方法必须在非泛型静态类中定义
public static class ListExten
{
//定义扩展方法
public static int Sum(this IEnumerable<int> source)
{
if (source == null)
{
throw new ArgumentNullException("输入数组为空");
}
int jsum = 0;
// flag变量用作下标,以计算所有奇数下标项之和
bool flag = false;
foreach (int current in source)
{
if (!flag)
{
jsum += current;
flag = true;
}
else
{
flag = false;
}
}
return jsum;
}
}
}
在以上代码中,Sum方法就是一个扩展方法,它的功能是计算数组中小标为奇数的数组成员之和。
扩展方法的定义规则:
- 扩展方法必须在一个非嵌套、非泛型的静态类中定义;
- 它至少要有一个参数;
- 第一个參数必须加上this关键字作为前綴(第一个参数类型也称为扩展类型,即指方法对 这个类型进行扩展);
- 第一个参数不能使用任何其他的修饰符(如不能使用ref、out等修饰符);
- 第一个参数的类型不能是指针类型。
方法调用的优先级顺序应为:类型的实例方法—>当前命名空间下的扩展方法->导入命名空间的扩展方法。
- 匿名方法和拓展方法详细参考:https://www.cnblogs.com/edisonchou/p/4088959.html
动态类型
https://www.cnblogs.com/zhili/archive/2013/01/07/DynamicType.html

浙公网安备 33010602011771号