.Net常见笔试题

1简述 private protected public internal 修饰符的访问权限。

 答:private:私有成员,在类的内部才可以访问;

       protected:保护成员,该类内部和继承类中可以访问;

       public:公共成员,完全公开,没有访问限制;

       internal:当前程序集内可以访问。

2、面向对象的三个特性?

继承性:就是让一个类型的对象拥有另一个类型的对象的属性的方法。继承后,子类拥有父类的属性和方法。

封装性:就是将数据和代码捆绑在一起,防止外界干扰。

多态性:就是一个事物拥有不同形式的能力。

3.C#中的委托是什么?事件是不是一种委托?

 答:委托可以把一个方法作为参数代入另一个方法。委托可以理解为指向函数的指针。事件不是委托,因为委托是类型,事件是对象。如果非要说事件和委托的关系,就是事件的内部是用委托实现的。

4.override与重载(overload)的区别

答:重载是方法的名称相同,参数或者参数类型不同,进行多次重载以适应不同的需要。重载是面向过程的;override是进行基类函数的重写,override是面向对象的。

5..net中类(class)与结构(struct)的异同?

答:class可以被实例化,属于引用类型,是分配在内存的堆上的,class可以实现接口和单继承其他类,还可以作为基类型;struct属于值类型,是分配在内存的栈上的,不能作为基类型,但是可以实现接口。

6.CTSCLSCLR分别作何解释?

答:CTS:通用语言系统。CLS:通用语言规范。CLR:公共语言运行库。

7.什么是装箱和拆箱?

答:从值类型接口转换到引用类型装箱。从引用类型转换到值类型拆箱。

8.什么是受管制(托管)的代码?

答:托管代码是运行.NET 公共语言运行时CLR的代码;unsafe:非托管代码,不经过CLR运行。程序员自行分配和释放内存空间。

9.在C#中,string str = null  string str = “” 请尽量使用文字或图象说明其中的区别。

答:string str = null 是不给他分配内存空间,而string str = "" 给它分配长度为空字符串的内存空间。

10、StringBuilder String 的区别?

String 在进行运算时(如赋值、拼接等)会产生一个新的实例,而 StringBuilder 则不会。所以在大量字符串拼接或频繁对某一字符串进行操作时最好使用 StringBuilder,不要使用 String

如果要操作一个不断增长的字符串,尽量不用String类,改用StringBuilder类。两个类的工作原理不同:String类是一种传统的修改字符串的方式,它确实可以完成把一个字符串添加到另一个字符串上的工作没错,但是在.NET框架下,这个操作实在是划不来。因为系统先是把两个字符串写入内存,接着删除原来的String对象,然后创建一个String对象,并读取内存中的数据赋给该对象。这一来二去的,耗了不少时间。而使用System.Text命名空间下面的StringBuilder类就不是这样了,它提供的Append方法,能够在已有对象的原地进行字符串的修改,简单而且直接。当然,一般情况下觉察不到这二者效率的差异,但如果你要对某个字符串进行大量的添加操作,那么StringBuilder类所耗费的时间和String类简直不是一个数量级的

11、GC是什么? 为什么要有GC?

C/C++中由程序员进行对象的回收像学校食堂中由学生收盘子,.Net中由GC进行垃圾回收像餐馆中店员去回收。

GC是垃圾收集器(Garbage Collection)。程序员不用担心内存管理,因为垃圾收集器会自动进行管理。GC只能处理托管内存资源的释放,对于非托管资源则不能使用GC进行回收,必须由程序员手工回收,一个例子就是FileStream或者SqlConnection需要程序员调用Dispose进行资源的回收。

12、值类型和引用类型的区别?

1.将一个值类型变量赋给另一个值类型变量时,将复制包含的值。引用类型变量的赋值只复制对对象的引用,而不复制对象本身。

2.值类型不可能派生出新的类型:所有的值类型均隐式派生自 System.ValueType。但与引用类型相同的是,结构也可以实现接口。

3.值类型不可能包含 null 值:然而,可空类型功能允许将 null 赋给值类型6

4.每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值。

要请求垃圾收集,可以调用下面的方法:GC.Collect()一般不需要手动调用GC.Collect()。当一个对象没有任何变量指向(不再能使用)的时候就可以被回收了。

13、abstract classinterface有什么区别?

相同点:

都不能被直接实例化,都可以通过继承实现其抽象方法。

不同点:

接口支持多继承;抽象类不能实现多继承。

接口只能定义行为;抽象类既可以定义行为,还可能提供实现。

接口只包含方法(Method)、属性(Property)、索引器(Index)、事件(Event)的签名,但不能定义字段和包含实现的方法;

抽象类可以定义字段、属性、包含有实现的方法。 

