C#中口试的常见标题005

[复制链接]
发表于 2025-12-20 00:06:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
1、重载和重写

重载(Overloading)

重载是指在同一个类中界说多个同名方法,但参数列表差别(参数的数目、范例或序次差别)。返回范例可以雷同也可以差别。重载方法答应你根据传入的参数范例和数目来调用差别的方法。
特点

  • 方法名雷同,但参数列表差别。
  • 返回范例可以差别。
  • 编译器根据方法署名(方法名和参数列表)来区分差别的重载方法。
示例
  1. public class Calculator
  2. {
  3.     // 重载方法:加法
  4.     public int Add(int a, int b)
  5.     {
  6.         return a + b;
  7.     }
  8.     // 重载方法:加法,参数为double类型
  9.     public double Add(double a, double b)
  10.     {
  11.         return a + b;
  12.     }
  13. }
复制代码
重写(Overriding)

重写是指在派生类(子类)中重新实现基类中的虚方法(virtual method)。重写答应派生类提供特定的实现,以改变从基类继承来的活动。
特点

  • 方法名和参数列表必须与基类中的虚方法完全雷同。
  • 返回范例必须与基类中的虚方法雷同。
  • 访问修饰符不能比基类方法的访问修饰符更严酷。
  • 必须使用override关键字来明白体现重写。
示例
  1. public class Animal
  2. {
  3.     public virtual void Speak()
  4.     {
  5.         Console.WriteLine("Some sound");
  6.     }
  7. }
  8. public class Dog : Animal
  9. {
  10.     // 重写基类中的Speak方法
  11.     public override void Speak()
  12.     {
  13.         Console.WriteLine("Bark");
  14.     }
  15. }
复制代码
区别


  • 目标差别:重载用于在同一个类中界说多个同名方法,参数差别;重写用于在派生类中改变从基类继承来的方法的活动。
  • 位置差别:重载发生在同一个类中;重写发生在派生类中。
  • 规则差别:重载方法的参数列表必须差别;重写方法的参数列表和返回范例必须与基类中的虚方法雷同。
  • 关键字差别:重写使用override关键字,而重载不须要。
2.ORM框架和Linq关键字

ORM框架

ORM框架的告急特点包罗:

  • 对象映射:将数据库表映射为对象,行映射为对象的属性。
  • 数据查询:使用对象编程语言查询数据库,无需手写SQL。
  • 数据使用:对对象的增编削查使用可以自动转换为数据库使用。
  • 缓存管理:一些ORM框架提供查询结果的缓存管理。
.NET中常用的ORM框架包罗:

  • Entity Framework:微软官方的ORM框架,支持数据库第一和代码第一的开辟模式。
  • NHibernate:一个成熟且功能丰富的ORM框架,支持多种.NET版本
  • Dapper:一种轻量级的ORM框架,专注于性能和简朴性。
LINQ关键字

LINQ提供了一组扩展方法和查询语法,用于查询聚集。以下是一些常用的LINQ关键字和概念:

  •         where:用于过滤数据。
    1. var filteredItems = from item in items where item.Condition == true select item;
    复制代码
  •         select:用于选择或投影数据。
    1. var projectedItems = from item in items select new { item.Property };
    复制代码
  •         from:用于指定查询的数据源。
    1. var query = from customer in customers select customer;
    复制代码
  •         join:用于实验毗连使用。
    1. var joinedQuery = from order in orders join customer in customers on order.CustomerId equals customer.Id select new { order, customer };
    复制代码
  •         group:用于对数据举行分组。
    1. var groupedQuery = from item in items group item by item.Category into groupedItems select new { Category = groupedItems.Key, Items = groupedItems };
    复制代码
  •         orderby/orderby descending:用于排序数据。
    1. var orderedQuery = from item in items orderby item.Date descending select item;
    复制代码
  •         aggregate operators:如sum、average、min、max、count等,用于聚合使用。
    1. int count = items.Count();
    2. int sum = items.Sum(item => item.Value);
    复制代码
  •         let:用于为查询中的子句引入一个中心变量。
    1. var query = from item in items let size = item.Size where size > 10 select new { item, size };
    复制代码
