C#面试题

Q1.简述Vue中methods、computed以及watch的用法及区别。

  1⃣️computed:计算属性将被混到Vue实例中。所有getter和setter的this上下文自动地绑定为Vue实例。

  2⃣️methods:method将被混到Vue实例中。可以直接通过VM实例访问这些方法,或者在指令表达式中使用。方法中的this制动绑定为Vue实例。

  3⃣️wathc:是一种更通用的方式来观察和相应Vue实例上的数据变动。一个对象,键是需要观察的表达式,值是对应回调函数。值也可以是方法名,或者包含选项的对象。Vue实例将会在实例化时调用$watch,🏪watch对象的每一个属性。

 

Q2.简述C#中的以下关键词。

  1⃣️volatile:类型修饰符。创建单例模式时会使用,懒汉模式。用来修饰被不同线程访问和修改的变量。如果不加volatile会导致:要么无法编写多线程程序,要么编译器失去大量优化的机会。应用场景:多线程应用中被几个任务共享的变量

  2⃣️interlocked:为多个线程共享的变量提供原子操作(仅限int类型)

  3⃣️Monitor.Lock:lock是一种混合锁,相当于Moitor.Enter(object)方法是获取锁;Monitor.Exit(object)方法是释放锁。

  4⃣️ReaderWriterLock:读写锁,分为读锁和写锁,多个线程读一个对象,而只有一个线程要写这个对象,所以对于读线程来说,它不改变对象的内容,我们就应该允许多个线程同事读,只有在写的时候才要锁住对象。这样可以提高读线程的吞吐量。

  5⃣️AutoResetEvent | ManualResetEvent:重置事件和手动重置事件,两个类可以理解为设置幸好,来进行阻塞线程或者让线程重新启动。

  6⃣️Semaphore:信号量。通过计数器设置可以访问的线程数目。例如设置为10,则可以同时有10个线程访问此资源,每当有一个线程访问此资源时,则信号量减1;访问完成后释放则加1,当信号量=0时禁止访问,阻塞线程,当信号量>0时,可以访问。

  7⃣️Mutex:互斥量。只有拥有互斥对象的线程才具有访问资源的权限。由于互拆对象只有一个,因此决定量任何情况下此资源都不会同时被多个线程访问。当前占据资源的线程在任务处理完成后将拥有的互斥对象交出,以便其他线程在获得后得以访问资源。互斥量比临界区复杂,因为使用互斥不仅仅能在同一应用程序不同线程中实现资源的安全共享,而且可以在不同应用程序的线程之间实现对资源的安全共享。

 

Q3.MVC平台网页设计textbox控件的四种形式。

  1⃣️<input type="text" name="sex" value=""/>

  2⃣️@Html.TextBox("sex",model.sex)

  3⃣️@Html.TextBoxFor(m=>m.sex)

  4⃣️@Html.TextEditorFor(m=>m.sex)

Q4.用一条SQL语句 查询出每门功课都大于80分的学生姓名,表结构如下

姓名   课程   分数  
张三 语文 81
张三 数学 75
张三 英语 82
李四 语文 76
李四 数学 90
李四 英语 82
王五 语文 81
王五 数学 100
王五 英语 92

 

 

 

 

 

 

 

 

 

 

 

 

select name from db group by name having min(score>80)

 

Q5.何时必须声明一个类为抽象类

  当这个类中包含抽象方法时,或是该类并没有完全实现父类的抽象方法时。

 

Q6. Aspx页面中UpdatePanel的作用是什么?

  控制页面局部更新

 

Q7.MVC框架中,当使用Get方法访问JsonREsult时,能否直接:return json(obj)?

  不可。 需res.JsonRequestBehavior = JsonRequestBehavior.AllowGet;

 

Q8.可以采用foreach迭代类的对象必须满足什么条件?

  需要实现OEnumberable接口或声明GetEnumberator方法的类型。(课不实现接口,但一定要实现GetEnumrator方法)

 

Q9.dotnet环境下,如何把数据库数据转为xml输出?

  内容读取到dataTable或dataSet中,再转为xml。

 

Q10.foreach和for,switch和if哪个效率高

  foreach,switch高。for循环每次都要进行判断i的大小。

 

Q11.WebService基于什么协议?

  SOAP协议(基于xml的协议),而SOAP建立在http上。

 