接口可以作用于值类型(Struct)和引用类型(Class);抽象类只能作用于引用类型。例如,Struct就可以继承接口,而不能继承类

14、能用foreach遍历访问的对象的要求?

需要实现IEnumerable接口或声明GetEnumerator方法的类型。

15、在c#中using和new这两个关键字有什么意义,请写出你所知道的意义?

using 引入名称空间或者使用非托管资源,使用完对象后自动执行实现了IDisposable接口的类的Dispose方法。

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

16、什么是反射?

程序集包含模块,而模块又包括类型,类型下有成员,反射就是管理程序集,模块,类型的对象,它能够动态的创建类型的实例,设置现有对象的类型或者获取现有对象的类型,能调用类型的方法和访问类型的字段属性。它是在运行时创建和使用类型实例。

17、进程和线程的区别?

进程是系统进行资源分配和调度的单位;线程是CPU调度和分派的单位,一个进程可以有多个线程,这些线程共享这个进程的资源

18、堆和栈的区别?

栈是编译期间就分配好的内存空间,因此你的代码中必须就栈的大小有明确的定义;局部值类型变量、值类型参数等都在栈内存中。

堆是程序运行期间动态分配的内存空间,你可以根据程序的运行情况确定要分配的堆内存的大小。

19、ADO.net中常用的对象有哪些?分别描述一下

Connection 数据库连接对象
Command数据库命令
DataReader数据读取器
DataSet数据集

20、Application 、Cookie和 Session 有什么不同?

Application是用来存取整个网站全局的信息,而Session是用来存取与具体某个访问者关联的信息。Cookie是保存在客户端的,机密信息不能保存在Cookie中,只能放小数据;Session是保存在服务器端的,比较安全,可以放大数据。

21、列举ASP.NET 页面之间传递值的几种方式。

1.使用QueryString, 如....?id=1; response. Redirect()....

2.使用Session变量

3.使用Server.Transfer

4.Cookie传值

22、谈谈你对三层架构的理解

通常意义上的三层架构就是将整个业务应用划分为:表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)。

区分层次的目的即为了“高内聚,低耦合”的思想。

表现层(UI):通俗讲就是展现给用户的界面,即用户在使用一个系统的时候的所见所得。

业务逻辑层(BLL):针对具体问题的操作,也可以说是对数据层的操作,对数据业务逻辑处理。

数据访问层(DAL):该层所做事务直接操作数据库,针对数据的增添、删除、修改、更新、查找等每层之间是一种垂直的关系。

三层结构是N层结构的一种,一般来说,层次之间是向下依赖的,下层代码未确定其接口(契约)前,上层代码是无法开发的,下层代码接口(契约)的变化将使上层的代码一起变化。

优点: 分工明确,条理清晰,易于调试,而且具有可扩展性。

缺点: 增加成本。

23、编写一个单例(Singleton)类?

把构造函数设置为private,设置一个public、static的对象实例

public FileManager

{

    private FileManager(){}

    public readonly static FileManager Instance = new FileManager();

}

24、谈谈你对MVC和三层架构的理解?

MVC即模型、视图、控制器,模型表示业务数据及业务处理,用来封装数据及行为;视图是用户看到并与之交互的界面;控制器接受用户输入并调用模型和视图去完成用户的请求。使用MVC有利于关注点分离,自动化UI测试成为了可能。

三层架构即表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)。区分层次的目的即为了“高内聚,低耦合”的思想。表现层通俗讲就是展现给用户的界面,业务逻辑层即针对具体问题的操作,也可以说是对数据层的操作,对数据业务逻辑处理。数据访问层:该层所做事务直接操作数据库,针对数据的增添、删除、修改、更新、查找等。

25、列举ASP.Net MVC中,从Action传值到View(不是从客户端传值到Action),有几种方式?

1、Viewdata  2、Viewbag  3、Model

26、在MVC中如何保持Sessions?

可使用tempdata、viewdata、viewbag三种方式。

其中tempdata:在不同的控制器或动作间转换时保持数据。另外,进行页面转向时,tempdata可以保持数据,它是一个内部的Session变量。

Viewdata:可以在控制器和视图间保持数据。

Viewbag:它是视图数据的动态包装,使用viewbag不需要类型转换,它使用的是内部动态关键词。

27、MVC中如何做输入验证?

在M层使用数据模型的属性标签形如[Required],在C层使用ModelState.IsValid属性检查数据是否正确,也可在C层使用JavaScript进行数据验证。

28、MVC有多少种不同类型的结果类型,请详细描述?

有12种,最主要的是ActionResult类,它是一个基础类,它有11个子类型。

ViewResult  - 给响应流渲染指定的视图

PartialViewResult  - 给响应流渲染指定的局部视图