LINQ和ORM框架的联合使用,使得开辟者可以以声明式的方式处理惩罚数据库使用,进步了代码的可读性和维护性。比方,Entity Framework使用LINQ作为其查询语言,答应开辟者编写如下代码:
  1. using (var context = new MyDbContext())
  2. {
  3.     var customers = context.Customers
  4.                            .Where(c => c.IsActive)
  5.                            .OrderBy(c => c.Name)
  6.                            .ToList();
  7. }
复制代码
3.多线程,Sleep和wait的区别

Thread.Sleep

Thread.Sleep 是一个静态方法,它属于 System.Threading 定名空间。当调用 Thread.Sleep 时,当火线程会停息实验指定的时间量,让出CPU给其他线程使用。
特点

  • Thread.Sleep 会使当火线程挂起,但不开释任何锁。
  • 它不会开释任何对象的锁定;如果当火线程持有一个或多个锁,这些锁在 Sleep 期间仍旧保持。
  • Thread.Sleep 不能被制止,除非就寝时间竣事大概线程被中断。
示例
  1. Thread.Sleep(1000); // 使当前线程暂停1000毫秒(1秒)
复制代码
Monitor.Wait 和 Object.Wait

Monitor.Wait 是一个方法,它属于 System.Threading 定名空间,用于在同步锁定代码块或方法中期待某个条件。当调用 Monitor.Wait 或 object.Wait 时,当火线程会开释指定对象的锁定,并进入期待状态。其他线程可以通过调用 Monitor.Pulse 或 object.Pulse 来叫醒期待的线程。
特点

  • Monitor.Wait 和 object.Wait 会使当火线程期待,直到被 Pulse 或 PulseAll 叫醒,大概超时。
  • 它们通常与 lock 语句一起使用,以实现线程间的同步。
  • Wait 方法在进入期待状态前会开释对象的锁定,答应其他线程进入同步块。
  • Wait 可以设置超时,使线程在指定的期待时间后继承实验。
示例
  1. object lockObject = new object();
  2. bool condition = false;
  3. void ThreadMethod()
  4. {
  5.     lock (lockObject)
  6.     {
  7.         // 等待条件变为true
  8.         while (!condition)
  9.         {
  10.             Monitor.Wait(lockObject);
  11.         }
  12.         // 条件满足,执行后续操作
  13.     }
  14. }
  15. // 在另一个线程中
  16. lock (lockObject)
  17. {
  18.     condition = true;
  19.     Monitor.Pulse(lockObject); // 唤醒等待的线程
  20. }
复制代码
区别


  • 用途:Thread.Sleep 用于停息线程实验,而 Monitor.Wait 和 object.Wait 用于线程间的同步和和谐。
  • :Thread.Sleep 不开释锁,而 Monitor.Wait 和 object.Wait 在期待前开释锁。
  • 叫醒:Thread.Sleep 无法被外部使用叫醒,只能天然醒来或被中断;Monitor.Wait 和 object.Wait 可以被 Pulse 或 PulseAll 叫醒。
  • 超时:Monitor.Wait 和 object.Wait 可以设置超时,Thread.Sleep 不能。
4.三层架构,使用它的利益

1. 低耦合性


  • 三层架构通过将功能分别为差别的层,使得各层之间的耦合性低落,便于单独修改和维护。
2. 高内聚性


  • 每一层都具有特定的职责,内聚性高,代码更加模块化。
3. 易于测试


  • 由于层与层之间的接口明白,可以单独对业务逻辑层和数据访问层举行单元测试,进步测试的覆盖率和质量。
4. 重用性


  • 业务逻辑层和数据访问层可以被多个体现层重用,进步了代码的重用性。
