222222

面试 专栏收录该内容
2 篇文章 0 订阅

面试题 1  什么是 CTS、CLS 和CLR

公共语言运行库(CLR)是一个CLI 的一个实现,包含了.NET 运行引擎和符合 CLI 的类库。 
通用类型系统(CTS)包含在微软公司提交的 CLI 规范,定义了一个可以在 CLR 上运行的类型规范。 
公共语言规范是 CTS的一个子集,定义了所有面向.NET 的程序所需要符合的最小规范集。

 

面试题 2   CLR 技术和 COM技术的比较 
CLR 和 COM 都定义了组件间交互的规范。COM 并没有定义如何描述组件间的依赖性,并且由于其严格的物理约定,造成了很多组件版本升级和控制的问题。CLR 运用元数据和逻辑类型定义等机制,有效地解决了 COM 遗留的一些问题。并且,相较于 COM模型,笔者认为CLR 更容易理解和学习。


面试题 3   JIT是如何工作的 
JIT 引擎在编译中间代码之前,会寻找方法的本机机器代码缓存并且判断其是否可用,如果可用则直接加载,如果不可用,JIT 引擎会查找类型中的方法存根,找到该中间代码并且进行编译。


面试题 4  怎么把程序集放入 GAC 中 
GAC是一个具有特定目录结构的文件夹,所有强签名的程序集都可以被放入GAC中。可以通过.NET Framework自带的assembly viewer来简单地拖动添加一个程序集到 GAC 中,也可以利用诸如 gacutil.exe等工具使用命令行来添加。总之,任何方法归根结底,都是根据 GAC 的规范和程序集本身的特性,在GAC目录下建立相应的子目录结构。


面试题 5  值类型和引用类型的区别 
所有继承自System.ValueType 的类型是值类型,而其他类型都是引用类型。值类型的赋值会产生一个新的数据副本,所以每个值类型都拥有一个数据副本,而引用类型的赋值则是赋值引用。值类型的对象分配在堆栈上,而引用类型的对象分配在堆上。当比较两个值类型时,进行的是内容比较,而比较两个引用类型时,进行的是引用比较。 

面试题 6   C#中string 和String 有什么区别 
String 和 string 是同一个类型的两个名字,相同情况还有 Object 和 object。除了名称之外,两者没有任何区别。 
面试题 7  简述.NET中堆栈和堆的特点和差异 .NET 的程序在进程内存中分配出堆栈、托管堆和非托管堆。所有的值类型对象和引用类型对象的引用都分配在堆栈上,堆栈根据对象的生存周期来依次分配和释放,堆栈根据一个指向栈尾的指针来分配内存,效率较高。 
.NET 所有引用类型对象分配在托管堆上,托管堆连续分配内存,并且受.NET 的垃圾收集机制管理,受托管堆的内存分配和释放涉及复杂的内存管理,效率相对于堆栈来说低地多。 需要分配堆内存的非托管类型将被分配在非托管堆上,非托管堆不受.NET 垃圾收集机制管理,内存块完全由程序员手动申请和释放。

面试题 8   .NET中GC 的运行机制 
垃圾回收是指收集释放托管堆上不再被使用的对象内存。其过程基本包括:通过算法找到不再被使用的对象、移动对象使所有仍被使用的对象紧靠托管堆的一边和调整各个状态变量。 垃圾回收的运行成本较高,对性能的影响较大。程序员在编写.NET 代码时,应该避免不必要的内存分配,尽量减少或避免使用 GC.Collect来执行垃圾回收。


面试题 9  简述 C#中重写、重载和隐藏的概念 
重写是指用 override 关键字重新实现基类中的虚方法,在运行的过程中,无论通过哪个类型的引用,真正对象类型的方法将被调用。隐藏是指用 new关键字重新实现基类中的方法,在运行的过程中通过引用的类型判断应该调用哪个类型的方法。重载是指多个方法共享同一个名字并且拥有相同的返回值,但是却可以拥有不同的参数列表。


面试题 10  在 C#中如何声明一个类不能被继承 
C#中通过关键字:sealed可以申明一个类型不可被继承,设计中应该为所有不被作为基类的类型添加sealed关键字,以避免各种来自继承的易产生的错误。

 

