1 static 成员和static构造函数
using System;
namespace testStatic
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(A.X.ToString()); //Return: 2
Console.WriteLine(B.Y.ToString()); //Return: 1
Console.Read();
}
}
class A
{
public static int X = B.Y;
static A()
{
++X;
}
}
class B
{
public static int Y = A.X;
static B()
{
++Y;
}
}
}
原则:
1 语句按照顺序执行;
2 static 成员函数初始化先于静态构造函数,限于一般构造函数
3 static成员初始化和static构造函数只执行一次。
分析
当调用到第一条语句的时候:
Console.WriteLine(A.X.ToString());
首先是访问A这个类型,那么要对A这个类型的静态成员进行初始化,其次如果有静态构造函数,需要调用它。
对于A的静态成员只有“X”,按照上一单元的过程:
先给其分配空间,并辅以0来初始化.
其次调用其对应的成员初始化语句来初始化这个静态成员。
那么它的成员初始化语句是“X = B.Y”,那么需要访问“B.Y”来初始化X这个静态成员。
对于“B.Y”的访问,就是访问B类型,也是和访问A一样,首先对这个类型的静态成员进行初始化,其次如果有静态构造函数,需要调用它。
而B的静态成员只有“Y”,先给其分配空间,并辅以0来初始化.
其次调用其对应的成员初始化语句来初始化这个静态成员,那么对于“Y =
A.X”成员初始化语句,由于此时不是第一次访问类型A,所以不再进行静态成员初始化和静态构造函数的调用,对于“A.X”的访问是直接访问。此时
“A.X”的值为0,那么Y的值也为0;接着执行B的静态构造函数,这样处理后Y的值为1。
那么对于A中的成员初始化语句“X = B.Y”,到此就执行完了.
此时A类型中的X与B类型中的Y都是一样的,值为1。
不过B中的静态成员初始化语句和静态构造函数都执行过了,而A中的静态构造函数还未执行。
因此经过A的静态构造函数处理,A的X值为2,这也就是最后显示的结果。
2 分页SQL语句
2.1 方法1
SELECT TOP 页大小 *
FROM table1
WHERE id NOT IN
(
SELECT TOP 页大小*(页数-1) id FROM table1 ORDER BY id
)
ORDER BY id
2.1 方法2
SELECT TOP 页大小 *
FROM table1
WHERE id >
(
SELECT ISNULL(MAX(id),0)
FROM
(
SELECT TOP 页大小*(页数-1) id FROM table1 ORDER BY id
) A
)
ORDER BY id
2.3 方法3
SELECT TOP 页大小 *
FROM
(
SELECT ROW_NUMBER() OVER (ORDER BY id) AS RowNumber,* FROM table1
) A
WHERE RowNumber > 页大小*(页数-1)
分页方案二:(利用ID大于多少和SELECT TOP分页)效率最高,需要拼接SQL语句
分页方案一:(利用Not In和SELECT TOP分页) 效率次之,需要拼接SQL语句
分页方案三:(利用SQL的游标存储过程分页) 效率最差,但是最为通用