.NET
重点复习内容
1.
填空
:
(1)
面向对象的语言具
有_继承_性、_封装_性、_多态_性。
(2)
能用
foreach
遍历访问的对象需要
实现 _ IEnumerable接口或声明_ GetEnumerator方法的类型。 _ _
(3)
列举
ADO.net
中的五个主要对象
__connection、_Command_、__DataReader、__DataAdapter、__DataSet。_______________
2.
不定项选择:
(1)
以下叙述正确的是:
A.
接口中可以有虚方法。
B.
一个类可以实现多个接口。
C. 接口不能被实例化。 D. 接口中可以包含已实现的方法。
C. 接口不能被实例化。 D. 接口中可以包含已实现的方法。
(2)
从数据库读取记录,你可能用到的方法有:
A. ExecuteNonQuery B. ExecuteScalar
C. Fill D. ExecuteReader
3.
简述
private
、
protected
、
public
、
internal
修饰符的访问权限。
private : 私有成员, 在类的内部才可以访问。
protected : 保护成员,该类内部和继承类中可以访问。
public : 公共成员,完全公开,没有访问限制。
internal: 在同一命名空间内可以访问。
protected : 保护成员,该类内部和继承类中可以访问。
public : 公共成员,完全公开,没有访问限制。
internal: 在同一命名空间内可以访问。
6. 写出程序的输出结果
class Class1 {
private string str = "Class1.str";
private int i = 0;
static void StringConvert(string str) {
str = "string being converted.";
}
static void StringConvert(Class1 c) {
c.str = "string being converted.";
}
static void Add(int i) {
i++;
}
static void AddWithRef(ref int i) {
i++;
}
static void Main() {
int i1 = 10;
int i2 = 20;
string str = "str";
Class1 c = new Class1();
Add(i1);
AddWithRef(ref i2);
Add(c.i);
StringConvert(str);
StringConvert(c);
Console.WriteLine(i1);
Console.WriteLine(i2);
Console.WriteLine(c.i);
Console.WriteLine(str);
Console.WriteLine(c.str);
}
}
10 21 0 str string being converted
7.写出程序的输出结果
public abstract class A
{
public A()
{
Console.WriteLine('A');
}
public virtual void Fun()
{
Console.WriteLine("A.Fun()");
}
}
public class B: A
{
public B()
{
Console.WriteLine('B');
}
public new void Fun() //实现方法的隐藏,将基类继承的方法进行隐藏~~
{
Console.WriteLine("B.Fun()");
}
public static void Main()
{
A a = new B();
a.Fun();
}
}
A B A.Fun()
8.写出程序的输出结果:
Public class A
{
public virtual void Fun1(int i)
{
Console.WriteLine(i);
}
public void Fun2(A a)
{
a.Fun1(1);
Fun1(5);
}
}
public class B : A
{
public override void Fun1(int i)
{
base.Fun1 (i + 1);
}
public static void Main()
{
B b = new B();
A a = new A();
a.Fun2(b);
b.Fun2(a);
}
}
2 5 1 6
9. 一列数的规则如下: 1、1、2、3、5、8、13、21、34......
求第30位数是多少, 用递归算法实现。
public class MainClass
{
public static void Main()
{
Console.WriteLine(Foo(30));
}
public static int Foo(int i)
{
if (i <= 0)
return 0;
else if(i > 0 && i <= 2)
return 1;
else return Foo(i -1) + Foo(i - 2);
}
}
{
public static void Main()
{
Console.WriteLine(Foo(30));
}
public static int Foo(int i)
{
if (i <= 0)
return 0;
else if(i > 0 && i <= 2)
return 1;
else return Foo(i -1) + Foo(i - 2);
}
}
10.
接口和抽象类有什么区别?你选择使用接口和抽象类的依据是什么?
接口中不定义任何与实现相关的内容。抽象类和接口都是一个抽象体,抽象类是对实体的抽象,接口则是对行为的抽象。
抽象类可以包含部分方法的实现,而接口不能有具体的实现,这是抽象类优于接口的一个主要地方。由于
C#
的单继承,每个类只能从一个抽象类继承,但是每个类可以实现多个接口
,
接口不能实例化
接口关键字
interface,
抽象类关键字
abstract
11. &和&&的区别。
&
是位运算符。
&&
是布尔逻辑运算符。
12.
GC
是什么
?
为什么要有
GC?
GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩,GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的。
程序员不用担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收集,可以调用下面的方法之一:
System.gc()
Runtime.getRuntime().gc()
System.gc()
Runtime.getRuntime().gc()
13. Math. round(11.5)
等於多少
? Math. round(-11.5)
等於多少
?
Math.round(11.5)返回(long)12,Math.round(-11.5)返回(long)-12;
14. short s1 = 1; s1 = s1 + 1;
有什么错
? short s1 = 1; s1 += 1;
有什么错
?
short s1 = 1; s1 = s1 + 1;有错,s1是short型,s1+1是int型,不能显式转化为short型。可修改为s1 =(short)(s1 + 1) 。short s1 = 1; s1 += 1正确。
15.
数组有没有
length()
这个方法
? String
有没有
length()
这个方法
?
数组没有
length()
这个方法,只有
length
属性,
String
有
length()
方法
16. Overload
和
Override
的区别。
Overloaded
的方法是否可以改变返回值的类型
?
方法的重写Overriding和重载Overloading是C#多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。
17.
接口是否可继承接口
?
抽象类是否可实现
(implements)
接口
?
抽象类是否可继承实体类
(concrete class)?
可以,可以,抽象类是否可继承实体类,前提是必须在实体类有明确的构造函数
…
18.
启动一个线程是用
run()
还是
start()
?
启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。
19.
构造器
Constructor
是否可被
override?
不是,构造器
Constructor
不能被继承,所以不能被
override
但可以被重载Overload
20.
编程题
:
用最有效率的方法算出
2
乘以
8
等於几
?
位运算2 << 3
21. swtich
是
否能作用在
byte
上,是否能作用在
long
上,是否能作用在
String
上
?
switch(expr1)中,expr1是一个整数表达式。因此传递给 switch 和 case 语句的参数应该是 int、 short、 char 或者 byte。long,string 都不能作用于swtich。
22.
编程题:产生一个
int
数组,长度为
100
,并向其中随机插入
1-100
,并且不能重复。
int[] iArray= new int[100];
Random random= new Random();
ArrayList arraylist= new ArrayList(100);
for(int i = 0; i < 100; i++)
{
arraylist.Add(i);
}
for(int i = 0; i < 100; i++)
{
int iKey= random.Next(0,99-i);
iArray[i] = Convert.ToInt32(arraylist[iKey]);
arraylist.RemoveAt(iKey);
}
Random random= new Random();
ArrayList arraylist= new ArrayList(100);
for(int i = 0; i < 100; i++)
{
arraylist.Add(i);
}
for(int i = 0; i < 100; i++)
{
int iKey= random.Next(0,99-i);
iArray[i] = Convert.ToInt32(arraylist[iKey]);
arraylist.RemoveAt(iKey);
}
23.
编程题:对上面生成的数组排序,需要支持升序、降序两种顺序
Array.Sort(iArray);//排序
Array.Reverse(iArray);// 反序
Array.Reverse(iArray);// 反序
24.
请说明
.net
中的错误处理机制,并举例
异常是从 Exception 类类继承的对象。异常从发生问题的代码区域引发,然后沿堆栈向上传递,直到应用程序处理它或程序终止。
try
{ //执行代码,不确定是否会出错 }
catch
{ //出错处理 }
finally
{ //无论怎样,都要执行 }
try
{ //执行代码,不确定是否会出错 }
catch
{ //出错处理 }
finally
{ //无论怎样,都要执行 }
25.
值类型与引用类型有什么区别?
基于值类型的变量直接包含值。将一个值类型变量赋给另一个值类型变量时,将复制包含的值。这与引用类型变量的赋值不同,引用类型变量的赋值只复制对对象的引用,而不复制对象本身。
所有的值类型均隐式派生自
System.ValueType
。
与引用类型不同,从值类型不可能派生出新的类型。但与引用类型相同的是,结构也可以实现接口。
与引用类型不同,值类型不可能包含
null
值。然而,可空类型功能允许将
null
赋给值类型。
每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值。
值类型主要由两类组成:结构、枚举
结构分为以下几类:
Numeric
(数值)类型、整型、浮点型、
decimal
、
bool
、用户定义的结构。
引用类型的变量又称为对象,可存储对实际数据的引用。声明引用类型的关键字:class、interface、delegate、内置引用类型: object、string
26.
怎样理解静态变量?
27. DataReader
与
Dataset
有什么区别?
DataReader
和
DataSet
最大的区别在于
,DataReader
使用时始终占用
SqlConnection,
在线操作数据库
..
任何对
SqlConnection
的操作都会引发
DataReader
的异常
..
因为
DataReader
每次只在内存中加载一条数据
,
所以占用的内存是很小的
..
因为
DataReader
的特殊性和高性能
.
所以
DataReader
是只进的
..
你读了第一条后就不能再去读取第一条了
..
DataSet 则是将数据一次性加载在内存中 . 抛弃数据库连接 .. 读取完毕即放弃数据库连接 .. 因为 DataSet 将数据全部加载在内存中 . 所以比较消耗内存 ... 但是确比 DataReader 要灵活 .. 可以动态的添加行 , 列 , 数据 . 对数据库进行回传更新操作 ...
DataSet 则是将数据一次性加载在内存中 . 抛弃数据库连接 .. 读取完毕即放弃数据库连接 .. 因为 DataSet 将数据全部加载在内存中 . 所以比较消耗内存 ... 但是确比 DataReader 要灵活 .. 可以动态的添加行 , 列 , 数据 . 对数据库进行回传更新操作 ...
28.
请编程实现一个冒泡排序算法?
int
[] array=new int[10]{5,6,4,8,3,1,7,9,2,10};
for
(int i=1;i<10;i++)
for(int j=1;j<10;j++)
if(array[j]<array[j-1])
{
int m=array[j-1];
array[j-1]=array[j];
array[j]=m;
}
29.
类成员有
_5_
种可访问形式?
30. public static const int A=1;
这段代码有错误么?是什么?
const
成员都是
static
所以应该去掉
static
31. float f=-123.567F;
int i=(int)f;
i
的值现在是
_-123_?
32 .
委托声明的关键字是
_delegate_?
33.
用
sealed
修饰的类有什么特点?
密封的,不能被继承,而
abstrack
是抽象类,不能被实例化
34.
在
.Net
托管代码中我们不用担心内存漏洞,这是因为有了
__GC_?
35.
下面的代码中有什么错误吗?
_______
using System;
class A
{
public virtual void F(){
Console.WriteLine("A.F");
}
}
abstract class B:A
{
public abstract override void F(); // new public abstract void F();
}
36.
下面这段代码有错误么?
switch (i){
case():
CaseZero();
break;
case 1:
CaseOne();
break;
case 2:
dufault; //wrong
CaseTwo();
break;
}
37.
谈谈类和结构的区别?
类是引用类型、结构是值类型
38.
在
c#
中
using
和
new
这两个关键字有什么意义,请写出你所知道的意义?
using 指令 和语句 new 创建实例 new 隐藏基类中方法
Using
引入一个名子空间,或在使用了一个对像后自动调用其
IDespose
,
New
实例化一个对
像,或修饰一个方法,表此方法完全重写此方法,
40.
下面这段代码输出什么?为什么?
int i=5;
int j=5;
if (Object.ReferenceEquals(i,j))
Console.WriteLine("Equal");
else
Console.WriteLine("Not Equal");
不相等,因为比较的是对象
41.
描述一下
C#
中索引器的实现过程,是否只能根据数字进行索引?
不是,
参数的数据类型可以是C#中的任何数据类型。C#根据不同的参数签名来进行索引器的多态辨析。但索引器的参数也只能是传值类型,不可以有ref(引用)和out(输出)修饰。
42.
执行下面代码后:
String strTemp ="abcdefg
某某某
"
;
Int i System.Text.Encoding.Default.GetBytes(strTemp).Length;
Int j = strTemp.Length;
问:i=(?)14 ;j=(? ) i=(14 ) ;j=(11 ) 中文两个字节
43. net
中读写数据库需要用到哪些类?他们的作用
共享类
DataSet
DataTable
DataRow
DataColumn
DataRelation
Constraint
DataColumnMapping
DataTableMapping
特定类
(x)Connection
(x)Command
(x)CommandBuilder
(x)DataAdapter
(x)DataReader
(x)Parameter
(x)Transaction
44.
进程和线程分别
?
怎么理解?
都是由操作系统所体会的程序运行的基本单元
,
系统利用该基本单元实现系统对应用的并发性。
简而言之
,
一个程序至少有一个进程
,
一个进程至少有一个线程
.
线程的划分尺度小于进程,使得多线程程序的并发性高。
另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出 口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。
进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动 , 进程是系统进行资源分配和调度的一个独立单位 . 线程是进程的一个实体 , 是 CPU 调度和分派的基本单位 , 它是比进程更小的能独立运行的基本单位 . 线程自己基本上不拥有系统资源 , 只拥有一点在运行中必不可少的资源 ( 如程序计数器 , 一组寄存器和栈 ), 但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源 .
一个线程可以创建和撤销另一个线程 ; 同一个进程中的多个线程之间可以并发执行 .
线程的划分尺度小于进程,使得多线程程序的并发性高。
另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出 口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。
进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动 , 进程是系统进行资源分配和调度的一个独立单位 . 线程是进程的一个实体 , 是 CPU 调度和分派的基本单位 , 它是比进程更小的能独立运行的基本单位 . 线程自己基本上不拥有系统资源 , 只拥有一点在运行中必不可少的资源 ( 如程序计数器 , 一组寄存器和栈 ), 但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源 .
一个线程可以创建和撤销另一个线程 ; 同一个进程中的多个线程之间可以并发执行 .
45.
如何理解
.net
中的垃圾回收机制。
指的是内存和各种变量或者目标所使用内存的释放和回收机制
垃圾回收器管理应用程序的内存分配和释放。每次您使用
new
运算符创建对象时,运行库都从托管堆为该对象分配内存。只要托管堆中有地址空间可用,运行库就会继续为新对象分配空间。但是,内存不是无限大的。最终,垃圾回收器必须执行回收以释放一些内存。垃圾回收器优化引擎根据正在进行的分配情况确定执行回收的最佳时间。当垃圾回收器执行回收时,它检查托管堆中不再被应用程序使用的对象并执行必要的操作来回收它们占用的内存。
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1482746