1. c# 运行过程
2. 源代码执行过程
源代码------->编译--------->执行
1). 编译阶段
(1)源代码---->中间语言(IL)
(2) 公共语言运行库(CLR)---->中间语言(IL)---->平台专业代码
CLR: .Net Framework的核心
IL:低级语言,结构简单,可以快速的转换为本地机器码
3. .Net概念
(1) 程序集(assembly)是包含编译好的、面向.Net Framework的代码的逻辑单
(2) 命名空间:名称空间是.Net避免类名冲突的一种方式
(3)反射:因为程序集存储了元数据,包括在程序集中定义的所有类型和这些类型的成员的细节,所以可以编程访问这些元数据,这个技术称为反射
4.
(1) c#区分大小写,即 strVar 与strvar是不同的变量;
(2) 编译器不允许表达式中使用没有初始化的变量;
(3) 同名的局部变量不能再同一作用域内声明两次;
(4) c#把类类级别什么的变量看作字段,而把方法中声明的变量看作局部变量;
public class myClass
{
int pro=66;
public void method()
{
int pro=88;
}
}
(5)常量必须能在编译时用于计算。因此常量的初始化不能从变量中提取(如果必须这样,应使用只读字段)
5. 类型推断(type inference)
使用var关键字,编辑器根据变量的初始化值“推断”变量的类型
6 值类型与引用类型
(1) 值类型存储在堆栈上,而引用类型储存在托管堆上
(2) string与引用类型的区别:字符串是不可变化的;
string str1="Old String";
string str2=str1;
str1="New String";
此时str1="New String",str2="Old String",因为当s1的值变化时,并不会替换原来的值,堆上会为新值分配一个新的对象,str2变量仍然指向原来的对象
7. 循环语句
(1) for 语句
(2) while语句
(3) do...while 语句
(4) foreach 语句
8. 枚举型
public enum MyEnum
{
Monday=1,
Thursday=2
}
int iEnum=(int)MyEnum;
string sEnum =myEnum.toString();
9 命名空间
命名空间的别名使用
using newStr=命名空间
使用格式 newStr::类名
10. 字段与属性
字段是私有的
属性是公有的
11
. (1)方法重载:方法的名字相同,但是参数的个数或者参数类型不同
注意:(A)方法不能仅在返回类型上有区别
(B)方法不能仅根据参数是声明ref还是out来区分
(2)方法重写:子类对父类的方法进行重写。成员字段和静态函数都不能声明为virtual,因为这个概念只对类中的实例函数成员有意义
12. 属性的访问修饰符
在get和set访问器中,必须有一个具备属性的访问级别,否则会是这两个访问器的访问级别都不是属性
13. 构造函数
如果提供了带参数的构造函数,编译器就不会自动提供默认的构造函数,
Public class DemoClass
{
Private string name;
Public DemoClass(string name)
{
This.name=name;
}
}
一般使用this来区别成员字段和同名的参数
14. 静态构造函数
静态构造函数只执行一次
静态构造函数只能访问类的静态成员,不能访问类的实例成员。
静态构造函数不能带任何参数,一个类也只能有一个静态构造函数
静态构造函数没有访问修饰符,因为其他C#代码从来不调用它,但在加载类时,总是由.NET运行库调用它
无参数的实例构造函数与静态构造函数可以在同一个类中同时定义
15. readonly 变量
(1)允许把一个字段设置为常量,但还需要执行一些计算,以确定它的初始值,使用readonly
(2)其规则是可以在构造函数中给只读字段赋值,但不能在其他地方赋值。
(3) readonly字段还可以是一个实例字段,而不是静态字段,类的每个实例可以有不同的值,与const字段不同,如果要把只读字段设置为静态,就必须显式声明它。
16. 静态类
静态类只能包括静态的属性和方法
17 扩展方法
扩展类的方式,但如果没有源代码,就用到扩展方法,扩展方法主要是写在静态类中的静态方法
例如
Public class sclass
{
private double val=0;
public double Val
{
get{return value;}
set {value=val;}
}
}
public static class testExtension
{
public void WriteExtension(this sclass,int num)
{
String str = “$”+sclass.Val +num;
Console.writeLine(“Value={0}”, str);
}
}
调用
sclass _sc = new sclass();
_sc. WriteExtension(88);
18. 隐藏方法
子类中的函数名称与父类中的函数名称一样时,在子类的同名函数名前,加上new,即可在子类中隐藏父类的同名函数方法
public class ParentClass
{
public void method()
{
Console.WriteLine("Parent method console");
}
}
public class ChildClass:ParentClass
{
public new void method()
{
Console.WriteLine("Child method console");
}
}
测试调用
ChildClass child = new ChildClass();
child.method();
19. 拆箱和装箱
值类型------------>引用类型 装箱
引用类型-------------->值类型 装箱
20. default 关键字
根据泛型类型是引用类型还是值类型,泛型default用于将泛型类型初始化为null或者0
21. Array数组
值类型
Clone() : 创建一个新数组
Array.Copy():传递阶数相同并且足够空间的已有数组
22.
Action
Func
23. StringBuilder
初始化方式
(1)StringBuilder sb = new StringBuilder(100);
(2)StringBuilder sb = new StringBuilder("Hello World");
24. 正则表达式
(1)常用格式
(2)
[a-z]: a~z之间的任意字符
[1|a]:1或者a字符
25. List 排序和类型转换
static void Main(string[] args)
{
try
{
List lstEmployees = new List();
lstEmployees.Add(new Person() { name = "Li Lei20", age = 20, sex = "M" });
lstEmployees.Add(new Person() { name = "Li Lei22", age = 22, sex = "M" });
lstEmployees.Add(new Person() { name = "Li Lei24", age = 24, sex = "F" });
lstEmployees.Add(new Person() { name = "Li Lei28", age = 28, sex = "F" });
lstEmployees.Add(new Person() { name = "Li Lei25", age = 25, sex = "M" });
lstEmployees.Add(new Person() { name = "Li Lei21", age = 21, sex = "F" });
lstEmployees.Add(new Person() { name = "Li Lei18", age = 18, sex = "M" });
lstEmployees.Sort((r1, r2) => r1.age.CompareTo(r2.age));
List allPersons = lstEmployees.ConvertAll(em => new Employee() { name = em.name, age = em.age });
}
catch(Exception ex)
{
string msg = ex.Message;
}
Console.Read();
}
public class Employee
{
public string name { get; set; }
public int age { get; set; }
}
public class Person
{
public string name { get; set; }
public int age { get; set; }
public string sex { get; set; }
}
26. 队列
public class EmployeeManager
{
private readonly Queue
public bool IsAvailable
{
get { return employees.Count>0; }
}
public void AddEmployee(Employee emp)
{
lock (this)
{
employees.Enqueue(emp);
}
}
public Employee GetEmployee()
{
Employee employee = null;
lock (this)
{
if (IsAvailable)
{
employee = employees.Dequeue();
}
}
return employee;
}
}
public class Employee
{
public Employee(string eId, string name)
{
this.eId = eId;
this.name = name;
}
private string eId = string.Empty;
public string EID
{
get { return eId; }
set { eId = value; }
}
private string name = string.Empty;
public string Name
{
get { return name; }
set { name = value; }
}
}
public class ProcessManager
{
EmployeeManager employeeManager = null;
public ProcessManager(EmployeeManager employeeManager)
{
this.employeeManager = employeeManager;
}
public static void Start(EmployeeManager empManger)
{
new Thread(new ProcessManager(empManger).Run).Start();
}
protected void Run()
{
while(true)
{
if(employeeManager.IsAvailable)
{
Employee employee = employeeManager.GetEmployee();
Console.WriteLine("The Emploee EID is {0},Name is {1}", employee.EID, employee.Name);
}
}
}
}
static void Main(string[] args)
{
try
{
EmployeeManager emp = new EmployeeManager();
ProcessManager.Start(emp);
for(int i=1;i<=1000;i++)
{
emp.AddEmployee(new Employee("$" + i.ToString(), "Chines" + i.ToString()));
}
}
catch(Exception ex)
{
string msg = ex.Message;
}
Console.Read();
}