面试题 11   Int[]是引用类型还是值类型 
数组类型是一族类型,它们都继承自 System.Array,而System.Array又继承自System.Object。所有的数组类型都是引用类型。  
 
面试题 12  解释泛型的基本原理 
泛型类似C++中的模板,允许程序员定义更通用的类型和算法,并且在具体使用时再生成具体的封闭类型。所有带泛型参数的类型都是一个开放式类型,它不能被实例化,但具备所有封闭类型的其他特性,本质上,它和封闭类型没有区别。


面试题 13   Serializable 特性有何作用 
通过为类型添加Serialization特性,可以使对象申明为可被序列化,也即是可被诸如BinaryFormmater等类型的对象序列化和反序列化。


面试题 14  如何自定义序列化和反序列化的过程 
通过实现 ISerializable 接口中的 GetObjectData 方法可以实现自定义的序列化,而通过添加带有SerializationInfo 和StreamingContext的参数的构造方法可以自定义反序列化的过程。


面试题 15  如何使用 IFormattable 接口实现格式化输出 
IFormattable接口帮助类型实现了多样式的格式化输出。IFormattable 的ToString方法接受一个代表格式的字符串参数,通过对这个参数的分析来进行格式化输出。另外,IFormattable.ToString方法接受一个IFormatProvider类型的参数,以允许类型的使用者提供格式化的方法。


面试题 16   .NET提供了哪几个定时器类型 
.NET 的内建类型中有三个定时器类型,分别是:

  1.   System.Windows.Forms.Timer类型
  2.   System.Threading.Timer类型
  3.   System.Timers.Timer类型

 

面试题 17   在 System.Object 中定义的三个比较方法有何异同 
静态方法 ReferenceEquals 实现了引用比较。静态 Equals 方法实现了比较高效地调用实例 Equals 方法的功能。实例Equals 方法是一个虚方法,默认的实现是引用比较,类型可以根据需要重写实例 Equals方法。值类型的基类ValueType 重写了Equals方法,实现了内容的比较。


面试题 18   请解释委托的基本原理 
委托是一类继承自System.Delegate 的类型,每个委托对象至少包含了一个指向某个方法的指针,该方法可以是实例方法,也可以是静态方法。委托实现了回调方法的机制,能够帮助程序员设计更加简洁优美的面向对象程序。  
 
面试题 19   委托回调静态方法和实例方法有何区别 
当委托绑定静态方法时,内部的对象成员变量:_target 将会被设置成null,而当委托绑定实例方法时,_target将会设置成指向该实例方法所属类型的一个实例对象,当委托被执行时,该对象实例将被用来调用实例方法。

面试题 20  什么是链式委托 
链式委托是指一个由委托串成的链表,当链表上的一个委托被回调时,所有链表上该委托的后续委托将会被顺序执行。


面试题 21  请解释事件的基本使用方法 
事件是一种使对象或类能够提供通知的成员。客户端可以通过提供事件处理程序为相应的事件添加可执行代码。事件是一种特殊的委托。


面试题 22  请解释反射的基本原理和其实现的基石 
反射是一种动态分析程序集、模块、类型、字段等目标对象的机制,它的实现依托于元数据。元数据是存储在PE 文件中的数据块,它详细记录了程序集或模块内部的结构、引用的类型和程序集和清单。  


面试题 23  如何利用反射来实现工厂模式 
使用反射可以实现灵活性较高的工厂模式,其关键在于动态地查找产品所包含的所有零件,而不需要通过代码来逐一分析使用者的需求。反射工厂模式具有灵活性高,运行效率相对较低的特点。


面试题 24  如何以较小的内存代价保存 Type、Field 和 Method 信息 
System.RuntimeTypeHandle、System.RuntimeMethodHandle 和 System.RuntimeFieldHandle 三个类型,分别包含了一个指向类型、方法和字段描述的指针,用保存指针的方式来代替保存整个类型、方法和字段的信息描述对象,可以有效地减少内存的消耗。而在实际需要用到这些信息时,又可以通过这三个句柄类型对象,分别得到System.Type、System.Reflection.MethodInfo 和System.Reflection.FieldInfo 类型对象。


