MSDN C# 语言规范:
https://msdn.microsoft.com/zh-cn/library/ms228593.aspx
.NetFramework简介
.netframework运行于操作系统之上,提供良好的跨语言特性。.netframework包含两个内容:公共语言运行时(CLR)和类库集(FCL)
MSIL微软中间语言。当编译.net支持的语言编写的代码的时候,输出的代码为MSIL
CLR又包含:通用语言规范(CLS:保证语言互操作性的一组规则)和公共类型系统(CTS:包含了.net支持的各语言间兼容的数据类型和功能)
--------------------------------------------------------------------------------
C#中的变量和常量
C#中的基本数据类型:
值类型和引用类型
值类型:简单类型、结构类型和枚举类型。
简单类型:整数类型、浮点类型、小数类型(decimal)和布尔类型等
sbyte是有符号的,相当java的byte型,范围-128~127
C#中byte是无符号的,范围0~255
--------------------------------------------------------------------------------
变量命名方法:
帕斯卡命名法和骆驼命名法
帕斯卡命名法:如果有多个单词组成,每个单词首字母大写
骆驼命名法:如果有多个单词组成,第一个单词全部小写,后面的单词大写
--------------------------------------------------------------------------------
C#中的常量:const与readonly两种
const声明的常量:叫静态常量,必须声明时就初始化,且只能用常数值初始化
readonly声明的常量:叫动态常量,可以在声明时不初始化,只能在构造函数中初始化,但必须每个构造函数中都要初始化;而且可以使用变量值初始化
class Test
{
const float PI =3.1416f; //常量命名:全部大写
readonly float G;
public Test()
{
G = 9.80F;
}
public Test(float g) //每个构造函数中都要初始化;而且可以使用变量值初始化
{
G = g;
}
}
--------------------------------------------------------------------------------
C#中的装箱和拆箱
装箱:值类型转换成有引用类型
拆箱:引用类型转换成值类型
值类型:存在栈中
引用类型:在堆中存放对象的地址(即引用),对象本身存放在栈中
拆装箱允许值类型和引用类型相互处理
--------------------------------------------------------------------------------
C#语法
Switch()括号中可以是int ,char和string,switch语句中的case语句冒号后什么都不写,可以不写break,其他情况一定要写break,否则报错
数组:五种声明方式
int []array;
array = new int[2];
//第二种声明方式
int []array1 = newint[2];
//第三种声明方式
int []array2 = {1,2,3};
//第四种声明方式
int []array3 = newint[]{1,2,3};
//第五种声明方式
int []array4 = newint[3]{1,2,3};
//数组大小也可以是变量
int count = 3;
int []arr = newint[count];
--------------------------------------------------------------------------------
枚举:用有意义的字符去访问数据
public enum Contry:long //指定枚举类型,必须是整型,不写为int型
{
Pacific, //第一个未付值,默认为零
China=1860,
Japan,
US=1901,
Canada
}
--------------------------------------------------------------------------------
C#中的面向对象
析构函数:函数名与构造函数名一样,~函数名(),不接受参数,由垃圾回收器自动调用(GC.Collect()调用垃圾回收器)
virtual关键字:C#中,子类要重写父类的方法,必须把父类的方法标识为virtual(虚拟的),同时重写方法用override修饰
new 关键字:new关键字:在子类中定义的一个和父类方法签名一样,但是个全新的方法。并非重写父类的方法。
base关键字:用base关键字调用父类的方法
访问修饰符:
public 公有的,
internal 在一个项目中的,
protected有父子关系的类,
private仅所属类的成员
注意:如果有一个类既继承类又实现接口,类名要写在接口名前面。
--------------------------------------------------------------------------------
属性,索引器,委托,事件
属性:访问修饰一般为public,首字母大写。属性内有get和set访问器,get内必须要有return,set内有value关键字,代表从外部接受的值。
索引器:索引器的作用:像处理数组一样去处理类的对象。
public classStudent
{
private string []obj=new string[10];
//this关键字在这里代表每一个类的对象,[]中整数是指通过下标访问
public string this[intindex] //此是可以通过索引号去访问每一个类的成员
{
get
{
return obj[index];
}
set
{
if(value!=null)
obj[index]=value;
}
}
static void Main(string []args)
{
Student stucollection=new Student();
stucollection[0]="柯南";
stucollection[1]="小五郎";
stucollection[5]="怪盗基德";
}
}
委托:相当于函数指针,可使程序在运行是再指定具体要运行的方法。
(1) 定义委托:Public delegate int Call()
(2) 实例化委托:Call objcall=new Call(方法名) //使用构造函数的方式
也可以这样初始化:
Public delegate void Call(); //多播委托必须是无返回值
if(objcall != null){
objcall += 方法名; //不为空说明已经初始化完毕,所以添加,这里说明C#这里重载了+=运算符
}else{
objcall = 方法名 //为空说明还未初始化,所以直接赋值,这里说明C#这里重载了=运算符
}
(3) 调用委托:objcall(); // 直接调用
objcall.BeginInvoke(。。,callBack,。。。) //异步调用,从线程池里拿个线程执行异步操作,执行完后进行回调函数,所以 回调函数是在新线程里执行的,不是在主线程里执行的。
事件:事件实际上是一种特殊的委托,委托每次只能指向一个方法,而事件可以指向多个方法
(1)定义一个委托public delegate void delegateMe();
(2)定义一个事件 private event delegate eventMe;
(3)订阅事件 eventMe+=new delegateMe(方法名1());
eventMe+=new delegateMe(方法名2());
(4) 引发事件 if(condition) then eventMe();
--------------------------------------------------------------------------------
多线程
创建线程实例:
Thread obj=new Thread(new ThreadStart(方法名称))
开始:Start();
休眠:Sleep();
终止:Abort();
挂起:Suspend();
恢复:Resume();
当前线程:Thread.CurrentThread
ThreadPriority枚举值用来指定调度线程的优先级(共5级)
lock关键字
C#中通过lock关键字提供同步
线程同步:确保不同的线程对共享资源进行访问时,每次只有一个线程访问资源。
Lock(this)
{
For(int i=0;i<10;i++)
{
//语句;
}
}
《C#网络编程(完整书签)》马骏,线程章节:
1.最好不要用Thread的Abort方法,如果要用,结合Join方法使用。
2.线程池-->减少线程的启动时间。
3.线程同步,Lock的对象一定为私有的,不锁定公有对象,否则会使Lock语句无法控制。
4.注意避免死锁问题。
--------------------------------------------------------------------------------
数组集合对象
Array: Array和数组很相似,还可以相互转化和拷贝,很多方法都是是通用,可以用Array的静态方法对数组实现反转,排序,这是数组本身无法做到的
using system.Array;
Arrayar=Array.CreateInstance(typeof(int),5); //创建一个Array的实例
ar.SetValue(12,0); //赋值
Array.Reverse(ar); // 反转
Array.Sort(ar); // 排序
ArrayList:最常用的集合之一.集合的好处是在不知道数据大小时,可以实现容量自动增长,而数组做不到.
Add()添加元素
Remove(位置)移除元素
ArrayList al=new ArrayList();
//如果要遍历集合元素,
//方法一:
//将集合中的数拷贝到数组中
object[]temp=al.ToArray();
foreach(object t intemp)
{
Console.WriteLine(t);
}
//方法二,使用迭代器
IEnumeratorie=al.GetEnumerator();
while(ie.MoveNext())
{
Console.WriteLine(ie.Current);
}
HashTable:以键值对的形式保存值
Hashtable hash=new Hashtable(4);
hash.Add("中国",1860);
hash.Add("德国",1940);
Console.WriteLine(hash["中国"].ToString());通过key获得value
SortedList :是 Hashtable 和 Array 的混合
能存放键值对,类似Hashtable
能通过自身提供的方法通过索引直接遍历,类似于Array
objsortlist.GetKey(i) 方法获得键
objsortlist.GetByIndex(i)方法获得值
==========================================================
static修饰构造函数和类
Static类是不能实例化的, C#2.0以前为了不让一个类在外部实例化,通常都是创建一个private的构造函数,现在可以通过Static类来达到这样的目的. Static类通常用于那些只包括static 方法或属性的工具类, 这样的类没有必要进行实例化, 所以干脆用static修饰,表示不能实例化
Static构造函数(Constructor)有如下特征:
1. 用于对静态字段、只读字段等的初始化.
2. 添加static关键字,不能添加访问修饰符,因为静态构造函数都是私有的。
3. 类的静态构造函数在给定应用程序域中至多执行一次,只有创建类的实例或者引用类的任何静态成员才激发静态构造函数
4. 静态构造函数是不可继承的,而且不能被直接调用。
5. 如果类中包含用来开始执行的 Main 方法,则该类的静态构造函数将在调用 Main 方法之前执行。 任何带有初始值设定项的静态字段,则在执行该类的静态构造函数时,先要按照文本顺序执行那些初始值设定项。
6. 如果没有编写静态构造函数,而这时类中包含带有初始值设定的静态字段,那么编译器会自动生成默认的静态构造函数。
以下用例子代码进一步说明:
/**************************************************
* (1)①②③……为执行顺序
* (2)输出结果:
* static A()
* static B()
* X = 1, Y = 2
***************************************************/
using System;
class A
{
public static int X;
static A() //④ 执行完后返回到③
{
X = B.Y + 1;
Console.WriteLine("static A()");
}
}
class B
{
public static int Y = A.X + 1; //③ 调用了A的静态成员,
// 转到A的静态构造函数---->
static B() //② 如果带有初始值设定项的静态字段,
// 执行该类的静态构造函数时,
// 先要按照文本顺序执行那些初始值设定项。
// 转到初始值设定项---->
{
Console.WriteLine("static B()");
}
static void Main() //① 程序入口,
// 如果类中包含用来开始执行的 Main 方法,
// 该类的静态构造函数将在调用 Main 方法之前执行。
// 转到B的静态构造函数---->
{
Console.WriteLine("X = {0}, Y = {1}", A.X, B.Y);//⑤ 输出结果
Console.ReadLine();
}
}
==========================================================
c#中yield的用法详解
一. yield是c#2.0以后为了简化迭代器加入的一个新特性。 yield 关键字只允许出现在在迭代器块中,有两种用法:
1. yield return 表达式;
这是一个隐式转换的返回值,将计算 expression 并将结果以值的形式返回给枚举器对象。expression 必须可以隐式转换为 yield 类型的迭代器,且必须为IEnumerable、IEnumerable<T>、IEnumerator或 IEnumerator<T>。每次调用yield return“后会记录当前迭代器位置,下次迭代从该位置开始,直至迭代结束。
2.yield break;
yield 关键字与 break 结合使用,表示迭代结束。
二. yield 语句只能出现在迭代器块中,该块可用作方法、运算符或访问器的主体。这类方法、运算符或访问器的体受以下约束的控制:
1. 不允许不安全块。
2. 方法、运算符或访问器的参数不能是 ref 或 out。
3. yield 语句不能出现在匿名方法中。
4. 当yield与expression 一起使用时,yield return 语句不能出现在 catch 块中或含有一个或多个 catch 子句的 try 块中
==========================================================
IO:
MSDN .net4.5 文件和流 I/O
https://msdn.microsoft.com/zh-cn/library/k3352a4t%28v=vs.110%29.aspx
==========================================================
.NET ADO
Conection : 对数据源连接
Command :执行数据库命令,增删改查、过程、检索
DataReader :从数据源读数据,连接模式
DataSet :内存中的数据库,非连接模式
DataAdaper :把数据源装到DataSet中去
DataTable :数据实际存在DataTable中,DataSet存储DataTable