.NET测试(C#基础----C#高级编程----SQL Server----ADO.NET----Web前端)

1.说明值类型和引用类型的区别?

值类型

  1. 存储在堆栈中
    2.从System.ValueType中派生
    3.直接存储其值
    4.空间小,调用速度快
    5.内存自动释放
    6.有结构体、枚举、可空类型
    引用类型
  2. 存储在堆中
    2.从System.Object中派生
    3.直接存储其值的引用指针
    4.空间大,调用速度慢
    5.由GC自动释放
    6.有object、string、集合、数组
    **

2.C#访问修饰符的作用?

private:私有成员,类内部可访问,类和类成员
public:公开成员,没有访问限制,所有的都可以访问,类和类成员
protected:保护成员,类内部和继承类可访问,类和内嵌类
internal:同一程序集下可访问,类和内嵌类
internal protected/protected internal:同一程序集下可访问,类和内嵌类
**
**

3.ADO.NET的五大主要对象?

DataConnection 连接数据库
DataCommand 执行语句命令
DataSet 数据存储器
DataAdapter 适配器,用于填充数据
DataReader 数据读取器,用于向前只读的数据流
**
**

4.C#委托是什么?事件是不是委托?委托和事件的关系?

事件:是一种消息机制,它是特殊的委托;
委托:将方法作为方法的参数代入到另一个方法中。
委托和事件没有可比性,因为委托是类型,事件是对象。
委托的本质,是一个类,而事件,是一个委托类型的私有变量加上两个公有方法(事件的+=和-=),这是本质区别。

**
**

5.重写和重载的区别?out和ref的区别?

重载:方法名称相同,参数列表不同,调用时编译器会根据实际传入参数的形式,选择与其匹配的方法执行;
重写:当一个子类继承父类时,子类中的方法父类中的方法名称、参数个数、参数类型一致时,就说明这个子类重写了其父类。
相同点:都是多态的体现,同名方法
不同点:
重载是参数不同,重写必须一致;
重载可以没有返回值,重写返回值必须一致;
重载编译时多态,重写运行时多态;
重载不需要继承,重写必须继承。
out参数
输出参数
①方法中的out参数在方法体结束前,必须对out参数赋值;
②方法中的形参为out类型时,对应的实参也必须带有out关键字;
③在调用out参数的方法时,必须准备一个相同类型的变量来接收out的结果,并且必须带有关键字;
④可视作out参数为方法的返回值
ref参数
引用传参
①方法中的形参为ref类型时,则对应得实参也必须带有ref关键字;
②调用方法时,方法内如果发生变化时,那么这个参数会永久性的发生改变
**
**

6.C#索引器是否只能根据数字进行索引?是否允许多个索引器参数?

索引器不止是根据数字进行索引,参数的个数和类型都是任意的,用reflector反编译可以看出,索引器的内部本质上就是set_item、get_item方法。
索引的语法:
public string this[string s],通过get、set块来定义取值、赋值的逻辑
索引可以有多个参数、参数类型任意
索引可以重载。
如果只有get没有set就是只读的索引。
索引其实就是set_Item、get_Item两个方法。

**
**

7.属性和public字段的区别是什么?调用set方法为一个属性设值,然后用get方法读取出来的值一定是set进去的值吗?

属性可以对设值、取值的过程进行非法值控制,例如:年龄不能设置为负值;而字段则不能进行这样的设置。
虽然一般情况下get读取的值就是set设置的值,但是可以让get读取的值不是set设置的值的。

**
**

8.装箱和拆箱。

装箱
将值类型转换成引用类型----将小的包装成大的
拆箱
将引用类型转换成值类型----将大的拆分成小的-----前提是先装箱

**
**

9.CTS、CLS、CLR分别代表什么?对应的作用是什么?

CTS:通用类型系统:一种确定公共语言运行库如何定义、使用和管理类型的规范;
CLS:公共语言规范:是许多应用程序所需的一套基本语言功能;
CLR:公共语言运行库:运行代码并提供使开发过程更轻松的服务。
**
**

10.类和结构的区别?

不同点:
类:属于引用类型,可以继承和被继承,有构造函数和析构函数,必须有new初始化,可以有字段赋值;
结构:属于值类型,不可以继承和被继承,没有构造函数但可以添加,没有析构函数,可以不new初始化,没有字段赋值
相同点:
①基类型都是对象(object),c#中所有类型的基类型都是object;
②都有属性和方法
**
**

11.类和接口的区别?抽象和虚拟有什么区别?

不同点:
类能实例化,接口不能实例化。
接口不包含方法的实现。
类只能单继承,接口可以多继承。
接口中不能包含常量、字段、构造函数、析构函数、静态成员。
相同点:
接口、类都可以从多个接口继承。
接口和类都可以包含事件、索引器、属性。
虚拟virtual、2. 抽象abstract
抽象方法是只有方法名称,没有方法体,子类继承父类时必须重写父类抽象方法;
(虚拟)虚函数有方法体,子类可以继承父类,也可以重写,但是子类可以覆盖,也可不覆盖。
相同点:都是为了重写
两者区别:
(1)虚方法有方法体,抽象方法没有方法体。抽象方法是一种强制派生类覆盖的方法,否则派生类将不能被实例化;
(2)抽象方法只能在抽象类中声明,虚方法不是;
(3)派生类必须重写抽象类中的抽象方法,虚方法则不必要。
**
**

12.string和stringBuilder的区别?

字符串属于引用类型:
string来自System.Object 的命名空间,
string是C#中的类,String是.net Framework的类,
string是关键字,String不是,也就是说string不能作为类、结构、枚举、字段、变量、方法、属性的名称,而String可以
StringBuilder属于引用类型
来自System.Text的命名空间,自身是类,使用时必须实例化,支持空参数构造,默认是空字符串,它是可变参数,初始化时,如果字符串长度超出初始化的大小时,
会开辟一个新的地址空间,将原来字符串的内容复制到新的空间中,再追加超出的长度,旧空间会自动销毁,引用新空间地址,新空间大小是旧空间大小的基础倍。
**

13.DataSet和DataReader区别?

  1.   DataReader是数据管理提供者类,而DataSet是一般性数据类。
    
  2.   DataSet获取数据需要通过桥梁DataAdapter的填充,由于DataReader本身就是管理提供者,它可以通过Command的ExecuteReader()方法就可以获取数据。
    
  3.   DataReader是在线处理,当连接关闭后就不能读取数据;DataSet可以离线处理数据,它是把数据从数据库拷贝到本地存储,在关闭连接的情况下仍然可以在DataSet中处理数据,甚至可以在本地存储的表格中增加限制。
    
  4.   DataReader只能正向读取数据,但不能修改数据;DataSet可以按任何顺序读行,可以按灵活的方式搜索、排序和过滤这些行,甚至可以改变这些行,然后将这些改变同步到数据库中。
    
  5.   从DataReader读取数据的速度快于DataSet。
    
  6.   由于DataSet是离线处理,所以当在事务处理中要锁定数据库时,不可以使用DataSet。因为当DataSet被填充以后,会自动断开与数据库的连接,此时不可能再对数据库进行锁定。
    

**
注意:
DataReader使用时始终占用SqlConnection,在线操作数据库
每次只在内存中加载一条数据,所以占用的内存是很小的
是只进的、 只读的
DataSet则是将数据一次性加载在内存中.抛弃数据库连接…读取完毕即放弃数据库连接(非连接模式)
DataSet将数据全部加载在内存中.所以比较消耗内存…但是确比DataReader要灵活…可以动态的添加行,列,数据.对数据库进行 回传更新操作(动态操作读入到内存的数据)
**

14.单例模式的作用?

好处:①封装了唯一性,可严格控制客户怎样访问以及何时访问;

​ ②内存中只有一个对象,可节约系统资源,提高系统性能;

如何实现:①将构造函数私有化

​ ②使用一个公开静态类

​ ③使用一个静态属性进行判断当前窗口是否被创建
**
**

15.C#怎样进行捕获异常?

采用try…catch…catch…结构,发生错误时,层层上抛,直到找到匹配的catch为止。

try:一个 try 块标识了一个将被激活的特定的异常的代码块。后跟一个或多个 catch 块。
catch:程序通过异常处理程序捕获异常。catch 关键字表示异常的捕获。
finally:finally 块用于执行给定的语句,不管异常是否被抛出都会执行。
**
**

16.SQL的三大范式?

第一范式:字段不能有冗余信息,所有字段都是必不可少的。
第二范式:满足第一范式并且表必须有主键。
第三范式:满足第二范式并且表引用其他的表必须通过主键引用。
**

17.SQL注入是什么?如何防止?

利用SQL关键字对网站进行攻击。
防止:
使用参数化的SQL就可以避免SQL注入;
存储过程执行所有的查询。
**
**

18.数据的完整性包括哪些方面?

保证数据库完整性:实体完整性、区域完整性、参照完整性
**

19.SQL中的左联接和右联接怎样查询?

左联接:如果左表的某一行在右表中没有匹配行,则右联接的结果集行中,右表的所有选择列表均为空(上下排列);

右联接:将返回表中的所有行,如果右表的某一行在左表中没有匹配行,则左表返回空值(左右排列)
**
**

20.事务、视图、索引作用?

事务:事务是指一个工作单元,它包含了一组数据操作命令,这组命令要么执行,要么不执行;
视图:视图是一种虚拟表,可对虚拟表进行增改查操作;
索引:索引像书的目录,它提供了数据的逻辑,合理划分索引能够大大提高数据库性能;
**
**

21.使用SQL语句查询第30到40条数据?

两种写法:
SELECT TOP(5) * FROM [User] WHERE ID NOT IN(SELECT TOP(10) ID FROM [User] ORDER BY ID ASC)
SELECT TOP(5) * FROM [User] WHERE ID>(SELECT MAX(ID) FROM [User] WHERE ID IN(SELECT TOP(10)ID FROM [User] ORDER BY ID ASC))
**
**

22.数组和集合的区别?

①数组是静态的,定长的,不能改变其大小,集合是不定长的,可根据其内容改变大小;
②数组声明其类型,集合不声明;
③数组是多维的,集合是一维的;
④数组存放类型只能是一种,集合不止一种
**
23.假设int i=21;
求~i结果为-22;
求i%5的结果为1;
求int j=(i/5)++的结果为4
**

24.T-SQL语言包含哪三种常用语言?详细描述

数据定义语言(DDL):Data Definition Language,用来定义和管理数据库及其对象,例如:create、alter、drop等;

数据操纵语言(DML):Data Manipulation Language,实现对数据库表,各对象的操作,例如:insert、update等;

数据控制语言(DCL):Data Control Language,实现对数据库进行安全管理和权限管理等控制,例如:grant、revoke、deny等
**

25.Socket通信编程的详细步骤?

服务端:
①创建一个Socket对象,用函数Socket();
②用指定的IP地址、端口号信息建立一个EndPoint对象;
③使用函数Bind()绑定EndPoint;
④开始监听listen();
⑤连接客户端,用函数accept();
⑥收发数据,用函数Send()和Receive();
⑦关闭网络连接
⑧关闭监听
服务端:
①创建一个Socket对象,用函数Socket();
②用指定的IP地址、端口号信息建立一个EndPoint对象;
③设置要连接对方的IP地址、端口号信息;
④连接服务器,用函数connect();
⑤收发数据,用函数Send()和Receive();
⑥关闭网络连接
**
**

26.详细介绍说明三层架构?

数据访问层(DAL)主要是存放对数据类的访问,即对数据库的添加、删除、修改、更新等基本操作

业务逻辑层(BLL)对传送数据进行逻辑判断分折,并进行传送正确的值。

表示层(UI)为了与用户交互的界面。
**
**

27.存储过程的作用?

①加快系统的运行速度

②封装复杂操作

③实现代码重用

④增强安全性

⑤减少网络流量
**
**

28.JS基本数据类型有哪些?

简单数据类型:数字类型(Number),字符串类型(String),布尔类型(bool)

复杂数据类型:空类型(null),未定义类型(undefined),对象类型(Object)
**
**

29.介绍“”、null、undefind的区别?

“ ”:是字符串类型的默认值,占用内存

null:null用来表示尚未存在的对象,常用来表示函数企图返回一个不存在的对象。转换为值返回0.

undefined:当声明的变量还未被初始化时,变量的默认值为undefined。转换为值返回NAN。
**
**

30.介绍post和get的区别?

get 方法:【默认值】将数据附加在网址的后面进行传输

①所有出现文件名(URL)的地方都可以打开?进行get方式传值

②只能用来传输少量的数据
3)在网址后面可以直接看到,不安全

