C# 面试题及答案
- 分析以下代码
1 string str = "abc123中文汉字"; 2 3 int i = System.Text.Encoding.Default.GetBytes(str).Length; 4 5 int j = str.Length; 6 7 Console.WriteLine(i); 8 9 Console.WriteLine(j);
答案:i=14;i=10;
2.请输出B.test()的输出结果
1 class A 2 { 3 int i = 1; 4 public virtual void M1() 5 { 6 Console.WriteLine(" i am A "); 7 } 8 public void M2() 9 { 10 Console.WriteLine(" i ={0} ",i); 11 } 12 } 13 14 class B:A 15 { 16 int i = 2; 17 public override void M1() 18 { 19 Console.WriteLine(" i am B "); 20 } 21 public new void M2() 22 { 23 Console.WriteLine(" i ={0} ", i); 24 } 25 } 26 27 static void Main(string[] args) 28 29 { 30 31 B b = new B(); 32 A a = b; 33 a.M1(); 34 b.M1(); 35 a.M2(); 36 b.M2(); 37 38 }
答案: i am B;
i am B;
1;
2;
3.有序集合seqList{1,1,2,3,5,8,13,21,34.........}请查找集合中第一个大于2147483647的数。
答案:此函数是有名的斐波那契数。实现此函数的方法为
1 //递归写法 2 public int foo(int n) 3 { 4 if(n<2) return 1; 5 else return foo(n-2)+foo(n-1) 6 } 7 8 //循环写法 9 public int[] foo2(int n) 10 { 11 if(n==1) return new int{1}; 12 else if(n==2) return new int{1,1}; 13 else 14 { 15 int rel[]=new rel[n]; 16 rel[0]=1; 17 rel[1]=1; 18 for(int i=2;i<n;i++) 19 { 20 rel[i]=rel[i-2]+rel[i-1]; 21 } 22 } 23 }
查找大于2147483647的数用二分法查找。
private static int FibonacciSearch(int[] array, int key) { int length = array.Length; int low = 0, high = length - 1, mid, k = 0; mid=(low+high )/2 while(mid<high) { if(array[mid]==key){return mid;break;} else if(array[mid]>key){high=mid;mid=(low+high )/2;} else if(array[mid]<key){low=mid;mid=(low+high )/2;} } }
4.简述以下词在C#语言中的作用
volatile:(创建单例模式时会使用,懒汉模式)就像大家更熟悉的const一样,volatile是一个类型修饰符(type specifier)。它是被设计用来修饰被不同线程访问和修改的变量。如果不加入volatile,基本上会导致这样的结果:要么无法编写多线程程序,要么编译器失去大量优化的机会。作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值.,简单地说就是防止编译器对代码进行优化.比如如下程序:
1
2
3
4
|
XBYTE[2]=0x55; XBYTE[2]=0x56; XBYTE[2]=0x57; XBYTE[2]=0x58; |
1 //第一种 2 <input id="tea_Name" name="tea.Name" type="text" value="马老师"/> 3 //第二种 4 @Html.TextBox("tea.Name",Model.tea.Name) 5 //第三种 6 @Html.TextBoxFor(m=>m.tea.Name) 7 //第四种 8 @Html.TextEditorFor(m=>m.tea.Name)
6.用一条SQL语句 查询出每门功课都大于80分的学生姓名,表结构如下
姓名 | 课程 | 分数 |
张三 | 语文 | 81 |
张三 | 数学 | 75 |
张三 | 英语 | 82 |
李四 | 语文 | 76 |
李四 | 数学 | 90 |
李四 | 英语 | 82 |
王五 | 语文 | 81 |
王五 | 数学 | 100 |
王五 | 英语 | 92 |
答案一:select 姓名 from 表 where 姓名 not in (select 姓名 from 表 where 分数<=80)
答案二(推荐):select 姓名 from 表 group by 姓名 having min(分数)>80
7.简述Vue中methods、computed以及watch的用法及区别。
1#computed:计算属性将被混入到 Vue 实例中。所有 getter 和 setter 的 this 上下文自动地绑定为 Vue 实例。
2#methods:methods 将被混入到 Vue 实例中。可以直接通过 VM 实例访问这些方法,或者在指令表达式中使用。方法中的 this 自动绑定为 Vue 实例。
3#watch:是一种更通用的方式来观察和响应 Vue 实例上的数据变动。一个对象,键是需要观察的表达式,值是对应回调函数。值也可以是方法名,或者包含选项的对象。Vue 实例将会在实例化时调用 $watch(),遍历 watch 对象的每一个属性。
官方API地址:https://cn.vuejs.org/v2/api/#computed
个人博客:https://blog.csdn.net/smartdt/article/details/75557369
8.现有一个业务系统有4万用户,所有用户每天产生6千万数据,系统要求快速查询60天数据,请给出你的实现方案。
9.描述你曾经或者正在使用的大型项目解决方案。
10.何时必须声明一个类为抽象类?
答案:当这个类中包含抽象方法时,或是该类并没有完全实现父类的抽象方法时。
11.MVC框架中,ActionResult,JsonResult,ContentResult哪个可以return view()?
答案:ActionResult。
12.Aspx页面中,updatepanel的作用是什么?
答案:UpdatePanel控制页面的局部更新。(局部更新控件)、
13.MVC框架中,当使用Get方法访问JsonResult时,能否直接采用以下写法:return json(obj).为什么?
答案:不能,要使用 res.JsonRequestBehavior = JsonRequestBehavior.AllowGet;//允许使用GET方式获取,否则用GET获取是会报错。
14.可以采用foreach迭代的类的对象必须满足什么条件?
答案:需要实现IEnumerable接口或声明GetEnumerator方法的类型。注:不一定要实现IEnumerable接口,但一定要实现GetEnumrator方法。
15.在dotnet环境下,如何把数据库数据转换为XML格式输出?
将数据库的内容读取到dataTable或dataSet中,dataTable或dataSet转为xml。
private string ConvertDataTableToXML(DataTable xmlDS) //DataTable可改用dataset { MemoryStream stream = null; XmlTextWriter writer = null; try { stream = new MemoryStream(); writer = new XmlTextWriter(stream, Encoding.Default); xmlDS.WriteXml(writer); int count = (int)stream.Length; byte[] arr = new byte[count]; stream.Seek(0, SeekOrigin.Begin); stream.Read(arr, 0, count); UTF8Encoding utf = new UTF8Encoding(); return utf.GetString(arr).Trim(); } catch { return String.Empty; } finally { if (writer != null) writer.Close(); } }
16.Html页面上,有如下代码<input type="button" name ="btndel" onclick="Del()"/>.现在要求用户点击删除后,弹出删除确认的对话框,并在点击确定后弹出对话框“”“删除完毕”,用JS如何实现。
答案:
1 function Del() 2 { 3 if(confirm("确定删除")) 4 alert("删除成功") 5 }
17.请写出一个json的例子。
答案:[{"id":"123","name":"huawei"}]
18.List<Domain1> Alist 中有100个Domain1元素,且每个Domain1元素都有属性string typStr,现在需要取出AList中所有typeStr="Atype"的元素,并组成新的List,该如何实现。
答案:
1 List<string> BList=new List<string>(); 2 foreach(var a in AList) 3 { 4 if(a.typeStr=="Atype") 5 Blist.add(a.typeStr); 6 }
19.EF框架中,使用DBFirst时数据库中的表A没有主键,能否通过“从数据库更新模型“操作,将表A导入到EF框架中。
答案:不能,表必须要有主键,否则会报错。
savechange()方法返回0,而不是正常的大于0的书。切记设置主键。
返回错误InnerException = {"无法更新 EntitySet“t_Customer”,因为它有一个 DefiningQuery,而 <ModificationFunctionMapping> 元素中没有支持当前操作的 <InsertFunction> 元素。"}。
在发现错误后要吧原有的数据库的表删除,重新更新。如果不删除的话,无法更新,并且要重新生成解决方案。
20.foreach和for循环谁的效率高?switch和if呢?
答案:foreach高,for 循环每次都要进行判断i的大小,foreach 依赖 IEnumerable.第一次 var a in GetList() 时 调用 GetEnumerator 返回第一个对象 并 赋给a,以后每次再执 行 var a in GetList() 的时候 调用 MoveNext.直到循环结束。期间GetList()方法只执行一次.
同样的道理:当有多个判断时,switch更快。
21.WebService基于什么协议?
答案:soap协议,而Soap建立在http上的。
22.WebService和WebAPI 有什么不同。
1、webservice是基于SOAP协议的,数据格式是XML,webapi遵循的http协议,它的Response可以被而Web API的MediaTypeFormatter转换成Json、XML 或者任何你想转换的格式。
2、webservice它只能部署在IIS上,而webapi可以寄宿在不同的宿主上(寄宿的本质就是利用一个具体的应用程序为Web Api提供一个运行的环境,并解决请求的接收和响应的回复),如Web Host,Self Host方式
3、webservice 也可以通过ajax访问。
4、webapi无状态,相对webservice更轻量级。webapi支持如get,post等http操作,并且对限制带宽的设备,比如智能手机等支持的很好。
这样对比的话webservice貌似并不好用。但是我们为什么要用它呢,理由如下:
1、很好的跨编程语言和跨操作系统
2、可移植性:传统的WebService只是利用了HTTP通道,进行独立的交互,但是这个交互协议可以移植到其他协议下运作
23.C#是否支持多重继承?
答案:不支持。多重继承指的是一个类可以同时继承多个类,比如A类继承自B类和C类,这就是多重继承。C#只能继承一个类,但是可以继承多个接口。
24.修饰符protected internal 的意思?
internal修饰的b在同一个项目中哪里都可以访问,而在另外一个项目中就不能访问,说明“同一程序集”指的是同一个项目;对于protected internal修饰的a在同一项目中哪里都可以访问,而在其它项目中只有在派生类可以访问,所以protected internal 修饰的成员变量是同一程序集或者派生类可以访问,也就是protected跟internal的并集,而不是交集。(被protected internal修饰的属性/方法只能在它的在同一个程序集(Assembly)中的子类被访问)查资料找到了两种说法,不知道哪种是对的,个人以为是第一种是对的。
25.bs架构下,可否声明一个静态的数据库连接对象,所有的业务类都引用该静态连接对象去访问数据库?
答案:一个静态的Sqlconnection来管理项目内所有的数据库连接在绝大部分场景是不合理的
(没说绝对不可行,在winform单线程项目中,这样做是没有问题的,因为操作者是一个用户,每个用户都有一份程序副本)
如果是多个用户提交的请求是
同一个AppDomain中的函数,方法(这种说话不严谨,不过我暂时找不到更好的表达方式)
来处理时.都是用同一个静态的Sqlconnection对象是不行的.
会引起并发问题,会引起相互干扰.还需要加锁lock才能操作.
26.C#提供了一个默认的无参数构造函数,当我实现了另外一个有一个参数的构造函数的时候,还想保留这个无参数的构造函数。这样我应该写几个构造函数?
答案:两个。
27.能够阻止某一个类被其他类继承么?能够实现允许某个类被继承,但不允许其中某个方法被覆写吗?
答案:(1)当对一个类应用 sealed 修饰符时,此修饰符会阻止其他类从该类继承,(2)可以,标记这个类为public,并标记这个方法为sealed.
28.什么是强类型?C#是强类型吗,JS呢?
答案:强类型指的是程序中表达的任何对象所从属的类型都必须能在编译时刻确定。常见的强类型语言有C++、Java、Apex和Python等,C#是强类型,JS不是。
29.金额等精确的数值声明为什么类型?
答案:float,double,decimal
30.读写数据库都需要哪些对象,简要说明其作用。
答案1、 Connection:与数据源建立连接。
2、 Command:对数据源执行SQL命令并返回结果。
3、 DataReader:读取数据源的数据,只允许对将数据源以只读、顺向的方式查看其中所存储的数据。其常用于检索大量数据,DataReader对象还是一种非常节省资源的数据对象。
4、 DataAdapter:对数据源执行操作并返回结果,在DataSet与数据源之间建立通信,将数据源中的数据写入DataSet中,或根据DataSet中的数据绑定数据源。
5、 DataSet:内存中的数据库,是数据表的集合,它可以包含任意多个数据表。
31.通过程序控制GC的强制回收是否可以提高效率?
答案:个人以为是可以的(在网上没找到答案),GC是循环遍历所有资源的,如果你已经强制回收了,那么遍历的就会少,从而提高效率。
32.int?和int的区别。
答案:int?为可空类型,可以是null,他是通过把int装箱为引用类型实现的。
33.求数列(1,1,2,3,5,8,13。。。。)的和。
答案:见第三题的循环写法,定义一个变量为sum,sum+=arr[I]
34.BS架构下,在session中存储了一个datatable的对象y,y在什么时候会被GC回收?这种存储数据的方式是否合理?如果Application增加了对y的引用,什么时候会被GC回收?
答案:在session的生命周期结束之后回收,不合理,每个session储存在服务器端的内存里,每个用户都会有一个独立的session,如果session的内容过于复杂,当大量的用户访问的时候会导致内存溢出。Application是所有用户共有的,所以应该不会被回收(个人理解)。
35.string和stringbuilder的区别。
答案:System.String是不可变的字符串。System.StringBuilder存放了一个可变的字符串,并提供一些对这个字符串修改的方法
36.举例写一个单例模式
1 public class Singleton 2 { 3 private static Singleton _Singleton = null; 4 private static object Singleton_Lock = new object(); 5 public static Singleton CreateInstance() 6 { 7 if (_Singleton == null) //双if +lock 8 { 9 lock (Singleton_Lock) 10 { 11 Console.WriteLine("路过。"); 12 if (_Singleton == null) 13 { 14 Console.WriteLine("被创建。"); 15 _Singleton = new Singleton(); 16 } 17 } 18 } 19 return _Singleton; 20 } 21 }
37.描述一下virtual、sealed、override和abstract的区别。
答案:
virtual申明虚方法的关键字,说明该方法可以被重写
sealed说明该类不可被继承
override重写基类的方法
abstract申明抽象类和抽象方法的关键字,抽象方法不提供实现,由子类实现,抽象类不可实例化。
38.List<int> listNumber,其中存储了从1到100的数字,现需要将ListNumber按照形如“1,2,3,4.。。”输出,请写出相应的代码。
1 foreach(var a in listNumber.sort()) 2 { 3 Console.WriteLine(a); 4 }
39.int,string,hashtable,datetime,datatable中哪些是引用类型?
答案:string,hashtable,datatable
40.一棵二叉查找树(Binary Seach Tree)具有以下特点,树中的任一节点,如果左子树不为空,则左子树的所有节点的值都小于该节点的值,如果右子树不为空,那么右子树所有节点的值都大于该节点的值;任一个节点的左右子树都是二叉查找树,示意图如下
假设二叉查找树的节点定义如下:
1 Class BSTreeNode{ 2 int value; 3 BSTreeNode leftChild; 4 BSTreeNode rightChild; 5 }
要实现一个方法printRang:按从小到大的顺序输出范围在【min,max】之间的所有值。请写出你认为最高效的代码。
1 void printRang(BSTreeNode btsnode,int min,int max) 2 { 3 //中序遍历,大于min的输出,小于max的不输出 5 //循环这里使用栈辅助进行遍历 6 System.Collections.Generic.Stack<Tree> stack = new System.Collections.Generic.Stack<Tree>(); 7 while(btsnode != null || stack.Any()) 8 { 9 if(btsnode.value>max)break; 10 else if (btsnode != null) 11 { 12 stack.Push(btsnode); 13 btsnode = btsnode.Left; 14 } 15 else 16 { 17 var item = stack.Pop(); 18 if(item.Value>=min&&item.Value<=max) 19 Console.WriteLine(item.Value); 20 btsnode = item.Right; 21 } 23 } 24 }
41.请写出一段在多线程运行时有可能产生死锁(不需要一定产生)的代码。
1 int string a="aaaa",b="bbbb"; 2 public void Seta(){ 3 lock(b) 4 { 5 a="bbbb"; 6 } 7 } 8 public void Setb(){ 9 lock(a) 10 { 11 b="aaaa"; 12 } 13 } 14 15 Thread t = new Thread(Seta); 16 Thread.Sleep(5000); 17 t.Start(); 18 Thread t2 = new Thread(Setb); 19 Thread.Sleep(5000); 20 t2.Start();
42.假设你的编程语言提供这样的异步机制,把一个任务放在一个线程池中执行,当前线程继续执行,直到调用这个任务取返回值的方法时才阻塞并等待任务完成拿到返回值。
现在有这样一个场景,收到一个客户端的订单请求要检查商品的库存能否满足,查询该客户按照当前的价格策略能否享受订单的折扣才能接受订单,而这两个检查都是非常耗时的操作。原来的代码是这样的:
1 public booleanprocessOrder(Order order) 2 { 3 if(!checkCustomerprice(order)) 4 return false; 5 if(!checkInventory(order)) 6 return false; 7 //订单逻辑代码不需要关注 8 return true; 9 }
请用上述的异步机制改写这段代码,减小这个方法的响应延迟。
1 //这里使用task 2 Task<bool> task = new Task<bool>(() => checkCustomerprice()); 3 task.Start(); 4 bool result = task.Result; 5 6 Task<bool> task2 = new Task<bool>(() => checkInventory()); 7 task2.Start(); 8 bool result2 = task2.Result; 9 10 if(result&&result2) 11 return true; 12 else 13 return false; 14 15 //自己研究写的,不知道对不对,仅供参考
43.简述private,protected,public,internal修饰符的访问权限。
public(公共的) 完全公开,访问不受限制。
protected(保护的) 访问仅限于包含类或从包含类派生的类型。该类内部和继承类中可以访问。
internal(内部的) 访问仅限于当前程序集。在同一命名空间内可以访问。
protected internal(内部保护的) 访问仅限于从包含类派生的当前程序集或类型(待确定)。
private(私有的) 访问仅限于包含类型。在类的内部才可以访问
44.ado.net的五个主要对象。答案见第30题。
45.列举asp.net页面之间传值的几种方式。
答案:
Request.Form["SourceData2"].ToString();
Request.QueryString["parameter1"].ToString();
Context.Items["value"].ToString();还有cookie,session,application
46.C#中委托是什么?事件是不是一种委托?事件和委托的关系。
答案:委托是指向事件的一种函数指针,把事件转换为了一种引用类型的变量,可以让其他函数调用。(纯纯的个人理解,网上有不同答案,我也不知道哪个是对的,建议找出版的资料。)
47.override(重写)与重载overload的区别。
答案:override是重写(覆盖)了一个方法,以实现不同的功能。一般是用于子类在继承父类时,重写(重新实现)父类中的方法,
重载,一般是用于在一个类内实现若干重载的方法,这些方法的名称相同而参数形式不同。
48.MVC模式。(我并没有完全GET到这个考点)
答案:MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式。这种模式用于应用程序的分层开发。
49.什么是装箱和拆箱?
答案:值类型转换为引用类型是装箱,引用类型装换为值类型是拆箱。
50.什么叫应用程序域AppDomain。
答案: "域",就是范围,环境,边界的意思,那么什么是应用程序域,官方给出的是这样的解释:操作系统和运行库环境通常会
在应用程序间提供某种形式的隔离.
应用程序域为安全性、可靠性、版本控制以及卸载程序集提供了隔离边界。应用程序域通常由运行库宿主创建,
运行库宿主负责在运行应用程序之前引导公共语言运行库。
应用程序域本质上就就是一种隔离,目的也就是使应用程序中运行的代码不能直接访问其他应用程序中的代码或资
源如果你需要访问其他应用程序中的对象时你就可以复制这些对象,或通过代理访问这些对象.
51.堆和栈的区别。
答案:heap:是由malloc之类函数分配的空间所在地。地址是由低向高增长的,引用类型储存在这。
stack:是自动分配变量,以及函数调用的时候所使用的一些空间。地址是由高向低减少的,值类型存储在这。
52.GC是什么,为什么要有GC?
答案;垃圾回收器,如果没有GC,那么一个系统随着运行时间的增长,占用内存会越来越大,如果我们没有主动释放的话。
53。值类型和引用类型的区别。
答案:
1. 值类型的数据存储在内存的栈中;引用类型的数据存储在内存的堆中,而内存单元中只存放堆中对象的
地址。
2. 值类型存取速度快,引用类型存取速度慢。
3. 值类型表示实际数据,引用类型表示指向存储在内存堆中的数据的指针或引用
4. 值类型继承自System.ValueType,引用类型继承自System.Object
5. 栈的内存分配是自动释放;而堆在.NET中会有GC来释放
6. 值类型的变量直接存放实际的数据,而引用类型的变量存放的则是数据的地址,即对象的引用。
7. 值类型变量直接把变量的值保存在堆栈中,引用类型的变量把实际数据的地址保存在堆栈中,而实际数据则保存在堆中。
54.C#中的接口和类有什么异同。
不同点:
不能直接实例化接口。
接口不包含方法的实现。
接口可以多继承,类只能单继承。
类定义可以在不同的源文件之间进行拆分。
相同点:
接口、类和结构都可以从多个接口继承。
接口类似于抽象基类:继承接口的任何非抽象类型都必须实现接口的所有成员。
接口和类都可以包含事件、索引器、属性。
54.try{}里有一个return语句,那么紧跟在这个try后面的finally{}里的code会不会被执行。什么时候执行?
答案;会,在return 之前执行。
55.描述线程与进程的区别。
1.进程有自己独立的地址空间;而线程共享进程的地址空间;
2.一个程序至少有一个进程,一个进程至少有一个线程;
3.线程是处理器调度的基本单位,但进程不是;
4.二者均可并发执行
56.什么是反射?
答案:动态获取程序集信息,动态获取类的属性和方法。
57.什么是匿名方法?请写一段代码。
delegate(int i) { return i > 0; }
58.写出几种工作流产品或框架,并简要的对比他们的差异。
59.写出你所了解的设计模式,说一说使用设计模式带来的好处,并尝试用代码写出一个例子。
60.接受一个数组,找出两个数的索引,这两个数组相加之和等于指定的数字。找出一组即可,同一元素不可使用两次。
比如:nums=[2,7,11,15],目标数字是9,因为nums【0】+nums【1】=9,所以返回【0,1】
答案:最简单的方法是使用两个for循环,此种方法不给出代码了,下面是第二种算法,需要先进行排序,排序算法略。
1 int[] getindex(int n) 2 { 3 int i=0,j=nums.length-1 4 while(i<j) 5 { 6 if(nums[i]+nums[j]==n)break; 7 else if(nums[i]+nums[j]>n)j--; 8 else i++; 9 } 10 int[] a=new int[]{i,j} 11 return a; 12 }
61.
SELECT * FROM 表 /*数据源*/ AS P PIVOT ( SUM(Amount/*行转列后 列的值*/) FOR p.Month/*需要行转列的列*/ IN (1,2,3,4/*列的值*/) ) AS T
附注:列转行语句。测试语句
1 CREATE TABLE ProgrectDetail 2 ( 3 ProgrectName NVARCHAR(20), --工程名称 4 OverseaSupply INT, --海外供应商供给数量 5 NativeSupply INT, --国内供应商供给数量 6 SouthSupply INT, --南方供应商供给数量 7 NorthSupply INT --北方供应商供给数量 8 ) 9 10 INSERT INTO ProgrectDetail 11 SELECT 'A', 100, 200, 50, 50 12 UNION ALL 13 SELECT 'B', 200, 300, 150, 150 14 UNION ALL 15 SELECT 'C', 159, 400, 20, 320 16 UNION ALL
1 SELECT P.ProgrectName,P.Supplier,P.SupplyNum 2 FROM 3 ( 4 SELECT ProgrectName, OverseaSupply, NativeSupply, 5 SouthSupply, NorthSupply 6 FROM ProgrectDetail 7 )T 8 UNPIVOT 9 ( 10 SupplyNum FOR Supplier IN 11 (OverseaSupply, NativeSupply, SouthSupply, NorthSupply ) 12 ) P
执行结果:
62.描述new有两种用法
第一种:new Class():创建对象
第二种:覆盖方法
public new XXXX(){}
63.传入某个属性的set方法的隐含参数的名称是什么?
value,它的类型和属性所声名的类型相同。
64.下面的代码中有什么错误吗?_______
1 using System; 2 class A 3 { 4 public virtual void F(){ 5 Console.WriteLine("A.F"); 6 } 7 } 8 abstract class B:A 9 { 10 public abstract override void F(); 11 12 //答:abstract override 是不可以一起修饰. 13 } // new public abstract void F();
65.net的错误处理机制是什么?
答:.net错误处理机制采用try->catch->finally结构,发生错误时,层层上抛,直到找到匹配的Catch为止。
66.如何在C#中实现继承?也就是继承的格式
在类名后加上一个冒号,再加上基类的名称。
67.描述一下C#中索引器的实现过程,是否只能根据数字进行索引?
答:不是。可以用任意类型.https://www.cnblogs.com/yaoxiaodan/p/5295132.html
68.私有成员会被继承么?
会,但是不能被访问。所以看上去他们似乎是不能被继承的,但实际上确实被继承了.
69.C#中所有对象共同的基类是什么?
System.Object
70.在方法定义中,virtual有什么含意?
被virtual修饰的方法可以被子类覆写.
71.能够将非静态的方法覆写成静态方法么?
不能,覆写方法的签名必须与被覆写方法的签名保持一致,除了将virtual改为override
72.可以覆写私有的虚方法么?
不可以,甚至子类中无法访问父类中的私有方法
73.什么是抽象类(abstract class)?
一种不可以被实例化的类。抽象类中一般含有抽象方法,当然也可有具体实现。继承类只有实现过所有抽象类的抽象方法后才能被实例化.
74.接口(interface)是什么?
只含有公有抽象方法(public abstract method)的类。这些方法必须在子类中被实现.
75.接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)?
答:接口可以继承接口。抽象类可以实现(implements)接口,抽象类是否可继承实体类,但前提是实体类必须有明确的构造函数。
76.构造器Constructor是否可被override?
答:构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Overloading。
77.是否可以继承String类?
答:String类是final类故不可以继承.
78.数组有没有length()这个方法? String有没有length()这个方法?
答:数组没有length()这个方法,有length的属性。String有length()这个方法(查网上资料说有个方法,但个人实验了一下是没有的,只有Length属性).
79.成员变量和成员函数前加static的作用?
答:它们被称为常成员变量和常成员函数,又称为类成员变量和类成员函数。分别用来反映类的状态。比如类成员变量可以用来统计类实例的数量,类成员函数负责这种统计的动作。
80.在c#中using和new这两个关键字有什么意义,请写出你所知道的意义?using 指令 和语句 new 创建实例 new 隐藏基类中方法。
答:using 引入名称空间或者使用非托管资源
new 新建实例或者隐藏父类方法
81.什么是虚函数?什么是抽象函数?
答:虚函数:没有实现的,可由子类继承并重写的函数。抽象函数:规定其非虚子类必须实现的函数,必须被重写。
82.c#中的三元运算符是?
答:?:
83.public static const int A=1;这段代码有错误么?是什么?
答:const不能用static修饰。
84.Ref参数是引用调用,out参数是输入调用。
85.const和readonly有什么区别?
const可以用于局部常量,而readonly实际是类的initonly字段,显然不能是局部的,const是编译时常量,readonly是运行时常量。
86.虚函数的用法:
答:1)virtual指明一成员函数为虚函数,而virtual仅用于类的定义里,在类外可不加此关键字.
2)一个类的成员函数被定义为虚函数时,子类该函数仍保持虚函数特征.
3)子类覆盖此函数时,定义里可不加virtual关键字,但函数声明要和基类的完全一致!且此声明是必须的.
4)不是纯虚函数时,父类的虚函数必须要实现; 而若将父类的虚函数设定为纯虚函数时,子类必需要覆盖之而且必须要实现之!
87.解释virtual、sealed、override和abstract的区别
virtual申明虚方法的关键字,说明该方法可以被重写
sealed说明该类不可被继承
override重写基类的方法
abstract申明抽象类和抽象方法的关键字,抽象方法不提供实现,由子类实现,抽象类不可实例化。
88.对象和类的区别是什么?
答:“类”(Class)具有相同属性和方法的一组对象的集合. 类是抽象的概念,仅仅是模板
对象是一个你能够看得到、摸得着的具体实体。
89.什么是局部变量,什么是成员变量?
答:局部变量是指一个方法中定义的变量;成员变量是指在类范围里定义的变量,也就是之前讲过的属性。
90.静态成员和实例成员的区别?
答:使用static修饰的成员称为静态成员,使用实例对象调用的成员称为实例成员
91.概述序列化
答: 序列化是将对象的状态存储到特定存储介质中的过程。
反序列化则是从特定存储介质中的数据重新构建对象的过程
92.对象能否调用静态方法 ?
答:不能。对于类内部定义的静态变量及静态方法,该类的对象均不能调用。
93为什么不能指定接口中方法的修饰符?
答:接口中的方法用来定义对象之间通信的契约,指定接口中的方法为私有或保护没有意义。他们默认为公有方法。
94.请详述在.net中类(class)与结构(struct)的异同:
答:Class可以被实例化,属于引用类型,是分配在内存的堆上的,Struct属于值类型,是分配在内存的栈上的
95.接口和抽象类具有什么区别?
答:含有abstract修饰符的class即为抽象类,abstract 类不能创建的实例对象。含有abstract方法的类必须定义为abstract class,abstract class类中的方法不必是抽象的。abstract class类中定义抽象方法必须在具体子类中实现,所以,不能有抽象构造方法或抽象静态方法。如果的子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为abstract类型。
接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。接口中的方法定义默认为public abstract类型
下面比较一下两者的语法区别:
1. 抽象类可以有构造方法,接口中不能有构造方法。
2. 抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。
3. 抽象类中抽象方法可以指定为public,接口中抽象方法不能指定任何修饰符,默认就是public
4. 一个类可以实现多个接口,但只能继承一个抽象类。
96.base关键字的作用是什么?
答:子类继承父类的过程中,可能需要在子类中调用父类中的成员,如属性、方法或者构造方法。这个时候,可以使用base关键字来完成。base的作用是用于引用父类的成员,如属性、方法或者是构造方法
97.什么是抽象类?
答:抽象类不能创建实例,它只能作为父类被继承。抽象类是从多个具体类中抽象出来的父类,它具有更高层次的抽象。从多个具有相同特征的类中抽象出一个抽象类,以这个抽象类作为其子类的模板,从而避免了子类的随意性。
98.接口和抽象类两者在应用上的区别:
答:接口更多的是在系统架构设计方法发挥作用,主要用于定义模块之间的通信契约。而抽象类在代码实现方面发挥作用,可以实现代码的重用
99.面向对象的特征有哪些方面?
答:面向对象的编程语言有封装、继承 、抽象、多态等4个主要的特征。
封装:
封装的目标就是要实现软件部件的“高内聚、低耦合”,防止程序相互依赖性而带来的变动影响。
抽象:
抽象就是找出一些事物的相似和共性之处,然后将这些事物归为一个类
继承:
子类继承父类成员,实现代码复用,提高了软件的可重用性和可扩展性。
多态:
不同子类对同一个消息作出不同的反映,提高软件灵活性
100.在C#中,string str=null string str= string.Empty与string str=“”请尽量使用文字或图象说明其中的区别。
答: string.Empty:不分配存储空间。"":分配一个长度为空的存储空间,""和String.Empty,这两个都是表示空字符串,空字符串是一个特殊的字符串,只不过这个字符串的值为空,在内存中是有准确的指向的。
101.Params是什么含义?
答:Params是C#中的关键字,采用此关键字可以指定参数数目为可变;在方法声明中的params关键字之后不允许任何其他参数,并且在方法声明中只允许一个params关键字。
102.float f=-123.567F; int i=(int)f;i的值现在是_____? 答:-123
103.C#中 property(属性) 与 attribute(特性)的区别,他们各有什么用处,这种机制的好处在哪里?
答:属性:用于存取类的字段。特性:用来标识类,方法等的附加性质。
attribute:自定义属性的基类;property :类中的属性。
104.