设为首页 加入收藏

TOP

新编C#面试题(一)
2014-11-24 01:37:50 来源: 作者: 【 】 浏览:50
Tags:新编 试题

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)


{


i

首页 上一页 1 2 3 4 5 6 下一页 尾页 1/6/6
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Interview questions for C# deve.. 下一篇C#面试常见问题

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: