C# 面试题及答案

Posted zhouxiaojie

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# 面试题及答案相关的知识,希望对你有一定的参考价值。

  1. 分析以下代码

          

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;
对外部硬件而言,上述四条语句分别表示不同的操作,会产生四种不同的动作,但是编译器却会对上述四条语句进行优化,认为只有XBYTE[2]=0x58(即忽略前三条语句,只产生一条机器代码)。如果键入volatile,则编译器会逐一的进行编译并产生相应的机器代码(产生四条代码).原文引用https://www.cnblogs.com/lvdongjie/p/5469246.html
interlocked:为多个线程共享的变量提供原子操作(仅限int类型)。微软原文https://docs.microsoft.com/zh-cn/dotnet/api/system.threading.interlocked?view=netframework-4.7.2    个人微博原文:https://www.cnblogs.com/Zachary-Fan/p/interlocked.html
monitor:lock:(lock是一种混合锁,相当于Monitor.Enter(object)方法是获取锁,Monitor.Exit(object)方法是释放锁的组合)详见原文https://www.cnblogs.com/chengxingliang/p/3150731.html
 
ReaderWriterLock:字面意思,读写锁,分为读锁和写锁,多个线程读一个对象, 而只有一个线程要写这个对象. 那么对于读线程来说, 它不改变对象的内容, 我们就应该允许多个线程同时读, 只有在写的时候才要给锁住对象. 这样可以提高读线程的吞吐量。详见原文 https://blog.csdn.net/changtianshuiyue/article/details/16943499
 
AutoResetEvent|   ManualResetEvent  字面意思为自动重置事件和手动重置事件,这两个类可以理解为设置信号,来进行阻塞线程或者让线程重新启动。上原文https://www.cnblogs.com/fangyz/p/5040206.html
 
Semaphore 信号量,通过计数器设置可以访问的线程数目例如设置为10,则可以同时有10个线程访问此资源,每当有一个线程访问此资源,则信号量减1,访问完成之后释放则加1,当信号量=0时禁止访问,阻塞线程,当信号量>0时,可以访问。原文https://www.cnblogs.com/tianzhiliang/archive/2010/08/31/1813635.html
 
Mutex   互斥量,嗯。。。说起来挺麻烦,还是看原文吧。https://www.cnblogs.com/suntp/p/8258488.html
 
5.MVC平台,网页设计textbox控件时,编辑代码有四种形式,以下已经写出了第一种,请写出后三种。
@using MvcViewModelTest.Models
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++JavaApexPython等,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.















以上是关于C# 面试题及答案的主要内容,如果未能解决你的问题,请参考以下文章

C#经典面试题及答案

前端面试题及答案整理(转)

前端面试题及答案整理(转)

代码面试需要知道的8种数据结构(附面试题及答案链接)

代码面试需要知道的8种数据结构(附面试题及答案链接)

Java面试题及答案2020,java登录界面代码