5. 可维护性


  • 由于分层清楚,新的开辟职员可以更快地明白和维护代码。
6. 可扩展性


  • 可以根据需求独立扩展各层,比方,在不影响业务逻辑层的情况下,更换数据访问层的实现。
7. 分离关注点


  • 开辟者可以专注于单个层的开辟,分离了用户界面、业务规则和数据访问的关注点。
8. 安全


  • 通过在体现层和业务逻辑层之间增长安全控制,可以更好地掩护数据和业务逻辑。
9. 顺应厘革


  • 业务需求厘革时,可以快速调解业务逻辑层或体现层,而不须要修改数据访问层。
10. 技能多样性


  • 团队可以使用差别的技能栈来开辟差别的层,比方,使用ASP.NET MVC作为体现层,C#作为业务逻辑层,Entity Framework作为数据访问层。
11. 性能优化


  • 可以根据性能需求对各层举行优化,比方,在数据访问层实现缓存战略。
12. 摆设机动性


  • 可以独立摆设各层,比方,在差别的服务器上摆设体现层和业务逻辑层,以满意差别的负载需求。
5.Prism依赖注入的几种方式?依赖注入生命周期

Prism依赖注入的几种方式


  •         Register:这种方式用于注册瞬态(Transient)服务,即每次哀求服务时都会创建一个新的实例。
    1. containerRegistry.Register<FooService>();
    2. containerRegistry.Register<IBarService, BarService>();
    复制代码
  •         RegisterSingleton:这种方式用于注册单例(Singleton)服务,即在应用步伐的整个生命周期内,每次哀求服务时都会返回同一个实例。
    1. containerRegistry.RegisterSingleton<FooService>();
    2. containerRegistry.RegisterSingleton<IBarService, BarService>();
    复制代码
  •         RegisterScoped:这种方式用于注册作用域(Scoped)服务,即在每个容器作用域内创建一个新的实例,但在特定作用域内保持同一个实例。
    1. containerRegistry.RegisterScoped<FooService>();
    复制代码
依赖注入生命周期

Prism支持三种服务生命周期:

  •         Transient:每次哀求服务时都会创建一个新的实例。实用于不须要保持状态的服务。
  •         Singleton:整个应用步伐生命周期内只创建一个实例。实用于须要全局访问点或须要保持状态的服务。
  •         Scoped:在每个容器作用域内创建一个新的实例,但在特定作用域内保持同一个实例。这在Web应用步伐中常用于哀求作用域,但在桌面和移动应用步伐中,Prism.Maui会在每个页面附近创建一个作用域,用于INavigationService、IPageDialogService和IDialogService等服务。
6.触发器有哪些


  •         DML触发器

    • INSERT触发器:在向表中插入数据时触发。
    • UPDATE触发器:在修改表中数据时触发。
    • DELETE触发器:在从表中删除数据时触发。

  •         DDL触发器

    • 这类触发器在数据库结构发生厘革时触发,如CREATE、ALTER、DROP等事故。

  •         登录触发器

    • 在用户登录过程中触发,通常用于身份验证和日记记载。

  •         行级触发器

    • 针对表中每一行数据厘革触发一次。

  •         语句级触发器

    • 针对一次数据使用(如一次INSERT、UPDATE或DELETE语句)触发一次。

  •         BEFORE触发器

    • 在触发事故发生之前实验。

  •         AFTER触发器

    • 在触发事故发生之后实验。

  •         INSTEAD OF触发器

    • 代替触发动作实验,并在处理惩罚束缚之前引发。

  •         CLR触发器

    • 可以是AFTER触发器或INSTEAD OF触发器,实验在托管代码中编写的方法,而不消实验Transact-SQL存储过程。

7.Socket心跳

1. 客户端自动发送心跳

