1.简述 private、 protected、 public、 internal 修饰符的访问权限。
答:private 私有,成员只能由定义类型或者任何嵌套类型中的方法使用;
protected 受保护, 成员只能由定义类型、任何嵌套类型或者不管在什么程序集中的派生类型中的方法访问;
public 公有,成员可在任何程序集中的任何类型的任何方法访问;
internal 程序集内公有,成员可在程序集内的任何方法中访问。
2.一列数的规则如下: 1、1、2、3、5、8、13、21、34...... 求第30位数是多少,用递归算法实现。
答:
1 static Int32 GetRecursionValue(Int32 num) 2 { 3 if (num <= 0) 4 { 5 return 0; 6 } 7 else if (num > 0 && num <= 2) 8 { 9 return 1; 10 } 11 else 12 { 13 return GetRecursionValue(num - 1) + GetRecursionValue(num - 2); 14 } 15 }
3.C#中的委托是什么?事件是不是一种委托?
答: 委托是一种特殊的数据类型,它指向方法,可以看做是指向方法的指针,通过委托可以把方法作为参数来进行传递;
事件是一种特殊的委托。
4.override与重载的区别
答:override是重写,重写只存在与类和父类中,重写是实现对父类方法的重新实现;重载存在于一个类中,一般用于在一个类中实现若干重载的方法,这些方法的名称相同而参数形式不同。
5.请编程遍历页面上所有TextBox控件并给它赋值为string.Empty?
答:
1 foreach (var item in this.Controls) 2 { 3 if (item is TextBox) 4 { 5 (item as TextBox).Text = String.Empty; 6 } 7 }
6.请编程实现一个冒泡排序算法?
1 static void sort(Int32[] arrays) 2 { 3 Int32 temp = 0; 4 for (int i = 0; i < arrays.Length; i++) 5 { 6 for (int j = i+1; j < arrays.Length; j++) 7 { 8 if (arrays[j] > arrays[j + 1]) 9 { 10 temp = arrays[j]; 11 arrays[j] = arrays[j + 1]; 12 arrays[j + 1] = temp; 13 } 14 } 15 } 16 }
7.描述一下C#中索引器的实现过程,是否只能根据数字进行索引?
答:c#中的索引器是有参属性,属性的本质其实是方法;不是只能根据数字进行索引。
8.求以下表达式的值,写出您想到的一种或几种实现方法: 1-2+3-4+……+m
答:
1 static void Function(Int32 m) 2 { 3 Int32 sum = 0; 4 for (int i = 0; i < m; i++) 5 { 6 if (i % 2 == 0) 7 { 8 sum -= i; 9 } 10 else 11 { 12 sum += i; 13 } 14 } 15 }
9.在下面的例子里
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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;
解析:构造B的实例的时候会先调用其基类的构造函数,此时x=1,y为其默认初始值0。
10.什么叫应用程序域?
答:应用程序域即AppDomain,为了保证代码的键壮性CLR希望不同服务功能的代码之间相互隔离,这种隔离可以通过创建多个进程来实现,但操作系统中创建进程是即耗时又耗费资源的一件事,所以在CLR中引入了AppDomain的概念,AppDomain主要是用来实现同一进程中的各AppDomain之间的隔离.
11.CTS、CLS、CLR分别作何解释?
答:CTS Common type System 通用系统类型; CLS Common Language Specifcation 公共语言规范;CLR Common Language Runtime 公共语言运行时。
12.什么是装箱和拆箱?
答:值类型转换为引用类型称为装箱,引用类型转换为值类型称之为拆箱。
13.什么是受托管的代码?
答:受托管的代码是指运行在.NET公共语言运行时CLR的代码,unsafe标识非托管代码,不经过CLR运行,需要程序员自行分配和释放内存空间。
14.什么是强命名程序集?
答:弱命名和强命名的.net程序集在结构上是一致的,他们都有相同的(PE)格式(PE+)头,CLR头,metaData,maniftest和IL,其区别在于强命名的程序集有发布者的公钥和私钥对。对于弱命名的.net程序集他只能被一个程序调用,要想使程序集被多个程序共享使用或者是编写类库,必须对程序集进行强命名。对于一个强命名的程序集,CLR通过下面的信息来唯一的识别它:a.文件名但是不包括扩展名;b.版本号Version 如1.02.232.1;c.文化Cultrue如“en-us”;d.公钥的散列值,PublicKeyToken 如b03f5f7f11d50a3a。在弱命名的情况下,CLR会忽略程序集的版本号,只是当需要使用卫星程序集的时候使用文化信息,在发布程序的时候微软建议使用强命名的程序集,由于公钥私钥的存在,这样做可以有效避免同名同版本同文化的程序集的冲突。
15.在.net中,配件的意思是?
答:是指程序集。
16.在C#中,string str = null 与 string str = “” 请尽量使用文字或图象说明其中的区别。
答:str=null是指声明字符串str,但不给他分配内存空间,str=“”,是指声明字符串str,给它分配长度为""的内存空间。
17.请详述在.net中类(class)与结构(struct)的异同?
答:类是引用类型,可被实例化,其值分配在堆上,结构体是值类型,其值分配在栈上。
18.分析以下代码,完成填空
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
string strTmp = "abcdefg某某某"; int i= System.Text.Encoding.Default.GetBytes(strTmp).Length; int j= strTmp.Length;
以上代码执行完后,i= j=?
答: i=13,j=10
19.根据线程安全的相关知识,分析以下代码,当调用test方法时i>10时是否会引起死锁?并简要说明理由。
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
public void test(int i) { lock(this) { if (i>10) { i--; test(i); } } }
答:不会发生死锁,但有一点int是按值传递的,所以每次改变的都只是一个副本,因此不会出现死锁。但如果把int换做一个object,那么死锁会发生。
20.公司要求开发一个继承System.Windows.Forms.ListView类的组件,要求达到以下的特殊功能:点击ListView各列列头时,能按照点击列的每行值进行重排视图中的所有行 (排序的方式如DataGrid相似)。根据您的知识,请简要谈一下您的思路。
答:点击列头时获取该列的列ID,根据列ID将该列的所有行值重新排序重新绑定值。
21.面向对象语言的三大特性?
答:封装、继承、多态
22.能用foreach遍历访问的对象需要实现的接口和方法是?
答:实现IEnumerable接口,实现GetEnumerator方法.
23.什么是GC,为什么要有GC?
答:GC是垃圾回收器。它对托管堆上的内存进行管理,实现垃圾内存的回收,程序员不需要关心内存的管理与释放。
24.Sting s=new String("xyz");,创建了几个对象?
答;创建两个对象,一个是对象“xyz”,另一个是指向该对象的对象s.
25.abstract class和interface有什么区别?
答:abstract class是抽象类,本质上还是一个类,interface是接口,是用来实现的,用来规范约束实例的一些行为;
声明方法的存在而不去实现它的类被叫做抽象类,它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现类的情况,也不能实现抽象类的实例,然而可以创建一个变量,其类型是一个抽象类,并让它指向某一个具体的子类的一个实现。不能有抽象构造函数或者抽象的静态方法,抽象类的子类为他们父类中的所用方法提供实现,否则他们也是抽象类,取而代之,在子类中实现该方法,知道其行为的其他类可以在类中实现这些方法。
接口是抽象类的变体,在接口中,所用方法都是抽象的,多继承性可通过实现这样的几口而获得,接口中所有方法都是抽象的,没有一个程序体,接口只可以定义static final成员变量,接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时他定义所有这种接口的方法,然后他可以在实现了该接口的类的任何对象上调用该接口的方法。
26.启动一个线程使用Run()还是start()?
答:启用一个线程用Start()方法.
27.接口是否可以继承接口?抽象类是否可以实现接口?抽象类是否可以继承实体类?
答:接口可以继承接口,抽象类可以实现接口,抽象类可以继承实体类,但前提是实体类必须有明确的构造函数。
28.构造函数是否可以被override?
答:构造器不能被继承,所以不能被override,但是构造函数可以重载。
29.是否可以继承string类?
答:string 类是密封类,所以不可以被继承。
30.try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?
答:finally中的代码一定会被执行,在return之前执行。
31.两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
答:不对,如果两个对象值相等,那么它们的hascode一定也相等。
32.数组有没有length()这个方法? String有没有length()这个方法?
答:数组和String都没有length()这个方法,它们有Length属性。
33.sleep() 和 wait() 有什么区别?
答:sleep()方法是使线程停止一段时间的方法。在sleep 时间间隔期满后,线程不一定立即恢复执行。这是因为在那个时刻,其它线程可能正在运行而且没有被调度为放弃执行,除非(a)“醒来”的线程具有更高的优先级(b)正在运行的线程因为其它原因而阻塞。
wait()是线程交互时,如果线程对一个同步对象x 发出一个wait()调用,该线程会暂停执行,被调对象进入等待状态,直到被唤醒或等待时间到。
34.进程和线程的区别?
答:进程是系统进行资源分配和调度的单位,线程是CPU调度和分配的单位,一个进程可以有多个线程,这些线程共享这个进程的资源。
35.栈和堆的区别?
答:栈:由编译器自动分配、释放,在函数体中定义的变量即局部变量通常在栈上;堆:一般由程序员分配释放,new,malloc等内存分配函数分配得到的就是在堆上。
36.产生一个int数组,长度为100.,并向其中随机插入1-100,并且不能重复。
static Int32[] Function() { Int32[] result = new Int32 [100]; ArrayList mylist = new ArrayList(); Random random = new Random(); while (mylist.Count < 100) { Int32 num = random.Next(1,101); if (!mylist.Contains(num)) { mylist.Add(num); } } for (int i = 0; i < mylist.Count; i++) { result[i] = (Int32)mylist[i]; } return result; }
37.在c#中using和new这两个关键字有什么意义,请写出你所知道的意义?using 指令和语句 new 创建实例 new 隐藏基类中方法。
答:using可用作引入命名空间或使用非托管资源,使用完对象后自动执行实现了IDisposable接口的Dispose方法;
new 新建实例或者隐藏父类方法。
38.需要实现对一个字符串的处理,首先将该字符串首尾的空格去掉,如果字符串中间还有连续空格的话,仅保留一个空格,即允许字符串中间有多个空格,但连续的空格数不可超过一个。
答:
static String DealStringFun(String sourceStr) { String result = sourceStr; result = sourceStr.Trim(); result=Regex.Replace(result," *"," "); return result; }
39.下面这段代码输出什么?为什么?
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
int i=5; int j=5; if (Object.ReferenceEquals(i,j)) Console.WriteLine("Equal"); else Console.WriteLine("Not Equal");
答:输出Not Equal,因为比较的是两个对象,该算法存在装箱。
40.什么是反射?
答:动态获取程序集信息。
41.什么是虚函数,什么是抽象函数?
答:虚函数:没有实现的,可由子类继承并重写的函数。抽象函数:规定其非虚子类必须实现的函数,必须重写。
42.c#中property和attribute的区别?
答:一个数属性,用于存取类的字段,一个是特性,用来标识类、方法等得附加性质。
43.c#中的三元运算符?
答:?:
44.当整数a赋值给一个object对象时,整数a将会被?
答:值类型转换为引用类型,装箱。
45.类成员的访问形式?
答:类内部访问,通过this指针访问,类外部访问,通过类实例来访问。
46.float f=-123.567F; int i=(int)f;i的值现在是?
答:-123.
47.委托声明的关键字是?
答:delegate
48.用sealed修饰的类有什么特点?
答:是密封类,不能被继承。
49.在Asp.net中所有的自定义用户控件都必须继承自?
答:control;
50.在.Net中所有可序列化的类都被标记为?
答:[serializable]
51.在.net托管代码中我们不用担心内存泄漏,这是因为有了?
答:GC垃圾回收器。
52.net错误处理机制是什么?
答:.net错误处理机制采用try-catch-finally结构,发生错误时,层层上抛,直到找到匹配的catch为止。
53.&与&&的区别。
答:&是位运算,标识按位与,&&是逻辑运算符,标识逻辑与。
54.Error和Exception有什么区别?
答:error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。