Form Now On...

导航

 

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的游标存储过程分页)    效率最差,但是最为通用

posted on 2011-08-17 11:52  zjwei55  阅读(475)  评论(0编辑  收藏  举报