面试题 25  什么是线程 
线程是微软公司提出的轻量级线程的概念,一个线程拥有自己的栈和寄存器状态。一个线程可以包含多个线程,和线程由操作系统调度所不同的是,线程内线程的调度完全由程序员自己控制,操作系统的内核完全不会知道线程的存在。在.NET 架构中,线程的概念不一定和操作系统的线程对应,有些情况下.NET 中的线程对应一个线程。  
 
面试题 26  如何使用.NET的线程池 
System.Threading.ThreaPool 类型封装了线程池的操作。每个进程都拥有一个线程池,.NET 提供了线程池管理的机制,用户只需要把线程需求插入到线程池中,而不必再理会后续的工作。所有线程池中的线程都是后台线程,他们不会阻碍程序的退出。


面试题 27   C#中的 lock 关键字有何作用 
C#中的lock关键字实质是调用 Monitor.Enter 和Monitor.Exit两个方法的简化语法,功能上其实现了进入和退出某个对象的同步。通常情况下,可以通过 lock一个私有的引用成员变量来完成成员方法内的线程同步,而通过lock一个私有的静态引用成员变量来完成静态方法内的线程同步。


面试题 28  请解释 ASP.NET 以什么形式运行 
ASP.NET 是作为一个ISAPI 过滤器程序来运行的,同时它是一个.NET CLR的宿主,从而实现了运行托管的服务器代码的功能。


面试题 29   GET请求和 POST 请求有何区别 
HTTP协议中有两种常用的请求:GET 和POST。GET 请求把表单的数据显示地放在 URI 中,并且对长度和数据值编码有所限制。POST 请求把表单数据放在 HTTP请求体中,并且没有长度的限制。


面试题 30  介绍 ASP.NET的页面生存周期 
如果把 ASP.NET 页面的生存周期步骤做个分类的话,可以大致分为四类:

  1.   初始化
  2.   加载数据和页面
  3.   触发事件
  4.   保存状态并呈现页面

1)初始化 
初始化包含上文列出的 PreInit、Init 和 InitComplete 三个步骤,其功能包含了初始化类对象、初始化主题主页面等特性,判断是否是第一次访问页面等初始功能。 
2)加载数据和页面 
这一类型包含了 LoadSate、ProcessPostDate、PreLoad、Load、ProcessPostData(第二次)等步骤。 首先从页面回传的数据加载入 ViewState对象,所有的数据都会以 Base64 编码随页面传入服务器。然后开始处理回传的数据,也就是把表单中的键/值对存入对象之中。随后就开始加载页面,程序员通常会在这里做一些初始化的编程,例如在 OnLoad 事件中编写页面初始化代码。最后会再次执行ProcessPostData,以处理 Load时候新添加的数据。 
说明:两次执行 ProcessPostData通常会让程序员感到困惑,事实上这两次数据处理都是必须的。第一次处理保证了在执行页面加载之前,所有的数据从页面上被读入,这样页面加载时就可以访问这些数据。而第二次ProcessPostData则是为了使页面加载时新建立的控件中的数据能够得到处理。这两次处理缺一不可。 
3)触发事件 
触发事件包含了 ChangedEvents和PostBackEvent步骤。这里首先会比较ViewState中的数据和页面上一次回传的数据,觉得有哪些事件需要被触发,这里事件是逐一被触发的,但其顺序将无法确定。然后会查看是否触发Post Back 事件,该事件也就是页面提交的事件。 
4)保存状态并呈现页面 
这里会包含SaveState、SaveStateComplete、Render步骤。首先页面会编码保存所有的 ViewState 数据,然后将其嵌入到页面的一个隐藏控件中。接着转换所有的控件标签并生成页面 HTML,并且发送回客户端。 
注意:上述分类并没有包含最终的 Unload 步骤,这是因为这个步骤虽然重要,但从不需要程序员关心,ASP.NET 会负责释放所有对象的资源。