EmptyResult  - 返回空的响应结果。

RedirectResult  - 执行一个HTTP转向到指定的URL。

RedirectToRouteResult  -执行一个HTTP转向到一个URL,这个URL由基于路由数据的路由引擎来决定

JsonResult  - 序列化一个ViewData对像到JSON格式。

JavaScriptResult  - 返回一段javascript代码,它可以在客户端执行。

ContentResult  - 写内容到响应流,不需要视图支持。

FileContentResult  - 返回一个文件到客户端。

FileStreamResult  - 返回一个文件到客户端,它提供的是流。

FilePathResult  - 返回一个文件到客户端

29、JavaScript中的“==“和”===”区别?

==:判断两个变量是否相同,仅限于值,如果值相同而类型不同,那么JavaScript引擎会在内部做类型转换;

===:判断两个变量是否相同,无论是值还是类型,如果类型不同而值相同,也会返回false,而引擎不会在内部进行转换。

30、JavaScript中的“undefined、null”区别?

通俗地讲,undefined出现的原因是JavaScript引擎不知道这是个什么东西,而对于null,JavaScript引擎识别了它,但是没有被分配内存空间。

undefined的类型就是undefined,而null的类型是object。

31、简述javascript的作用域和闭包?

js变量的作用域是指:函数内定义的局部变量只在此函数内有效,而全局变量可以全局有效。

闭包的作用就在于能够改变局部变量的作用域,将值保存下来,但是如果使用不当会造成无法回收变量,引起性能问题,甚至崩溃。

32、不用中间变量交换两个变量?

int i = 10;

int j = 20;

Console.WriteLine("i={0},j={1}", i, j);

i = i + j;//i=30

j = i - j;//j=10;

i = i - j;//i=20;

Console.WriteLine("i={0},j={1}", i, j);

33.请编程实现一个冒泡排序算法?

答:

      public static void BubbleSort(int[] array)
        {
            if (array == null || array.Length == 0) return;
            for (int i = 0; i < array.Length; i++)
            {  
                for (int j = 0; j < array.Length - 1 - i; j++)
                {
                    if(array[j]>array[j+1])
                    {
                        int temp = array[j];
                        array[j] = array[j + 1];
                        array[j + 1] = temp;
                    }
                }
            }
        }

34. 一列数的规则如下: 1、1、2、3、5、8、13、21、34......  求第30位数是多少, 用递归算法实现。

答:    

      static void Main(string[] args)
        {
            Foo(30);
        }
public static int Foo(int i) { if (i <= 0) { return 0; } else if (i > 0 && i <= 2) { return 1; } else { return Foo(i - 1) + Foo(i - 2); } }

35.产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复。

       static void Main(string[] args)
        {
            int[] array = GenerateNums(100);
        }
        public static int[] GenerateNums(int length)
        {
            int[] array = new int[length];

            ArrayList list = new ArrayList();
            Random random = new Random();
            while(list.Count < length)
            {
              int num = random.Next(1, length + 1);
                if(!list.Contains(num))
                {
                    list.Add(num);
                }
            }
            for (int i = 0; i < length; i++)
            {
                array[i] = (int)list[i];
            }
            return array;

        }

36.写出一条Sql语句:取出表A中第31到第40记录(SQLServer,以自动增长的ID作为主键,注意:ID可能不是连续的)

答:解1:  select top 10 * from A where id not in (select top 30 id from A)

      解2:  select top 10 * from A where id > (select max(id) from (select top 30 id from A )as A)

37、索引的作用?和它的优点缺点是什么?

索引就一种特殊的查询表,数据库的搜索引擎可以利用它加速对数据的检索。它很类似与现实生活中书的目录,不需要查询整本书内容就可以找到想要的数据。索引可以是唯一的,创建索引允许指定单个列或者是多个列。缺点是它减慢了数据录入的速度,同时也增加了数据库的尺寸大小。

38、什么是事务?什么是锁?

事务就是被绑定在一起作为一个逻辑工作单元的SQL语句分组,如果任何一个语句操作失败那么整个操作就被失败,以后操作就会回滚到操作前状态,或者是上有个节点。为了确保要么执行,要么不执行,就可以使用事务。要将有组语句作为事务考虑,就需要通过ACID测试,即原子性,一致性,隔离性和持久性。

锁:锁是实现事务的关键,锁可以保证事务的完整性和并发性。与现实生活中锁一样,它可以使某些数据的拥有者,在某段时间内不能使用某些数据或数据结构。当然锁还分级别的。

39、什么叫视图?游标是什么?

视图是一种虚拟的表,具有和物理表相同的功能。可以对视图进行增,改,查,操作,试图通常是有一个表或者多个表的行或列的子集。对视图的修改不影响基本表。它使得我们获取数据更容易,相比多表查询。