Q12.1.WebService和WebApi有什么不同

  1⃣️WebService是基于SOAP协议的,数据格式是xml。

  WebApi遵循http协议。Response可以被WebApi的Media TypeFormatter转为json,xml或者其他。

  2⃣️webservice只能部署在IIS上,webapi可以寄宿在不同宿主上,如web host,self host方式。

  3⃣️webservice可以通过ajax访问

  4⃣️webapi无状态,相对webservice更轻量级。webapi支持get、post等http操作,并且对限制宽带对设备,比如只能手机等支持的很好。

 

Q12.2.上面的对比webservice貌似并不好用,但是问什么要用它呢?

  1⃣️很好的跨变成语言和跨操作系统

  2⃣️可移植性:传统的webservice只是利用了http通道,进行独立的交互,但是这个交互协议可以移植到其他协议下运作。

 

Q13.C#是否支持多重继承?

  否。C#只能继承一个类,但是可以继承多个接口。

 

Q14.修饰符protected internal的意思?

  internal修饰的在统一项目中都可访问,而在另外一个项目就不能访问,说明“同一程序集”指的是同一个项目;对于protected interal修饰的在同一项目中都可访问,而在其他项目中只有在派生类中可以访问,所以protected internal修饰的成员变量是统一程序集或者派生类可以访问,也就是protected跟internal的并集,而不是交集。

 

Q15.能否阻止一个类被其他类继承?能否实现允许某个类被继承,但不允许其中某个方法被覆盖?

  可以。当一个类用sealed修饰时,此修饰符会阻止其他类从该类继承。

  标记这个类为public,并标记这个方法为sealed

 

Q16.简述virtual,sealed,override和abstract作用。

  virtual:声明虚方法关键字,说明该方法可以被重写。虚函数没有实现

  sealed:表名该类不可以被继承

  override:重写基类方法

  abstract:申明抽象类/抽象方法的关键字。抽象方法没有具体实现,由子类实现,抽象类不可以实例化。 

 

Q17.简述private,protected,public,internal修饰符的访问权限

  public:完全公开,不受限制

  protected:包含类或从包含类派生的类型。类内部和继承类可以访问

  internal:当前程序集可以访问。在同一命名空间内可以访问

  protected internal:包含类派生的当前程序集

  private:包含类型。类内部可以访问。

  

Q18.b/s架构下,可否声明一个静态的数据库连接对象,所有的业务类都引用该静态连接对象去访问数据库?

  一个静态的SqlConnection来管理项目内所有的数据库连接在大部分场景是不合理的。在winform单线程项目中没有问题,每个用户都有一个程序副本。但如果多个用户提交请求同一个AppDomain中的函数方法来处理事,是不可以的,会引起并发问题,会引起相互干扰,还需要加锁lock才能操作。

 

Q19.EF框架中,使用DBFirst时数据库中的表A没有主键,能否通过“从数据库更新模型”操作,将A导入到EF框架中。

  不可。

 

Q20.什么是强类型,C#是强类型吗?JS是强类型吗?

  强类型:指程序中表达的任何对象从所属的类型都必须能在编译时刻确定。

  常见的强类型语言有:C++,Java,Apex,Python。

  C#是强类型,JS不是。

 

Q19.读写数据库都需要哪些对象?

  Connection:数据库连接

  DataReader:读取数据源数据

  DataAdapter:对数据源执行操作并返回结果,在DataSet于数据源之间建立通信,将数据源中对数据写入DataSet中,或根据DataSet中对数据绑定数据源

  DataSet:内存中对数据库,是数据表对集合,可以包含任意多个数据表。

 

Q21.int?和int区别?

  int?是可空类型,可以是null,它是通过把int装箱为引用类型实现的。

 

Q22.C#中string和StringBulider区别?

  string是不变的字符串,StringBuilder存放一个可变的字符串,并提供一些对这个字符串修改对方法。

  string继承object,StringBuilder继承AbstractStringBuilder,而AbstractStringBuilder和string都继承object。

  StringBuilder运行速度比string快。(因为当string被重新赋值时,会创建一个新当对象,再将新值赋给新对象,原来的对象就会被垃圾回收机制回收掉。而StringBuilder和StringBuffer的对象是变量,之间对对象进行更改,无需GC回收,所以效率更快。)

  使用场景:string用于少量的字符串操作,字符串不经常变化时,可优先使用string

 

Q23.asp.net页面传值的几种方式。

  Request.Form["aaa"].ToString();

  Request.QueryString["aaa"].ToString();

  Context.Item["aaa"].ToString();

  cookie,session,application

 

Q24.C#中委托是什么?事件和委托什么关系?

  委托是指向事件的一种函数指针,把事件转换为类一种引用类型的变量,可以让其他函数调用。

 