面试题 31  列举几种实现页面跳转的方法 
几乎在每个 ASP.NET 的应用程序中,都会出现页面跳转的需求,而实现页面跳转也有非常多的方法:

  1.   使用Response.Redirect 方法
  2.   使用Server.Transfer方法
  3.   使用Server.Execute 方法
  4.   使用javascript脚本
  5.   使用超链接

 

面试题 32  如何防止 SQL注入式攻击 
SQL 注入式攻击时常见的一种攻击方法,主要利用的是系统设计的弊端。程序员在设计时需要考虑到注入式攻击的问题,避免直接使用用户输入拼接 SQL 语句,适当使用加密数据进行存储,并且在合适的场合使用存储过程。

面试题 33   ADO.NET支持哪几种数据源 
ADO.NET 一共支持四个类别的数据源,分别是:SQL SERVER数据库、ORACLE 数据库、OLE DB提供商和 ODBC提供商。


面试题 34  请简要叙述数据库连接池的机制 
ADO.NET 对上层用户提供了数据库连接池的服务,使用完的数据库连接将被有选择的保持在数据库连接池中,以供下次使用。当用户以某个连接字符串申请数据库连接时,数据库连接池将尝试寻找在池中寻找具有相同的连接字符串的连接,并直接提供给用户。

面试题 35  一个连接字符串可以包含哪些属性 
连接字符串包含了丰富的可选属性,在进行数据库操作时,程序员应该对数据库连接字符串进行再三斟酌,不同的设置将适合不同的实际情况。详细的连接字符串属性列表请参考表 1。

 面试题 36  什么是强类型的 DataSet 
强类型DataSet 是指那些固定结构的继承自 DataSet的类型,相较于DataSet而言,强类型的 DataSet具有访问方便,约束性强的特点,有利于数据访问层的隔离,也有利于把错误提前到编译阶段被发现。

面试题 37  什么是 XML 
XML就是可扩展性标记语言, XML是一种简单的数据存储语言,使用一系列简单的标记描述数据,而这些标记可以用方便的方式建立,XML极其简单且易于掌握和使用。


面试题 38   XML 中的命名空间如何使用 
命 名 空 间 被 用 来 模 块 化 XML 文 档 中 的 元 素 , 它 以 如 下 形 式 定 义 :
xmlns:namespace-prefix="namespace"。当解析器试图读取特定命名空间下的节点时,需要指定命名空间的名称。  
 
面试题 39   .NET中如何验证一个 XML 文档的格式 
经过 W3C 组织的推荐,XSD 已经成为了最为标准和通用的 XML 结构定义语言。在.NET 中,XmsReader支持使用XSD文件来验证XML文档是否符合特定的格式,程序员需要做的事为其设置包含了指定XSD 文件的XmlReaderSetting对象,并且遍历XML文档。

面试题 40  什么是 XSLT,XSLT有何作用 
XSLT 是一种对XML文档进行格式转换的语言,其通过 XPath来从XML 文档中提取所需内容,并且依照特定语法组织新的格式。


面试题 41  如何在代码中使用 XSLT文档 
.NET 中所有支持 XSL 的类型都被定义在 System.Xml.Xsl 命名空间下,可以使用XslCompiledTransform来进行指定的格式转换。另外,在 BS结构系统中,客户端可以使用 javascript脚本调用Microsoft.XMLDOM 类型,并进行格式转换。


面试题 42  请简述 SOAP 协议 
SOAP 以 XML 形式提供了一个简单、轻量的用于在分散或分布环境中交换结构化和类型信息的机制。SOAP协议定义了交互的方式,但并未规定时限协议的环境和技术细节。读者可以参考 SOAP协议定义文档,来获取所有的协议内容。


面试题 43  如何在.NET中创建 Web Service 
在.NET 中,可以使用内建类型 WebService 和WebMethod特性来实现Web Service,这种方法使得程序员完全不需要处理和通信有关的工作,而将注意力集中在逻辑工作上。为了获得更大的灵活性,程序员也可以通过实现IHTTPRequest接口来实现定义的 asmx资源请求处理类型。更进一步的,程序员可以自定义资源文件和处理程序,来实现完全自定义的 Web Service,只需要确保所有的返回都符合 SOAP协议。

 

