1. C#中类成员的访问修饰符有哪些?
public : 公共成员,完全公开,没有访问限制。
protected : 保护成员,该类内部和继承类中可以访问。
internal: 在同一程序集内可以访问。
private : 私有成员, 在类的内部才可以访问。
2. C#中的基本数据类型有哪些?
值类型:
- 有符号整数(由小到大):sbyte、short、int、long
- 无符号整数(由小到大):byte、ushort、uint、ulong
- 浮点型:float、double、decimal
- 布尔型:bool
- 字符型:char
引用类型:string、object
3. C#中,哪些类型是值类型?哪些类型是引用类型?(数据类型)
值类型有数值类型int,long,float这些,还有 结构体,bool型,枚举,可空类型
引用类型有字符串string,数组,接口,委托,class,object
4. 值类型和引用类型 是什么 区别
值类型的变量直接存储数据,占用空间固定,保存与复制的是值的本身
引用类型的变量持有的是数据的引用,数据存储在数据堆中,占用的空间不固定,保存与复制的是指向对象的一个指针
5. struct和class有什么区别?
struct是值类型,数据量较小时,结构体更可取,不能抽象。不允许被继承。
class是引用类型,当有大量数据时,使用类。允许被继承。
6. null和string.Empty区别
str == str4,是表示为null,也就是没有分配内存空间,也就是只有声明没有实现
str2 == str3 ,空字符串,分配了内存空间
string str = null;
string str2 = string.Empty;
string str3 = "";
string str4;
7. 封装
说明:
封装是将函数和属性包装在一个类中的过程
作用:
隐藏实现细节 :在实现过程对类的调用者是不可见的,类的调用者只需调用方法即可,不知道具体实现。可以提高代码的稳定性和可维护性。
提供更好的接口: 封装可以将一系列相关的属性和方法包装在一起,形成一个更清晰、更易于使用的接口。
加强安全性: 封装可以通过访问修饰符(如private、protected、public)来限制对属性和方法的访问权限。
8. 继承
说明:
继承就是子类继承父类的属性和方法,使得子类对象(实例)具有父类的属性和方法,然后子类可以对这些方法进行重用、扩展和修改.
作用:
可以减少冗余代码,提高代码的复用 ,提高开发效率。
9. 多态性
说明:
首先多态的存在必须有三大必要条件继承、重写、父类引用指向子类对象。 那么多态呢跟继承是离不开的,就是说呢在父类中定义的属性和方法被子类继承之后,可以表现出不同的行为, 这使得多个子类在继承一个父类时有不同的表现
作用:
让一个对象可以表现出多种形态,使得代码具有更好的可扩展性、可维护性和可重用性。
10. 抽象
说明:不完整的类,就是抽象类,只有声明,没有实现的方法就是抽象方法,
注意:抽象类中可以没有抽象方法,但是抽象方法一定在抽象类中,
使用:抽象类必须被继承后才能被使用,如果一个类继承了抽象类,该类要么重写抽象类中的所有抽象方法,要么自己也抽象化;
作用:就是用来被子类去继承,子类具有了抽象类已有特征之外,再去扩展自己的新功能。
11. 接口
说明:
接口是一组方法的集合,是行为规范
接口可以包含属性、方法、索引指示器和事件,
接口可以多实现,多继承,并且一个类除了接口之外,还可以继承其它类。
作用:
1、接口可以使项目分离,所有层都面向接口开发,提高开发效率;
2、接口使代码和代码之间的耦合度降低;
12. 接口和抽象类的区别
两者都不直接实例化
接口支持多继承,抽象类不能实现多继承。
接口只能定义抽象规则,抽象类既可以定义规则,还可能提供已实现的成员。
接口可以作用于值类型和引用类型,抽象类只能作用于引用类型。
13. 什么是方法重载和方法重写
方法重载和重写都是一种多态性
重载:同类同名不同参,属于编译时多态。重载是在一个类中定义多个方法名相同的方法,表示一个行为有多种实现方式
重写:同名同参不同类,属于运行时多态。重写是用子类的方法来重写父类的方法,表示相同的方法在父类和子类中具有差异性
14. 构造函数
说明: 构造函数初始化新对象的数据成员,它具有与类相同的名称
注意: 构造函数没有返回值(void也不需要),构造函数只能重载,不能重写,也不能继承
使用: 一个类中可以有多个构造函数,可根据其参数个数,参数顺序,参数类型的不同来区分它们,这称作构造函数的重载
15. 静态类 static关键字
说明:
static 静态的,用于将方法或类共享出来(它只会在内存中存在一份)
使用static后就不用重复new,经常使用的就可以用static修饰
不用实例化,直接类名.方法或属性
static是静态的意思,可以修饰成员变量和成员方法。
static修饰成员变量表示该成员变量只在内存中只存储一份,可以被共享访问、修改。
从程序刚开始运行的时候开始分配内存空间,到程序结束的时候才会释放内存.
作用:
规范和解耦
通过接口可以实现不相关类的相同行为而不需要了解对象所对应的类.
通过接口可以指明多个类需要实现的方法。
通过接口可以了解对象的交互界面,而不需了解对象所对应的类
16. 枚举
说明:
枚举指的是一组固定的常量集合。是一种值
作用:
是为了做信息的标志和信息的分类
17. C#中,运算符“?”和“??”的区别是什么?
?: 可以为 null 的类型 ,定义可空类型变量 ,还可为三元运算符
??: null 合并运算符 , 以防可空类型的值为Null,如果前一个变量的值为null,那么就后面的值
18. C#中,用const和readonly修饰的字段有什么区别?
readonly (只读)和const(常量)都是用来标示常量的。
const修饰的常量必须在声明的同时赋值
19. C#中,new有几种用法?
new 运算符:用于创建对象和调用构造函数。
new 修饰符:在用作修饰符时,new 关键字可以显式隐藏从基类继承的成员。
new 约束:用于在泛型声明中约束可能用作类型参数的参数的类型。
20. C#中,ref和out在修饰方法参数时有什么区别?
ref和out是用来引用参数的传递的
ref参数在传入方法之前必须进行初始化;而out参数在传入方法之前可以不用初始化。
ref参数在方法内部可以直接使用;而out参数在方法内部不能直接使用。
ref参数在方法内部可以使用也可以不使用;而out参数在方法返回之前必须对其赋值。
21. C#中using有几种用法?
using指令,即引用命名空间。
using 定义对象的使用范围,即时释放对象。
22. C#中&和&&,|和||有什么区别?
&:不管前面的条件是否成立,后面的条件依旧会判断
&&:前面的条件不成立,后面的条件就不会判断
| 和 || 同上
23. C#中is和as有什么区别?
is是用来判断类型A能否转化为类型B,一般用来作有继承关系的父类与子类是否可以相互转化的判断。
而as是将类型A转化为类型B,一般也是用来做子类与父类的转换。
24. 依赖注入
说明:
是一种设计模式,我们不是直接在另一个类(依赖类)中创建一个类的对象,而是将对象作为参数传递给依赖类的构造函数。
依赖注入提倡使用接口而不是类
作用:
它有助于编写松散耦合的代码,并有助于使代码更加模块化和易于测试。
使用:
构造函数注入 属性注入 方法注入
25. 事件
关键字 event
在C#中,事件是⼀种⽤于实现发布者-订阅者模式的机制,⽤于在对象之间传递消息和通知。
26. C#委托
说明:
委托(Delegate)是⼀种类型,它允许您将⽅法作为参数传递,并在需要时调⽤该⽅法。
作用:
可以更灵活的调用方法和事件处理
可以使代码更具可扩展性和可维护性。
27. Array和ArrayList有什么区别?
说明:
Array 对象的初始化必须指定大小,且创建后的数组大小是固定的;而 ArrayList 的大小可以动态指定,空间大小可以任意增加
Array 不能随意添加、删除;而 ArrayList 可以在任意位置插入和删除。
使用场景:
当你想存储相同类型的项目时,可以使用Array。Array具有固定大小。
当你要存储任何类型的数据时,我们使用 ArrayList。ArrayList 没有固定大小。
28. 解释 var 和 dynamic
该类型定义的变量都是自动检测变量的类型
var 类型变量的值不能在后面的代码中更改。dynamic可以.
29. C#中的反射
说明:
反射是.NET中的重要机制,通过反射,可以在运行时获得程序或程序集中的每一个类型(包括类,结构,委托,接口和枚举)的成员和成员信息。
作用:
减少代码量。
降低程序之间的耦合性,使框架更加合理。
30. 泛型
说明:
泛指某种类型,
泛型可以让多段代码在不同的数据类型上执行相同的指令。
作用:
提高性能:可以避免装箱和拆箱操作
提高类型安全 :在进行类型转换的时候不会抛出异常
提高代码重用:定义一次,用许多种不同类型实例化
使代码扩展性好
31. C# 9.0 record 类型
说明:
是记录类型,是一种简洁的类声明方式,用于定义数据传输类型,或者用于表示不可变的数据对象。
使用:
当前的数据如果说不打算进行修改,那么可以使用record
32. 密封类 sealed
作用:
让类无法得到继承。
使用 sealed 关键字可以防止继承以前标记为 virtual 的类或某些类成员。
33. C#中的隐式类型转换和显式类型转换
隐式类型转换是指在不显式指定类型的情况下将一种类型转换为另一种类型。例如,将int类型的值转换为double类型的值。
显式类型转换必须显式指定要转换的类型。使用“()”运算符进行显式类型转换,例如:(int)doubleVar。
34. C#中==和equals区别
== 是引用地址的比较
equals() 是内容的比较
35. C# 数组
说明:
数组是一个存储相同类型元素的固定大小的顺序集合
访问:
数组中某个指定的元素是通过索引来访问的。
36. C# 集合
集合(Collection)类是专门用于数据存储和检索的类。
有哪些:
- 动态数组(ArrayList) 它代表了可被单独索引的对象的有序集合。
- 哈希表(Hashtable) 它使用键来访问集合中的元素。
- 排序列表(SortedList)
- 堆栈(Stack)
- 队列(Queue)
37. 什么是类
类(class)是一组具有相同事物和行为的抽象(物以类聚)
-
对象(成品:房子):是真实存在的具体实例。
-
类(设计图:图纸):是对象共同特征的描述(抽象)。
在C#中,必须先设计类,才能获得对象
38. C#装箱和拆箱
说明:
装箱: 将值类型转化为引用类型的过程
拆箱: 将引用类型转化为值类型的过程
作用:
允许值类型的任何值与Obiect 类型的值相互转换,将值类型与引用类型链接起来
但是装箱和拆箱的过程会有性能的消耗,所以一般情况下我们建议使用泛型
39. 数组、List 和 ArrayList区别
Array数组:
- 数组是一种固定长度的数据结构,一旦创建后长度不可变。
- 数组可以存储基本数据类型(如 int、char 等)和对象类型(如类对象)。
- 数组可以使用下标访问元素,访问速度很快。
- 数组没有提供自动的增加或减少长度的机制。
List:
- List 它是一个接口,提供了可变长度的有序集合。
- List 可以存储对象类型,不能直接存储基本数据类型,需要使用对应的包装类。
- List 提供了许多操作元素的方法,如添加、删除、获取元素等。
- List 具有多个实现类,如 ArrayList、LinkedList、Vector 等。
ArrayList:
- ArrayList 是 List 接口的实现类之一。
- ArrayList 使用动态数组实现,可以根据需要动态增加或减少容量。
- ArrayList 对于随机访问元素的速度很快,但插入和删除元素可能会涉及数组元素的移动。
- ArrayList 允许存储重复元素。
40. string与StringBuilder的区别
相同点: StringBuilder和String都是用来接收和处理字符串类型的数据
不同点: string 对象时恒定不变的,stringBuider 对象表示的字符串是可变的。
41. 单例模式
是一个设计模式
一个类只能有一个实例,并提供对该实例的全局访问点。
42. 写出c#中4中循环结构语法
while循环,do while循环,for循环,foreach循环
43. 简述Ajax是什么?为什么要使用Ajax?
Ajax 是指一种创建交互式网页应用的网页开发技术。可以在不刷新页面的情况下更新页面内容。
44. ADO.NET中访问数据库的基本步骤是什么?
一,基于连接的
- 建立数据库连接:使用Connection对象,调用其Open()方法来打开与数据库的连接。
- 创建命令对象:使用Command对象,定义需要执行的SQL命令。
- 执行命令并获取结果:使用DataReader对象,通过ExecuteReader()方法执行SQL命令,并返回一个结果集(DataReader对象)。
- 关闭数据库连接:使用Connection对象,调用其Close()方法来关闭与数据库的连接。
二,基于非连接的
- 创建连接对象:使用Connection对象,设置数据库连接字符串。
- 创建命令对象:使用Command对象,定义需要执行的SQL命令。
- 使用DataAdapter对象,通过其Fill()方法执行SQL命令,向数据库发送查询(或新增、修改和删除)命令,并将结果存入DataSet对象中。
- 在DataSet对象中操作数据:使用DataAdapter对象将数据填充到DataSet对象,使用DataSet对象,可以进行数据的增删改查等操作。 //5. 将对DataSet对象的更改提交到数据库:使用DataAdapter对象,调用其Update()方法将DataSet对象中的更改提交到数据库。
- 关闭连接对象:使用Connection对象,调用其Close()方法来关闭与数据库的连接。
45. ADO.NET中常用对象有哪些?
- Connection对象:(数据库连接对象)用于连接数据库的对象,表示到数据源的一个唯一的连接。
- Command对象:(数据库命令)表示要对数据库执行的一个SQL语句或一个存储过程。
- DataReader对象:(数据库读取器)它与DataSet最大的不同是有连接式的,每次对数据库进行存取都会影响到数据。
- DataAdapter对象:该对象是与DataSet配合使用的对象,用于把表填充到DataSet,和更新DataSet等。
- DataSet对象:(数据集)表示内存中数据的缓存,可以把它想像成一个临时的数据库,它里可以存多个表 (DataTable),而且是断开式的,不用每进行一次操作就对数据库进行更新,从而提高了效率。
- DataTable:这个对象代表着可以在DataSet对象内找到的所有表
- DataColumn:表包含与列有关的信息,包括列的名称、类型和属性。我们可以按照下面的方式创建DataColumn对象,指定数据类型,然后把列加入到表
- DataRow:要填充一个表,我们可以使用命令的自动数据绑定功能,或者也可以手工添加行
- DataRelation:这个对象代表着两个表之间的父-子关系。关系建立在具有同样数据类型的列上
public static string MyProperty { get; set; } = "server=LAPTOP-URFVIGL7\\SQLEXPRESS;database=MyBBSDb;uid=sa;pwd=qq123456;";
//执行查询表,需要参数(查询sql语句,sql语句参数化)1
public static DataTable ExecuteTable(string cmdText,params SqlParameter[] sqlParameters)
{
using SqlConnection conn = new SqlConnection(MyProperty);
conn.Open();
SqlCommand cmd = new SqlCommand(cmdText, conn);
cmd.Parameters.AddRange(sqlParameters);
SqlDataAdapter sda = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
sda.Fill(ds);
return ds.Tables[0];
}
//执行非查询(查询sql语句,sql语句参数化)2
public static int ExecuteNonQuery(string cmdText,params SqlParameter[] sqlParameters)
{
using SqlConnection conn = new SqlConnection(MyProperty);
conn.Open();
SqlCommand cmd = new SqlCommand(cmdText, conn);
cmd.Parameters.AddRange(sqlParameters);
return cmd.ExecuteNonQuery();
}
46. ASP.NET 中页面之间传递值的几种方式?
session
cookie
Application
Request.QueryString
页面隐藏标签
47. 向服务器发送请求有几种方式?
Get;Post;put; delete;
48. ASP.NET缓存有几种实现方式?
基于页面级缓存;基于数据源的缓存;自定义缓存 ;分布式缓存;
49. ASP.NET中的六大对象有哪些?
1.Response 封装了Web服务器向浏览器发送的HTTP响应消息
2.Request 封装了浏览器向Web服务器发送的HTTP请求消息
3.Server 提供对服务器上的方法和属性进行的访问
4.Application 代表运行在Web服务器上的ASP.NET应用程序
5.Session 用于存储特定用户会话所需的信息
6.Cookie 用户会话,在设置超时时间后,存储在客户端硬盘中;
5. MVC中的各个字母分别代表什么含义?在MVC框架中起什么作用?
M(Model):模型应用的业务逻辑
V(View):视图, 界面设计人员进行图形界面设计。
C(Controller):控制器,负责转发请求,对请求进行处理。
51. ADO.NET中如何避免SQL注入漏洞的?
攻击:
利用 sql 关键字对网站进行攻击。
解决:
过滤关键字,SqlParameter对关键字参数化
52. 简述三层架构层与层之间的关系、以及优缺点?
表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)
DAL–>BLL–>UI
优点:
- 可以降低层与层之间的依赖;
- 有利于标准化;
- 利于各层逻辑的复用。
缺点
- 降低了系统的性能。
- 有时会导致级联的修改。
- 增加了代码量,增加了工作量
53. 什么是序列化?
序列化是将对象的状态信息转换为可以存储或传输的形式过程。
54. ExecuteScalar 和 ExecuteNonQuery 的区别
ExecuteNonQuery:返回受影响的行数。
ExecuteScalar:返回结果集的第一行第一列,忽略其他行。