游标:是对查询出来的结果集作为一个单元来有效的处理。游标可以定在该单元中的特定行,从结果集的当前行检索一行或多行。可以对结果集当前行做修改。一般不使用游标,但是需要逐条处理数据的时候,游标显得十分重要

40、触发器的作用?

触发器是一中特殊的存储过程,主要是通过事件来触发而被执行的。它可以强化约束,来维护数据的完整性和一致性,可以跟踪数据库内的操作从而不允许未经许可的更新和变化。可以联级运算。如,某表上的触发器上包含对另一个表的数据操作,而该操作又会导致该表触发器被触发。

41、什么是SQL注入式攻击?

所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令。在某些表单中,用户输入的内容直接用来构造(或者影响)动态SQL命令,或作为存储过程的输入参数,这类表单特别容易受到SQL注入式攻击。

42、横表、纵表转换

纵表结构 TableA 

Name

Course

Grade

张三

语文

75

张三

数学

80

张三

英语

90

李四

语文

95

李四

数学

55

 横表结构 TableB

Name

语文

数学

英语

张三

75

80

90

李四

95

55

0

先理解:

select Name

 (case Course when ‘语文‘ then Grade else 0 end) as 语文,

 (case Course when ‘数学‘ then Grade else 0 end) as 数学,

 (case Course when ‘英语‘ then Grade else 0 end) as 英语

from TableA

然后理解标准答案:

select Name

sum(case Course when ‘语文‘ then Grade else 0 end) as 语文,

sum(case Course when ‘数学‘ then Grade else 0 end) as 数学,

sum(case Course when ‘英语‘ then Grade else 0 end) as 英语

from TableA

group by Name

横表转纵表的"SQL"示例

横表结构: TEST_H2Z

      ID      姓名    语文        数学       英语     

      1       张三     80         90         70           

      2       李四     90         85         95         

      3       王五     88         75         90         

转换后的表结构

      ID     姓名     科目     成绩 

      1       张三     语文     80 

      2       张三     数学     90 

      3       张三     英语     70 

      4       李四     语文     90 

      5       李四     数学     80   

      6       李四     英语     99 

      7       王五     语文     85 

      8       王五     数学     96 

      9       王五     英语     88  

横表转纵表SQL示例:
SELECT   姓名,'语文'   AS     科目,语文   AS   成绩   FROM   TEST_H2Z   UNION   ALL 
SELECT   姓名,'数学'   AS     科目,数学   AS   成绩   FROM   TEST_H2Z   UNION   ALL 
SELECT   姓名,'英语'   AS     科目,英语   AS   成绩   FROM   TEST_H2Z
ORDER BY 姓名,科目 DESC; 

43、删除姓名、年龄重复的记录

Id  name  age  salary

1   yzk    80  1000

2   yzk    80  2000

3   tom    20  20000

4   tom    20  20000

5   im     20  20000

//取得不重复的数据

select * from Persons where Id in(SELECT     MAX(Id) AS Expr1 FROM         PersonsGROUP BY Name, Age) 

根据姓名、年龄分组,取出每组的Id最大值,然后将Id最大值之外的排除。

删除重复的数据:

delete from Persons where Id not in(SELECT  MAX(Id) AS Expr1 FROM  Persons GROUP BY Name, Age)

44.假设数据库中有UserIncome两张表如下,请仔细分析下方的示例数据,然后写出SQL,得到右方的查询结果。

答:select Name,Year,Month,Income from(select UserId,Year,Month,Sum(Amount) Income from Income group by UserId,Year,Month)A join [User] on A.UserId = [User].Id

45.现有如下实体类:

    public class User
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }
    public class Income
    {
        public int Id { get; set; }
        public int UserId { get; set; }
        public decimal Amount { get; set; }
        public int Year { get; set; }
        public int Month { get; set; }    
   }
   public class UserIncomeDto
    {
        public string Name { get; set; }
        public int Year { get; set; }
        public int Month { get; set; }
        public decimal Income { get; set; }
   }

    请用LINQ的方式得到上一题的查询结果。

public List<UserIncomeDto> GetUserIncomeDtos(List<User> users, List<Income> incomes)
        {
            var query1 = from income in incomes
                         group income by new { income.UserId, income.Year, income.Month } into g
                         select new { g.Key.UserId, g.Key.Year, g.Key.Month, Income = g.Sum(s => s.Amount) };
            var query2 = from income in query1
                         join user in users on income.UserId equals user.Id
                         select new UserIncomeDto() { Name = user.Name, Year = income.Year, Month = income.Month, Income = income.Income };

            return query2.ToList();
        }
原文地址:https://www.cnblogs.com/marshhu/p/6935163.html