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();