post方法:不会附加在网址后面(隐形的传值)

①post方式可以传大量数据(上传文件)

②隐形传输,非常安全
**
**

31.介绍一个Const和ReadOnly的区别?

const是静态常量:是指编译器在编译时会对常量进行解析,并将常量的值替换成初始化的值;
ReadOnly是动态常量:是指在运行时获得的,编译器在编译期间标识为只读常量,而不用常量的值代替;
区别:
Const修饰的常量在声明的时候必须初始化,ReadOnly则可以延迟到构造函数初始化;
Const常量既可以声明在类中还可以在函数体内,ReadOnly只能在类中;
Const修饰的常量在编译期间就被解析,ReadOnly修饰的常量则延迟到运行的时候才被解析
**
**

32.冒泡排序

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 算法练习
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] arr = { 2, 54, 7, 23, 11, 89 };
            for (int i = 0; i < arr.Length; i++)
            {
                for (int j = 0; j < arr.Length-i-1; j++)
                {
                    if (arr[j]>arr[j+1])
                    {
                        int temp = arr[j];
                        arr[j] = arr[j + 1];
                        arr[j + 1] = temp;
                    }
                    
                }
            }
            for (int i = 0; i < arr.Length; i++)
            {
                Console.Write(arr[i]+" ");
            }
            Console.ReadLine();
        }
    }
}