客户端定期自动向服务器发送心跳包,服务器收到心跳包后复兴确认。如果服务器在肯定时间内没有收到心跳包,就会以为客户端已经断开毗连。这种方式对服务器性能要求不高,实用于服务器性能有限的场景。
2. 服务器自动发送心跳

服务器创建定时器,定时发送心跳包给客户端,客户端收到后立刻复兴。如果服务器在规定时间内没有收到客户端的复兴,就以为客户端毗连不可用,实验开释socket使用。这种方式对服务器性能要求较高。
3. 使用SO_KEEPALIVE套接字选项

在Linux体系中,可以通过设置SO_KEEPALIVE套接字选项来启用TCP层的心跳机制。这须要在Socket选项中设置几个参数:TCP_KEEPIDLE(空闲时间)、TCP_KEEPINTVL(心跳隔断)和TCP_KEEPCNT(最大心跳次数)。如果凌驾空闲时间没有数据传输,体系会自动发送心跳包,如果在指定的心跳次数内没有收到相应,体系会以为毗连已经断开。
4. 应用层自实现心跳

应用步伐本身发送心跳包来检测毗连是否正常。服务器每隔肯定时间向客户端发送一个短小的数据包,然后启动一个线程,在线程中不停检测客户端的回应。如果在肯定时间内没有收到客户端的回应,即以为客户端已经掉线;同样,如果客户端在肯定时间内没有收到服务器的心跳包,则以为毗连不可用。
心跳的作用


  • 关照服务器客户端的存活状态,防止服务器在客户端长时间无运动后开释资源。
  • 定时革新NAT表里网IP映射表,防止NAT路由器移除映射表导致毗连制止,影响用户体验。
8.数据库除增编削查外还会什么使用

1. 数据聚合(Aggregation)

使用聚合函数(如SUM, AVG, MAX, MIN, COUNT)对数据举行汇总盘算。
  1. SELECT COUNT(*), AVG(salary) FROM employees;
复制代码
2. 数据分组(Grouping)

使用GROUP BY子句对结果集举行分组,通常与聚合函数一起使用。
  1. SELECT department_id, SUM(salary) FROM employees GROUP BY department_id;
复制代码
3. 数据排序(Sorting)

使用ORDER BY子句对查询结果举行排序。
  1. SELECT * FROM customers ORDER BY last_name ASC, first_name DESC;
复制代码
4. 数据毗连(Joining)

使用JOIN子句毗连多个表,以归并来自差别表的数据。
  1. SELECT customers.name, orders.order_id FROM customers JOIN orders ON customers.customer_id = orders.customer_id;
复制代码
5. 子查询(Subqueries)

在查询中嵌套另一个查询,用于复杂的数据检索。
  1. SELECT * FROM employees WHERE salary > (SELECT AVG(salary) FROM employees);
复制代码
6. 事故管理(Transaction Management)

控制事故的开始、提交和回滚,确保数据的划一性和完备性。
  1. BEGIN TRANSACTION;
  2. -- 一系列数据库操作
  3. COMMIT; -- 或 ROLLBACK;
复制代码
7. 索引管理(Index Management)

创建和管理索引,以优化查询性能。
  1. CREATE INDEX idx_lastname ON customers(last_name);
复制代码
8. 视图创建(View Creation)

创建视图,作为查询结果的假造表。
  1. CREATE VIEW high_earners AS SELECT * FROM employees WHERE salary > 100000;
复制代码
9. 数据界说语言(DDL)使用

包罗创建、修改和删除数据库对象(如表、视图、索引、触发器等)。
  1. CREATE TABLE new_table (column1 INT, column2 VARCHAR(255));
  2. ALTER TABLE existing_table ADD new_column INT;
  3. DROP TABLE obsolete_table;
复制代码
10. 数据备份与规复(Backup and Restore)

备份数据库以防数据丢失,并在须要时规复数据。
  1. -- 备份操作依赖于具体的数据库管理系统
  2. BACKUP DATABASE myDatabase TO DISK = 'backup.bak';
  3. -- 恢复操作
  4. RESTORE DATABASE myDatabase FROM DISK = 'backup.bak';
