C#面试题(设计模式在后面)
2。 const和readonly有什么区别?
答:const可以用于类的成员常量和局部常量,必须在声明时赋值,之后不可以对常量进行赋值。而readonly只能用于类的成员变量不能用于局部变量,在声明时可以不赋值,除了在构造函数中可以再次赋值外,其它的地方和const一样也不能赋值.
5。 接口和抽象类有什么区别?你选择使用接口和抽象类的依据是什么?答
答:区别如下
(1) 抽象类可以有抽象成员(无具体实现),也可以有非抽象成员(有具体实现);接口只有抽象成员。
(2) 一个类不能同时继承多个抽象类,一个类可以同时实现多个接口.
如果多个子类中有很多代码是重复的,这时采用抽象类,因为可以将这些代码放到抽象类的非抽象方法中,这样可以达到代码复用.当实现多个接口时因为抽象类不支持,只能使用接口.
6. struct和class有什么区别
答:两者都可以有成员变量、属性、索引器、事件、函数、构造函数,主要区别如下:
区别点 结构 类
类型 值类型 引用类型
成员变量 在声明时不能赋值 可以赋值也可以不赋值
构造函数 可以不写,系统提供默认构造函数,默认构造函数中会将所有成员值设为0,如果写了构造函数则构造函数必须有参数,且在构造函数中必须为每一个成员赋值。 可以不写,系统提供默认构造函数,写了也没有结构中的限制.
析构函数 不能有析构函数 可以有析构函数
继承性 自定义的结构不能从类继承,但可以实现接口,结构都是密封(sealed),不能从结构继承 类没有限制
7。 try后面一个finally,try中有一个return,那么finally中的代码会不会运行?如果运行,是在return后还是return前。
答:会运行,并且在return 后运行。
8。 产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复。
答:该题解题思路有很多,主要是看运行效率如何,下面提供一种方法。
int[] array = new int[100];
int temp[] = new int[100];
for (int i = 0; i < 100; i++)
{
temp[i]=i+1;
}
Random rand = new Random();
for (int i = 0; i < 100; i++)
{
int index = rand。Next(100-i-1);
array[i] = temp[index];
temp[index]=temp[100—i-1];
}
9。 C#中要使一个类支持foreach遍历,实现过程怎样?
答:必须实现IEnumerable,IEnumerator这两个接口,如下:
public class MyList : IEnumerable,IEnumerator
{
private int position = -1;
string[] array = new string[4];
public MyList()
{
array[0] = ”a";
array[1] = "b";
array[2] = ”c";
array[3] = "d";
}
#region IEnumerable 成员
//每次使用foreach时都会调用它得到一个枚举器
public IEnumerator GetEnumerator()
{
Reset();
return (this as IEnumerator);
}
#endregion
#region IEnumerator 成员
//遍历时通过这个属性得到值
public object Current
{
get { return array[position]; }
}
//访问下一个元素时使用MoveNext移动位置
public bool MoveNext()
{
if (position < array。Length—1)
{
position++;
return true;
}
else
return false;
}
//遍历前要使位置归位
public void Reset()
{
position = -1;
}
#endregion
}
以下不用foreach遍历集合
MyList list=new MyList();
While(list。MoveNext())
{
Object o=list。Current;
}
10. 以下程序有什么错?
public class TestClass
{
private int count;
private static int y;
public static void setvalue ()
{
count=1;
y=1;
}
}
答:在静态函数中只能访问静态成员变量;以上代码访问了实例成员。
11. net中什么类不能被继承?
答:如果在类前加上sealed关键字,则表示该类为密封类,密封类不能被继承。
sealed 除了可以应用于类外,还可以应用于实例方法和属性。密封方法会重写基类中的方法,但其本身不能在任何派生类中进一步重写。当应用于方法或属性时,sealed 修饰符必须始终与override一起使用。如:
//下面这个sealed使用正确,表示该类不能继承
public sealed class Test
{
private int myVar;
//下面这个sealed错误,编译不会通过,因为sealed必须和override一起使用
public sealed int MyProperty
{
get { return myVar; }
set { myVar = value; }
}
//下面这个sealed使用正确,表示如果该类不是密封类,
//那么在派生类中也不可以重写该方法
public sealed override string ToString()
{
return base。ToString();
}
}
12。 is 和as 有什么区别?
答:is用来判断一个实例是否属于某个类。如:
Dog d=new Dog();
If(d is Dog)
{
Console.WriteLine(“d是一只狗”);
}
以上语句Console。WriteLine(“d是一只狗”);会运行,因为d is Dog返回true,如果Dog从Animal类继承并实现了IPet接口,则d is Animal和d is IPet都会返回true;
as用于在兼容的引用类型之间执行转换,如果转换失败则返回null,它等价于如下语句:
expression is type ? (type)expression : (type)null
13。 net中函数传递参数有那些方式?有什么区别?
答:传值和传引用,传引用又两种方式,ref和out,ref要求变量在传参前赋值,out可以不赋值.传引用必须是一个地址,传值是指将栈中的值拷贝到函数的参数,传引用表示传入的变量和接收参数是同一个变量
public class Test
{
public int myVar;
public int MyProperty
{
get { return myVar; }
set { myVar = value; }
}
}
以上这个类中有字段和属性
private void F(ref int i)
{
i = 100;
}
有一个方法传递引用,调用方式如下:
Test t = new Test();
F(ref t。 MyProperty);
以上代码编译不能通过,因为属性不是变量,其实质是函数,如下则可通过
Test t = new Test();
F(ref t. myVar);
因为字段是变量
14。 一列数的规则如下: 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 〈= 2)writeline用什么替代
return 1;
else
return Foo(i —1) + Foo(i — 2);
}
}
15. C#中的委托是什么?事件是不是一种委托?
答 :委托封装了函数指针的集合,它可以指向一组函数.
事件也是委托,是一种特殊的委托.
16. 请编程实现一个冒泡排序算法?
答:
int [] array = new int [*] ;
int temp = 0 ;
for (int i = 0 ; i < array.Length - 1 ; i++)
{
for (int j = i + 1 ; j 〈 array。Length ; j++)
{
if (array[j] 〈 array[i])
{
temp = array[i] ;
array[i] = array[j] ;
array[j] = temp ;
}
}
}
17. 在下面的例子里
using System;
class A
{
public A()
{
PrintFields();
}
public virtual void PrintFields(){}
}
class B:A
{
int x=1;
int y;
public B()
{
y=—1;
}
public override void PrintFields()
{
Console.WriteLine(”x={0},y={1}”,x,y);
}
}
当使用new B()创建B的实例时,产生什么输出?
答:X=1,Y=0
当使用New创建B的实例时,因为B继承了A类,A的构造函数首先会被运行,但应当注意的是,虽然运行的是A的构造函数,但在A的构造函数中调用的函数首先是在B类中查,因为PrintFields已被重写,所以最终运行B类中的PrintFields函数。
18. CTS、CLS、CLR分别作何解释?
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论