Q25.私有成员会被继承吗?

  会,但是不能访问。所以看上去他们似乎是不能被继承对,但实际上确实被继承类。

 

Q26.能够将非静态但方法覆写成静态方法吗?

  不能。覆写方法但签名必须与被覆写的方法签名保持一致,除了将virtual改为override

 

Q27.可以覆写私有的虚方法吗?

  不可以。甚至子类无法访问父类中的私有方法。继承类中只有实现过所有的抽象类的抽象方法后才能被实例化。

 

Q28.什么是接口(interface)?

  只含有公有抽象方法的类。这些方法必须在子类中被实现。

 

Q29.接口是否可以继承接口?抽象类是否可以实现接口?抽象类是否可以继承实体类?

  接口可以继承接口。抽象类可以实现接口。抽象类可以继承实体类,但前提是实体类必须有明确的构造函数。

 

Q30.什么是抽象类(abstract class)?

  一种不可以被实例化的类。抽象类中一般包含抽象方法,当然也可以有具体实现。

 

Q31.构造器Constructor是否可以被override?

  构造器不能被继承,因此不能被重写,但是可以被重载overloading。

 

Q32.是否可以继承String类?

  不可。String类是final类,所以不可被继承。

 

Q33.数组又没有length()方法?String又没有length()方法?

  都没有length()方法,有length属性。

 

Q34.成员变量和成员函数前加static的作用。

  他们被成为常成员变量和常成员函数,又称为类成员变量和类成员函数。分别用来反应类的状态。比如类成员变量可以用来统计类实例的数量,类成员杉树负责这种统计的动作

 

Q35.C#中using和new意义?

  using:引用命名空间或使用非托管资源

  new:新建实例或隐藏父类方法

 

Q36.const不能被static修饰

 

Q37.ref参数是引用调用,out参数是输出调用

 

Q38.const和readonly区别?

  const可以用于局部常量。是编译时常量。

  readonly是类的initonly字段,不能是局部的。运行时常量。

 

Q39.虚函数的用法:

  1)virtual指明一成员函数为虚函数,而virtual仅用于类的定义里,在类外可不加此关键字.

  2)一个类的成员函数被定义为虚函数时,子类该函数仍保持虚函数特征.

  3)子类覆盖此函数时,定义里可不加virtual关键字,但函数声明要和基类的完全一致!且此声明是必须的.

  4)不是纯虚函数时,父类的虚函数必须要实现; 而若将父类的虚函数设定为纯虚函数时,子类必需要覆盖之而且必须要实现之!

 

Q40.virtualsealedoverrideabstract的区别

  virtual申明虚方法的关键字,说明该方法可以被重写

  sealed说明该类不可被继承

  override重写基类的方法

  abstract申明抽象类和抽象方法的关键字,抽象方法不提供实现,由子类实现,抽象类不可实例化

 

Q41.什么是局部变量,什么是成员变量?

  局部变量是指一个方法中定义的变量;成员变量是指在类范围里定义的变量,也就是之前讲过的属性

 

Q42.使用static修饰的成员称为静态成员,使用实例对象调用的成员称为实例成员

 

Q43.对象能否调用静态方法 ?

  不能。对于类内部定义的静态变量及静态方法,该类的对象均不能调用。

 

Q44.为什么不能指定接口中方法的修饰符?

  接口中的方法用来定义对象之间通信的契约,指定接口中的方法为私有或保护没有意义。他们默认为公有方法。

 

Q45.请详述在.net中类(class)与结构(struct)的异同:

  Class可以被实例化,属于引用类型,是分配在内存的堆上的,Struct属于值类型,是分配在内存的栈上的

 

Q46.接口和抽象类具有什么区别?

  含有abstract修饰符的class即为抽象类,abstract 类不能创建的实例对象。含有abstract方法的类必须定义为abstract class,abstract class类中的方法不必是抽象的。abstract class类中定义抽象方法必须在具体子类中实现,所以,不能有抽象构造方法或抽象静态方法。如果的子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为abstract类型。

  接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。接口中的方法定义默认为public abstract类型

下面比较一下两者的语法区别:

1. 抽象类可以有构造方法,接口中不能有构造方法。

2. 抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。

3. 抽象类中抽象方法可以指定为public,接口中抽象方法不能指定任何修饰符,默认就是public

4. 一个类可以实现多个接口,但只能继承一个抽象类。

 