面试题 44  如何生成 Web Service 代理类型 
Web Service 代理类是指负责 SOAP 通信的代理类型,这允许程序员通过调用本地的 Web Service 代理类型来达到访问 Web  Service 服务器的目的。在.NET 中,可以通过使用 wsdl.exe 工具或者添加 Web引用来生成 Web Service 代理类型,后者可以在服务器端有所变动后方便地更新代理类型。

面试题 45  如何提高连接池内连接的重用率 
为了提高数据库连接池的重用率,唯一的方法就是尽量保证系统访问数据库所使用的连接字符串不变。例如建立跳板数据库,使所有连接都首先尝试访问跳板数据库。另外,统一使用超级用户帐号可以进一步统一连接字符串,但这为系统带来了安全上的隐患。


面试题 46   ADO.NET支持哪两种方式来访问关系数据库 
ADO.NET 一共支持两种数据库访问方式,分别是连接式的和脱机式的。连接式的较适合大数据量并且不能准确预测需要读取多少记录的情况,脱机式的更适合进行小数据量的读取操作。

面试题 47  什么是关系型数据库 
关系型数据库是支持采用了关系模型的数据库,简单来说,关系模型就是指二维表模型。相对于其他模型来说,关系型数据库具有理解更容易、使用更方便、维护更简单等优点。


面试题 48   Session有哪几种存储方式,之间有何区别,如何进行设置 
Session 数据一共有四种存储方式,分别为存储在 IIS进程中、状态服务器中、SQL Server数据库中和自定义程序中。除了准备必要的服务外(如 SQL Server数据库服务器),还需要配置站点的 Web.Config文件进行设置。 
说明:可以在 Web.Config中设置关闭 Session数据,这样会话的数据就不能得到保存。


面试题 49  请简述 ViewState 的功能和实现机制 
ViewState 用来存储页面范围内的数据,以保证用户在离开页面之前数据的持续性。实现上来说,ViewState被保存在页面内的一个隐藏控件内,并且在提交到服务器后被提取使用。

 

 4.HashTable和Dictionary的区别:

  (1).HashTable不支持泛型,而Dictionary支持泛型。

  (2). Hashtable 的元素属于 Object 类型,所以在存储或检索值类型时通常发生装箱和拆箱的操作,所以你可能需要进行一些类型转换的操作,而且对于int,float这些值类型还需要进行装箱等操作,非常耗时。

  (3).单线程程序中推荐使用 Dictionary, 有泛型优势, 且读取速度较快, 容量利用更充分。多线程程序中推荐使用 Hashtable, 默认的 Hashtable 允许单线程写入, 多线程读取, 对 Hashtable 进一步调用 Synchronized() 方法可以获得完全线程安全的类型. 而 Dictionary 非线程安全, 必须人为使用 lock 语句进行保护, 效率大减。

  (4)在通过代码测试的时候发现key是整数型Dictionary的效率比Hashtable快,如果key是字符串型,Dictionary的效率没有Hashtable快。

 

 

 

 

30、有一个10个数的数组,计算其中不重复数字的个数。{3,5,9,8,10,5,3}
while (true)
            {
                Console.WriteLine("请输入一个数字");
                int cr = Convert.ToInt32(Console.ReadLine());
                if (cr == 0)
                {
                    break;
                }

                if (!(cr > 2 && cr < 22))
                {
                    Console.WriteLine("非法行数!");
                    continue;
                }

                for (int i = 0; i < cr; i++)
                {
                    int k =0;
                    for (; k < i; k++)
                    {
                       Console.Write(" ");
                    }
                    for (int j = k; j < cr; j++)
                    {
                        Console.Write("* ");
                    }
                    Console.WriteLine();
                }  
            }          
        }
    }

31、下面是一个由*号组成的4行倒三角形图案。要求:1、输入倒三角形的行数,行数的取值3-21之间,对于非法的行数,要求抛出提示“非法行数!”;2、在屏幕上打印这个指定了行数的倒三角形。

