clr 面试_C# CLR 几道面试题

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值