Q.结构和类的区别?

  结构:值类型,存在栈上。类:引用类型,存在受托端的堆上。

  堆结构中的数据进行操作比对类或对象中的数据进行操作速度要快。

  一般用结构存储多种类型的数据,当创建一个很多类或对象共用的小型对象时,使用结构效率更高。

 

Q47.base关键字的作用是什么?

  子类继承父类的过程中,可能需要在子类中调用父类中的成员,如属性、方法或者构造方法。这个时候,可以使用base关键字来完成。base的作用是用于引用父类的成员,如属性、方法或者是构造方法

 

Q48.什么是抽象类?

  抽象类不能创建实例,它只能作为父类被继承。抽象类是从多个具体类中抽象出来的父类,它具有更高层次的抽象。从多个具有相同特征的类中抽象出一个抽象类,以这个抽象类作为其子类的模板,从而避免了子类的随意性。

Q49.接口和抽象类两者在应用上的区别:

  接口更多的是在系统架构设计方法发挥作用,主要用于定义模块之间的通信契约。而抽象类在代码实现方面发挥作用,可以实现代码的重用

 

Q50.面向对象的特征有哪些方面?

  面向对象的编程语言有封装、继承 、抽象、多态等4个主要的特征。

  封装:封装的目标就是要实现软件部件的“高内聚、低耦合”,防止程序相互依赖性而带来的变动影响。

  抽象:抽象就是找出一些事物的相似和共性之处,然后将这些事物归为一个类

  继承:子类继承父类成员,实现代码复用,提高了软件的可重用性和可扩展性。

  多态:不同子类对同一个消息作出不同的反映,提高软件灵活性

 

Q51.在C#中,string s="" string s2= string.Empty与string s3=null请尽量使用文字或图象说明其中的区别。

  string.Empty:不分配存储空间。"":分配一个长度为空的存储空间,""和String.Empty,这两个都是表示空字符串,空字符串是一个特殊的字符串,只不过这个字符串的值为空,在内存中是有准确的指向的。

   从IL看(看不出区别):

    string s="";------------->ldstr ""

    string s2=string.Empty;---------->ldsfld string [mscorlib]System.String::Empty

    ldsfld中的[s]表示static,加载静态的fld

  从native code汇编代码上看

    string s="";------------->ds:[34E2340h]("")  [ebp-8]

    string s2="";------------->ds:[34E2340h]("")  [ebp-0ch]

    结果看到:二者地址一样。

  总结:string s="" string s2= string.Empty 没有区别

 

Q52.Params是什么含义?

  Params是C#中的关键字,采用此关键字可以指定参数数目为可变;在方法声明中的params关键字之后不允许任何其他参数,并且在方法声明中只允许一个params关键字。

Q53.float f=-123.567F; int i=(int)f;i的值现在是_____?

  -123

 

Q54.C#中 property(属性) 与 attribute(特性)的区别,他们各有什么用处,这种机制的好处在哪里?

  属性:用于存取类的字段。特性:用来标识类,方法等的附加性质。

attribute:自定义属性的基类;property :类中的属性。

 

Q55..net中读写xml的类都归属于哪些命名空间?

  System.Xml

 

Q56.堆和栈的区别

  栈:由编译器自动分配、释放。在函数体中定义的变量通常在栈上。

  堆:一般由程序员分配释放。用new、malloc等分配内存函数分配得到的就是在堆上。 

 

Q.a=10,b=15,在不用第三方变量的前提下,交换a和b的值。

  a=a+b;b=a-b;a=a-b

 

===================名词解释===================

Java是一个主打敏捷开发、跨平台的编程语言

编程语言:C#、F#、Java、C、Python、JavaScript...

开发平台:.NET

C#:高级、强大、类型安全且面向对象的语言

.NET是通用开发平台,包含:.NET Framework、.NET Core、Mono等框架

.NET Framework中有:公共语言运行时(CLR)的虚拟执行系统和统一的.NET框架类库(.NET FCL)

.NET的所有实现都基于名为 .NET Standard的通用API规范。

.NET与JAVA都是即时编译(JIT)的动态语言。项目编译生成的目标文件不是机器码,而是由运行时环境进行即时编译的特殊代码。Java中这种特殊代码成为字节码(bytecode),在.NET中称为公共中间语言(CIL:Common Intermediate Language)

 

JAVA官方运行时环境:JRE(Java Runtime Environment)

.NET官方运行环境:CLR

 

 

Q:解释CTS,CLS,CLR。

  CTS:通用语言系统。

  CLS:通用语言规范。

  CLR:公共语言运行时。

