alter table tablea add constraint pk_studentno primary key(StudentNo) //主键 add constraint fk_student_grade_gradeid foreign key(gradeid) references table2(gradeid) add constraint uq_studentname unique(StudentName) //唯一 add constraint df_address default(N'未填写') for address //默认值 add constraint ck_Gender check (gender=0 or gender=1) //检查 add constraint ck_phone check (phone is not null) //检查 抽象类和虚方法 1,抽象方法不需要实现,虚方法需要有具体的实现 2,抽象方法只能定义在抽象类中,虚方法不需要 3,抽象方法只能在派生类中定义,虚方法可以在任何类中定义 const 和readonly 两者都是赋值后不能更改其赋值的 const必须在初始化的时候进行赋值 readonly可以在初始化时不指定具体的值,在构造函数中指定 冒泡排序 public int[] BubbleSort(int[] arr) { for(int i=0;i<arr.Lenght;i++) { for(int j=0;j<i;j++) { if(arr[i]<arr[j]) { Exchange(arr[i],arr[j]); } } } } public void Exchange(ref int a,ref int b) { a = a^b; b = a^b; a = a^b; } 1-2+3-4+....+m public int GetValue(int m) { if(m=<0) return 0; int sum=0; for(int i=1;i<m;i++) { if(i%2!=0) { sum+=i; } else { sum-=i; } } } short a=1;a=a+1; 这里a是short,加上1会强转换为int,将int赋值给short,类型不匹配 short a=1;a+=1; 无错误 sql行转列 select * from score pivot { sum(分数) for 科目 in ([语文],[数学],[英语],[化学]) } as temp 查询不低于80分的科目 select * from score where 分数>=80 页面声明周期 1,页面请求-如果客户端发送到请求,那么服务器判断是否使用cache相应用户 2,页面相应-如果不使用cache相应用户,那么服务器会判断是否是回发请求,同事修改IsPostback属性 3,页面加载-主要加载主题和生成控件 4,控件加载-判断是否是回发,如果是回发请求那么准备给控件加载viewstate和controlstate 5,控件验证-为所有的控件调用validate方法,该方法设置页面和控件的isvalidate属性 6,回发事件处理--如果是回发的请求,那么会调用页面中控件的事件 7,呈现页面-首先为该页面和所有控件保存viewstate,然后为每个控件调用Render方法,然后将ViewState写入到Response属性的outputstream中去 8,卸载-页面完全呈现给用户,准备丢弃,并卸载页面的response和request 多线程 使用ThreadPool来节省线程创建的资源问题 使用AppDomain来隔离线程的区域 new Thread(NoParamsMethod).Start()方法来调用一个无参方法的线程 new Thread(ParamsMethod).Start(Params) 方法调用一个又参方法的线程 另一种创建线程的方法,创建Thread类的派生类,重写Run方法,调用Start方法 线程同步问题 lock关键字锁定同步代码块 等同于 Monitor.Enter(obj) Monitor.Exite(obj) 如果是同步数字可以使用InterLocked类 如果是同步文件可以使用ReaderWriterLock类 rwlock.AcquireReaderLock(-1); rwlock.ReleaseReaderLock(); rwlock.AcquireWriterLock(-1); rwlock.ReleaseWriterLock(); 如果想使用互斥锁,就使用Mutex类 mutex.WaitOne(); mutex.ReleaseMutex();