*******
*****
***
*
while (true)
{
      Console.Write("请输入行数:范围3-21,输入0退出程序。");
      int line = 0;
      if (!Int32.TryParse(Console.ReadLine(), out line))
      {
           Console.WriteLine("请输入正确的行数!");
           continue;
      }
      if (line == 0)
      {
           Console.WriteLine("退出!");
           break;
      }
      else if (!(line > 2 && line < 22))
      {
           Console.WriteLine("非法行数!请输入正确的行数!");
           continue;
      }

      for (int i = 0; i < line; i++)
      {
          int j = 0;
          for (; j < i; j++)
          {
              Console.Write(" ");
          }

            for (int k = j; k < line; k++)
            {
               Console.Write("* ");
           }
          Console.WriteLine();
      }
}

32、下面的程序执行结果是什么?
class Person
{
    public int Age { get; set; }
}

int i1 = 20;
int i2 = i1;
i1++;
Console.WriteLine(i2);//i2=20;
Person p1 = new Person();
p1.Age = 20;
Person p2 = p1;
p1.Age++;
Console.WriteLine(p2.Age); p2.age=21;


33、下面程序的执行结果是什么?

public struct Point
{
   public int x;
   public int y;
   public Point(int x, int y)
   {
       this.x = x;
       this.y = y;
   }
}
Point p1 = new Point(100, 100);
Point p2 = p1;
p1.x = 200;
Console.WriteLine("{0},{1}", p1.x, p2.x);

200,100

35、Http状态码各是什么意思。

成功2××          成功处理了请求的状态码。

200                   服务器已成功处理了请求并提供了请求的网页。

204                   服务器成功处理了请求,但没有返回任何内容。                         

重定向3××       每次请求中使用重定向不要超过 5 次。

301                   请求的网页已永久移动到新位置。当URLs发生变化时,使用301代码。搜索引擎索引中保存新的URL。

302                   请求的网页临时移动到新位置。搜索引擎索引中保存原来的URL。

304                   如果网页自请求者上次请求后没有更新,则用304代码告诉搜索引擎机器人,可节省带宽和开销。

客户端错误4××  表示请求可能出错,妨碍了服务器的处理。

400                    服务器不理解请求的语法。

403                    服务器拒绝请求。

404                    服务器找不到请求的网页。服务器上不存在的网页经常会返回此代码。

410                    请求的资源永久删除后,服务器返回此响应。该代码与 404(未找到)代码相似,但在资源以前存在而现在不存在的情况下,有时用来替代404 代码。如果资源已永久删除,应当使用 301 指定资源的新位置。

服务器错误5××   表示服务器在处理请求时发生内部错误。这些错误可能是服务器本身的错误,而不是请求出错。

500                     服务器遇到错误,无法完成请求。

503                     服务器目前无法使用(由于超载或停机维护)。通常,这只是暂时状态。                                                           

37、一个数组:1,1,2,3,5,8,13,21...+m,求第30位数是多少?用递归实现;(常考!!!,提示:搜索斐波那契数列)
  int i = 0,a=0,b=1,c;
  while (i<30)
  {
       c =a+b;
       Response.Write(c+"-");
       a = b;
       b = c;
       i++;
  }

38、产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复。(要求使用两种方法)

List<int> li = new List<int>(100);
Random rd=new Random();
while (li.Count<100)
{
     int myran = rd.Next(1, 101);
     if (!li.Contains(myran))
     {
         li.Add(myran);
     }
}

int d;
List<int> li = new List<int>(100);
for (int i = 0; i < li.Count; i++)
{
    for (int j = 0; j < li.Count; j++)
    {
        if (li[i]<li[j])
        {
             d = li[j];
             li[j] = li[i];
             li[i] = d;
        }
    }
}

foreach (var item in li)
{
     Response.Write(item + "..");
}


39、冒泡排序数组(背也要背下来,50%必考!)
var arr = [1, 2, 1, 5, 3, 2, 6];
var d, i = 0, len = arr.length;
for (;i<len;i++) 
{
     for (var j = 0; j < len; j++) {
           if (arr[i]<arr[j]) 
           {
               d = arr[j];
               arr[j] = arr[i];
               arr[i] = d;
           }
     }
}

  • 2
    点赞
  • 0
    评论
  • 1
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:编程工作室 设计师:CSDN官方博客 返回首页

打赏作者

iBenxiaohai123

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值