复制代码
11. 数据库权限管理(Privilege Management)

设置和管理用户权限,控制对数据库对象的访问。
  1. GRANT SELECT, INSERT ON employees TO new_user;
  2. REVOKE UPDATE ON employees FROM another_user;
复制代码
12. 数据库监控监控和优化(Monitoring and Optimization)

监控监控数据库性能,分析查询操持,优化查询和数据库结构。
13. 数据库迁徙(Database Migration)

将数据从一个数据库迁徙到另一个数据库,大概涉及差别的数据库体系。
9.排序的关键字、降序关键字、默认排序、分组的关键字

排序的关键字:ORDER BY

ORDER BY 是用于对查询结果举行排序的关键字。
  1. SELECT column1, column2
  2. FROM table_name
  3. ORDER BY column1, column2;
复制代码
降序关键字:DESC

DESC(Descending 的缩写)关键字用于指定排序序次为降序,即从大到小。
  1. SELECT column1, column2
  2. FROM table_name
  3. ORDER BY column1 DESC, column2 DESC;
复制代码
默认排序:ASC

ASC(Ascending 的缩写)关键字用于指定排序序次为升序,即从小到大。这是默认的排序序次,纵然不写 ASC,SQL也会按照升序排序。
  1. SELECT column1, column2
  2. FROM table_name
  3. ORDER BY column1 ASC, column2 ASC;
复制代码
分组的关键字:GROUP BY

GROUP BY 是用于将结果集按照一个或多个列的值举行分组的关键字,通常与聚合函数一起使用。
  1. SELECT column1, COUNT(*)
  2. FROM table_name
  3. GROUP BY column1;
复制代码
聚合函数

聚合函数用于对分组后的数据举行盘算,如 SUM(), AVG(), MAX(), MIN(), COUNT() 等。
  1. SELECT column1, SUM(column2), AVG(column2), MAX(column2), MIN(column2), COUNT(*)
  2. FROM table_name
  3. GROUP BY column1;
复制代码
过滤分组结果:HAVING

HAVING 关键字用于对分组后的结果举行过滤,雷同于 WHERE 用于过滤行。
  1. SELECT column1, COUNT(*)
  2. FROM table_name
  3. GROUP BY column1
  4. HAVING COUNT(*) > 1;
复制代码
10.数据库游标及用处

游标的特点


  • 逐行处理惩罚:游标答应你逐行访问结果集,这在须要对每行数据举行迭代处理惩罚时非常有用。
  • 控制使用:你可以控制如那边置惩罚结果会集的每一行,比方,更新或删除特定的行。
  • 机动性:游标提供了一种机动的方式来处理惩罚查询结果,尤其是在复杂的业务逻辑中。
游标的用途


  • 分批处理惩罚:当处理惩罚大量数据时,使用游标可以分批处理惩罚结果,克制一次性加载过多数据到内存中。
  • 复杂盘算:在须要对结果会集的数据举行复杂盘算或逻辑判断时,游标可以逐行处理惩罚数据。
  • 更新和删除:游标可以用来定位特定的行,并举行更新或删除使用。
  • 报表天生:在天生报表时,游标可以用来逐行处理惩罚数据,以便举行格式化输出。
  • 数据迁徙:在数据迁徙过程中,游标可以用来逐行比力和同步数据。
使用游标的例子(SQL Server)
  1. -- 声明游标
  2. DECLARE my_cursor CURSOR FOR
  3. SELECT column1, column2
  4. FROM table_name
  5. WHERE condition;
  6. -- 打开游标
  7. OPEN my_cursor;
  8. -- 从游标中提取数据
  9. FETCH NEXT FROM my_cursor INTO @variable1, @variable2;
  10. -- 循环处理
  11. WHILE @@FETCH_STATUS = 0
  12. BEGIN
  13.     -- 处理逻辑
  14.     -- 例如:更新数据
  15.     UPDATE table_name SET column1 = @variable1 WHERE CURRENT OF my_cursor;
  16.     -- 提取下一行数据
  17.     FETCH NEXT FROM my_cursor INTO @variable1, @variable2;
  18. END
  19. -- 关闭游标
  20. CLOSE my_cursor;
  21. -- 释放游标
  22. DEALLOCATE my_cursor;