**
**

33.递归算法求出斐波那契数列?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 斐波那契数列
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("请输入斐波那契数列:");
            int i=int.Parse(Console.ReadLine());
            int result=GetSet(i);
            Console.WriteLine("求出斐波那契数列第{0}是{1}",i,result);
            Console.ReadLine();
        }
        //1,1,2,3,5,8
        static int GetSet(int j)
        {
            int res = 0;
            if (j==1)
            {
                res = 1;
            }
            else if (j==2)
            {
                res = 1;
            }
            else
            {
                res = GetSet(j - 1) + GetSet(j - 2);          
            }
            return res;
        }
    }
}

**
**

34.使用算法求出从一个数组中取出不重复数字的个数

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 随机数
{
    class Program
    {
        static void Main(string[] args)
        {
            Random r = new Random();
            int[] arr = new int[5];
            for (int i = 0; i < arr.Length; i++)
            {
                arr[i] = r.Next(1, 21);
                if (i>0)
                {
                    for (int j = 0; j < i; j++)
                    {
                        if (arr[i]==arr[j])
                        {
                            i--;
                        }
                    }
                }
            }
            for (int i = 0; i < arr.Length; i++)
            {
                Console.Write(arr[i]+" ");
            }
            Console.ReadLine();
        }
    }
}

**
**

35.说出B/S和C/S的区别?

C/S(客户端服务) B/S(浏览器端服务)
(体积)胖客户端 瘦客户端
(效率)本地运行 服务器端运行
(网络)依赖不强 必须依赖网络
(用户)体验更好 其次
**

猜你喜欢

转载自blog.csdn.net/wuke666666/article/details/89419538