Q:.NET FCL?

  .NET框架类库(.NET Framework Class Librart)

Q:CLI ?

  公共语言基础结构(Common Language Infrastructure)。

  是规范。包括与语言无关的运行时和语言互操作性。包含:CLR,CIL,CTS

 

Q:JIT ?

  JIT:编译器。以即时方式编译MSMIL代码。代码首先被编译为IL,当要运行这些代码时CLR对IL进行二次编译转换成机器码运行。可移植性。

 

Q:ORM?

  ORM:一般指对象关系映射

 

Q:ASP.NET和ASP相比有哪些进步。

  ASP解释型,ASPX编译型,性能提高,有利于保护源码。

 

 

 

Q:什么是应用程序域?

  应用程序域可以理解为一种轻量级进程,起到安全的作用,占用资源小。

 

Q:简述Code-Behind技术。

  代码后置

 

Q:GAC?

  全局程序集缓存

 

 

 

 Q:如何隐式声明变量?隐式类型变量的限制?

  使用var进行声明。

  限制:1.隐式类型的声明只限于局部变量。不可用于类变量,参数或者返回值。

     2.在声明隐式类型的变量时,必须指定初始值,以便于编译器进行类型的推断。

      且不能指定为null值,不能直接对隐式声明对变量进行运算,不能在一个var中同时声明多个隐式变量。

 

Q:扩展方法的特点?

  • 扩展方法必须被定义在一个静态类中,扩展方法自身必须是一个静态方法。
  • 扩展方法的首个参数必须是this,最后紧跟要扩展的类的名称。
  • 扩展方法可以被正确的对象实例调用,也可以使用静态类名静态地调用。

Q:lambda表达式?

  (object a,object b)=>{}

  

  delegate int del(int i);

  del mydel = x=> return {x*x};

  int mydel(5);

 

Q:LINQ的好处?

  • LINQ简化了访问数据的方式。只要熟悉了C#或VB.NET,就可以使用LINQ操作数据,甚至不需要掌握SQL或者PL/SQL。
  • LINQ统一了查询任何数据的语法。可以使用相同的语法查询XML文档或者是SQL数据库、ADO.NET数据集以及内存集合。
  • LINQ强化了关系型数据与面向对象世界之间的联系。
  • LINQ加快了开发世间,可以使用编译时错误捕捉、只能提示和调试支持。

 

Q:Session有哪几种存储方式?

  • 存储于IIS进程中
  • 存储于状态服务器中
  • 存储于数据库中
  • 存储于自定义程序中

 

Q:通过程序控制GC强制回收是否可以提高效率?

  可以,GC是循环遍历所有资源。

Q:GC是什么,为什么要有GC?

  垃圾收集器。程序员不必担心内存管理,因为GC会自动进行管理。调用方法下面两种二选一:

  System.GC().    Runtime.GetRuntime().GC()

Q:如何手动释放资源?

  需要手动释放的情况:

  • 非托管资源。
  • 类在运行时会产生大量实例,必须自己手工释放这些资源以提高程序的运行效率。

  继承IDisposable接口。

数据类型

问题:已知变量x的初值为24,则表达式x+=x--+=x%=17运算的结果值为( )

  A.28   B.27  C.26  D.错误的表达式

答案:D。由于“--”运算符为一元运算符,其优先等级要高于二元运算符“+=”和“%=”,因此首先计算表达式“x--”。此时x为23;而由于“%=”的优先等级要高于“+=”,因此计算x%=17,值为6,这时整个表达式变为“x+=24+=6”;由于赋值操作符的左操作数必须是变量、属性、索引器或事件类型的表达式,所以判断该表达式是一个错误的表达式。

 

问题:short s1 = 1;  s1 = s1 + 1;

   short s1 = 1;  s1 + = 1;

上面的两行代码能否正常编译,如果不能,请指出问题所在。

答案:s1声明为short型,数值1为int型,因此对于表达式s1 = s1 + 1,由于赋值运算符的优先等级小于加运算符,所以应先计算表达式s1+1的值,为int型,然后再把其值赋值给s1,由于二者类型不一致所以需要强制转换。对于s1 += 1,系统在编译时直接隐式转换为short型,因此是正确的。

 

===================开放性问题===================

1.描述你曾经或正在使用的大型项目解决方案。

2.现在一个业务系统有4万用户,所有用户每天产生6千万数据,系统要求快速查询60天数据,请给出你的实现方案。

3.

 

posted @ 2022-03-04 15:35  chocolateXLL  阅读(104)  评论(0编辑  收藏  举报