复制代码
注意事项


  • 性能:游标大概会影响查询性能,尤其是在处理惩罚大量数据时。只管克制在性能敏感的场景中使用游标。
  • 资源斲丧:游标大概会占用较多的体系资源,尤其是在长时间运行的事故中。
  • 锁定:使用游标时,大概会锁定结果会集涉及的行,这大概会影响并发访问。
11.什么是低位在前,高位在后

在二进制数中的体现:

在二进制数中,"低位在前,高位在后"意味着最右边的数字(最低位)是最不告急的位(LSB,Least Significant Bit),而最左边的数字(最高位)是最告急的位(MSB,Most Significant Bit)。
比方,对于一个8位的二进制数 01011100:

  • 低位在前:00(LSB)1101(MSB)
  • 高位在后:1101(MSB)00(LSB)
在盘算机内存中的字节序:

在盘算机内存中,"低位在前,高位在后"的概念也与字节序(Byte Order)有关。字节序决定了多字节数据范例(如整数、浮点数等)在内存中的存储序次。

  •         小端字节序(Little-Endian):低位字节存储在低所在处,高位字节存储在高所在处。这意味着最低位字节(LSB)排在最前面,最高位字节(MSB)排在反面。
            比方,整数 0x12345678 在小端字节序中的存储方式为:
    1. 地址  数据
    2. 0x00   78
    3. 0x01   56
    4. 0x02   34
    5. 0x03   12
    复制代码
  •         大端字节序(Big-Endian):高位字节存储在低所在处,低位字节存储在高所在处。这意味着最高位字节(MSB)排在最前面,最低位字节(LSB)排在反面。
            比方,同一个整数 0x12345678 在大端字节序中的存储方式为:
    1. 地址  数据
    2. 0x00   12
    3. 0x01   34
    4. 0x02   56
    5. 0x03   78
    复制代码
应用场景:


  • 网络通讯:网络协议通常使用大端字节序(也称为网络字节序)来包管数据的划一性。
  • 文件格式:某些文件格式大概规定了特定的字节序,以确保跨平台的兼容性。
  • 硬件接口:差别的硬件平台大概采取差别的字节序,这在举行硬件编程时须要特别注意。
12.为什么操持低位在前,高位在后


  •         盘算服从:盘算机的电路操持通常先处理惩罚低位字节,由于盘算都是从低位开始的。因此,对于某些特定的盘算机体系结构,使用小端字节序可以进步内存访问服从。
  •         硬件操持:在某些硬件操持中,数据从低位到高位依次处理惩罚更为天然,这与盘算机内部处理惩罚数据的方式相匹配。
  •         网络传输:只管网络传输通常采取大端字节序(Big Endian),但在某些特定的通讯协议中,如I2C,规定了数据传输必须是高位先行,这要求在发送和吸收数据时必须遵照协议规定。
  •         通用性和兼容性:在操持某些体系时,为了确保与现有体系的兼容性,大概选择使用小端字节序,尤其是在x86架构的CPU中,它们通常使用小端字节序。
  •         人类阅读风俗:大端字节序(Big Endian)更符合人类的阅读风俗,由于人们通常从左到右阅读,而左边通常是高位。但在内存中,低所在通常在前,这与小端字节序相匹配。
  •         数据体现的直观性:大端存储通常被以为是一种更加直观的存储方式,由于它的字节序与人类通常的阅读序次划一,这有助于在处理惩罚数据和调试时更容易明白内存中的数据体现。



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表