马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
1、重载和重写
重载(Overloading)
重载是指在同一个类中界说多个同名方法,但参数列表差别(参数的数目、范例或序次差别)。返回范例可以雷同也可以差别。重载方法答应你根据传入的参数范例和数目来调用差别的方法。
特点:
- 方法名雷同,但参数列表差别。
- 返回范例可以差别。
- 编译器根据方法署名(方法名和参数列表)来区分差别的重载方法。
示例:- public class Calculator
- {
- // 重载方法:加法
- public int Add(int a, int b)
- {
- return a + b;
- }
- // 重载方法:加法,参数为double类型
- public double Add(double a, double b)
- {
- return a + b;
- }
- }
复制代码 重写(Overriding)
重写是指在派生类(子类)中重新实现基类中的虚方法(virtual method)。重写答应派生类提供特定的实现,以改变从基类继承来的活动。
特点:
- 方法名和参数列表必须与基类中的虚方法完全雷同。
- 返回范例必须与基类中的虚方法雷同。
- 访问修饰符不能比基类方法的访问修饰符更严酷。
- 必须使用override关键字来明白体现重写。
示例:- public class Animal
- {
- public virtual void Speak()
- {
- Console.WriteLine("Some sound");
- }
- }
- public class Dog : Animal
- {
- // 重写基类中的Speak方法
- public override void Speak()
- {
- Console.WriteLine("Bark");
- }
- }
复制代码 区别
- 目标差别:重载用于在同一个类中界说多个同名方法,参数差别;重写用于在派生类中改变从基类继承来的方法的活动。
- 位置差别:重载发生在同一个类中;重写发生在派生类中。
- 规则差别:重载方法的参数列表必须差别;重写方法的参数列表和返回范例必须与基类中的虚方法雷同。
- 关键字差别:重写使用override关键字,而重载不须要。
2.ORM框架和Linq关键字
ORM框架
ORM框架的告急特点包罗:
- 对象映射:将数据库表映射为对象,行映射为对象的属性。
- 数据查询:使用对象编程语言查询数据库,无需手写SQL。
- 数据使用:对对象的增编削查使用可以自动转换为数据库使用。
- 缓存管理:一些ORM框架提供查询结果的缓存管理。
.NET中常用的ORM框架包罗:
- Entity Framework:微软官方的ORM框架,支持数据库第一和代码第一的开辟模式。
- NHibernate:一个成熟且功能丰富的ORM框架,支持多种.NET版本。
- Dapper:一种轻量级的ORM框架,专注于性能和简朴性。
LINQ关键字
LINQ提供了一组扩展方法和查询语法,用于查询聚集。以下是一些常用的LINQ关键字和概念:
- where:用于过滤数据。
- var filteredItems = from item in items where item.Condition == true select item;
复制代码 - select:用于选择或投影数据。
- var projectedItems = from item in items select new { item.Property };
复制代码 - from:用于指定查询的数据源。
- var query = from customer in customers select customer;
复制代码 - join:用于实验毗连使用。
- var joinedQuery = from order in orders join customer in customers on order.CustomerId equals customer.Id select new { order, customer };
复制代码 - group:用于对数据举行分组。
- var groupedQuery = from item in items group item by item.Category into groupedItems select new { Category = groupedItems.Key, Items = groupedItems };
复制代码 - orderby/orderby descending:用于排序数据。
- var orderedQuery = from item in items orderby item.Date descending select item;
复制代码 - aggregate operators:如sum、average、min、max、count等,用于聚合使用。
- int count = items.Count();
- int sum = items.Sum(item => item.Value);
复制代码 - let:用于为查询中的子句引入一个中心变量。
- var query = from item in items let size = item.Size where size > 10 select new { item, size };
复制代码 LINQ和ORM框架的联合使用,使得开辟者可以以声明式的方式处理惩罚数据库使用,进步了代码的可读性和维护性。比方,Entity Framework使用LINQ作为其查询语言,答应开辟者编写如下代码:- using (var context = new MyDbContext())
- {
- var customers = context.Customers
- .Where(c => c.IsActive)
- .OrderBy(c => c.Name)
- .ToList();
- }
复制代码 3.多线程,Sleep和wait的区别
Thread.Sleep
Thread.Sleep 是一个静态方法,它属于 System.Threading 定名空间。当调用 Thread.Sleep 时,当火线程会停息实验指定的时间量,让出CPU给其他线程使用。
特点:
- Thread.Sleep 会使当火线程挂起,但不开释任何锁。
- 它不会开释任何对象的锁定;如果当火线程持有一个或多个锁,这些锁在 Sleep 期间仍旧保持。
- Thread.Sleep 不能被制止,除非就寝时间竣事大概线程被中断。
示例:- 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 可以设置超时,使线程在指定的期待时间后继承实验。
示例:- object lockObject = new object();
- bool condition = false;
- void ThreadMethod()
- {
- lock (lockObject)
- {
- // 等待条件变为true
- while (!condition)
- {
- Monitor.Wait(lockObject);
- }
- // 条件满足,执行后续操作
- }
- }
- // 在另一个线程中
- lock (lockObject)
- {
- condition = true;
- Monitor.Pulse(lockObject); // 唤醒等待的线程
- }
复制代码 区别
- 用途: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)服务,即每次哀求服务时都会创建一个新的实例。
- containerRegistry.Register<FooService>();
- containerRegistry.Register<IBarService, BarService>();
复制代码 - RegisterSingleton:这种方式用于注册单例(Singleton)服务,即在应用步伐的整个生命周期内,每次哀求服务时都会返回同一个实例。
- containerRegistry.RegisterSingleton<FooService>();
- containerRegistry.RegisterSingleton<IBarService, BarService>();
复制代码 - RegisterScoped:这种方式用于注册作用域(Scoped)服务,即在每个容器作用域内创建一个新的实例,但在特定作用域内保持同一个实例。
- 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)对数据举行汇总盘算。- SELECT COUNT(*), AVG(salary) FROM employees;
复制代码 2. 数据分组(Grouping)
使用GROUP BY子句对结果集举行分组,通常与聚合函数一起使用。- SELECT department_id, SUM(salary) FROM employees GROUP BY department_id;
复制代码 3. 数据排序(Sorting)
使用ORDER BY子句对查询结果举行排序。- SELECT * FROM customers ORDER BY last_name ASC, first_name DESC;
复制代码 4. 数据毗连(Joining)
使用JOIN子句毗连多个表,以归并来自差别表的数据。- SELECT customers.name, orders.order_id FROM customers JOIN orders ON customers.customer_id = orders.customer_id;
复制代码 5. 子查询(Subqueries)
在查询中嵌套另一个查询,用于复杂的数据检索。- SELECT * FROM employees WHERE salary > (SELECT AVG(salary) FROM employees);
复制代码 6. 事故管理(Transaction Management)
控制事故的开始、提交和回滚,确保数据的划一性和完备性。- BEGIN TRANSACTION;
- -- 一系列数据库操作
- COMMIT; -- 或 ROLLBACK;
复制代码 7. 索引管理(Index Management)
创建和管理索引,以优化查询性能。- CREATE INDEX idx_lastname ON customers(last_name);
复制代码 8. 视图创建(View Creation)
创建视图,作为查询结果的假造表。- CREATE VIEW high_earners AS SELECT * FROM employees WHERE salary > 100000;
复制代码 9. 数据界说语言(DDL)使用
包罗创建、修改和删除数据库对象(如表、视图、索引、触发器等)。- CREATE TABLE new_table (column1 INT, column2 VARCHAR(255));
- ALTER TABLE existing_table ADD new_column INT;
- DROP TABLE obsolete_table;
复制代码 10. 数据备份与规复(Backup and Restore)
备份数据库以防数据丢失,并在须要时规复数据。- -- 备份操作依赖于具体的数据库管理系统
- BACKUP DATABASE myDatabase TO DISK = 'backup.bak';
- -- 恢复操作
- RESTORE DATABASE myDatabase FROM DISK = 'backup.bak';
复制代码 11. 数据库权限管理(Privilege Management)
设置和管理用户权限,控制对数据库对象的访问。- GRANT SELECT, INSERT ON employees TO new_user;
- REVOKE UPDATE ON employees FROM another_user;
复制代码 12. 数据库监控 和优化(Monitoring and Optimization)
监控 数据库性能,分析查询操持,优化查询和数据库结构。
13. 数据库迁徙(Database Migration)
将数据从一个数据库迁徙到另一个数据库,大概涉及差别的数据库体系。
9.排序的关键字、降序关键字、默认排序、分组的关键字
排序的关键字:ORDER BY
ORDER BY 是用于对查询结果举行排序的关键字。- SELECT column1, column2
- FROM table_name
- ORDER BY column1, column2;
复制代码 降序关键字:DESC
DESC(Descending 的缩写)关键字用于指定排序序次为降序,即从大到小。- SELECT column1, column2
- FROM table_name
- ORDER BY column1 DESC, column2 DESC;
复制代码 默认排序:ASC
ASC(Ascending 的缩写)关键字用于指定排序序次为升序,即从小到大。这是默认的排序序次,纵然不写 ASC,SQL也会按照升序排序。- SELECT column1, column2
- FROM table_name
- ORDER BY column1 ASC, column2 ASC;
复制代码 分组的关键字:GROUP BY
GROUP BY 是用于将结果集按照一个或多个列的值举行分组的关键字,通常与聚合函数一起使用。- SELECT column1, COUNT(*)
- FROM table_name
- GROUP BY column1;
复制代码 聚合函数
聚合函数用于对分组后的数据举行盘算,如 SUM(), AVG(), MAX(), MIN(), COUNT() 等。- SELECT column1, SUM(column2), AVG(column2), MAX(column2), MIN(column2), COUNT(*)
- FROM table_name
- GROUP BY column1;
复制代码 过滤分组结果:HAVING
HAVING 关键字用于对分组后的结果举行过滤,雷同于 WHERE 用于过滤行。- SELECT column1, COUNT(*)
- FROM table_name
- GROUP BY column1
- HAVING COUNT(*) > 1;
复制代码 10.数据库游标及用处
游标的特点
- 逐行处理惩罚:游标答应你逐行访问结果集,这在须要对每行数据举行迭代处理惩罚时非常有用。
- 控制使用:你可以控制如那边置惩罚结果会集的每一行,比方,更新或删除特定的行。
- 机动性:游标提供了一种机动的方式来处理惩罚查询结果,尤其是在复杂的业务逻辑中。
游标的用途
- 分批处理惩罚:当处理惩罚大量数据时,使用游标可以分批处理惩罚结果,克制一次性加载过多数据到内存中。
- 复杂盘算:在须要对结果会集的数据举行复杂盘算或逻辑判断时,游标可以逐行处理惩罚数据。
- 更新和删除:游标可以用来定位特定的行,并举行更新或删除使用。
- 报表天生:在天生报表时,游标可以用来逐行处理惩罚数据,以便举行格式化输出。
- 数据迁徙:在数据迁徙过程中,游标可以用来逐行比力和同步数据。
使用游标的例子(SQL Server)
- -- 声明游标
- DECLARE my_cursor CURSOR FOR
- SELECT column1, column2
- FROM table_name
- WHERE condition;
- -- 打开游标
- OPEN my_cursor;
- -- 从游标中提取数据
- FETCH NEXT FROM my_cursor INTO @variable1, @variable2;
- -- 循环处理
- WHILE @@FETCH_STATUS = 0
- BEGIN
- -- 处理逻辑
- -- 例如:更新数据
- UPDATE table_name SET column1 = @variable1 WHERE CURRENT OF my_cursor;
- -- 提取下一行数据
- FETCH NEXT FROM my_cursor INTO @variable1, @variable2;
- END
- -- 关闭游标
- CLOSE my_cursor;
- -- 释放游标
- 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 在小端字节序中的存储方式为:
- 地址 数据
- 0x00 78
- 0x01 56
- 0x02 34
- 0x03 12
复制代码 - 大端字节序(Big-Endian):高位字节存储在低所在处,低位字节存储在高所在处。这意味着最高位字节(MSB)排在最前面,最低位字节(LSB)排在反面。
比方,同一个整数 0x12345678 在大端字节序中的存储方式为:
- 地址 数据
- 0x00 12
- 0x01 34
- 0x02 56
- 0x03 78
复制代码 应用场景:
- 网络通讯:网络协议通常使用大端字节序(也称为网络字节序)来包管数据的划一性。
- 文件格式:某些文件格式大概规定了特定的字节序,以确保跨平台的兼容性。
- 硬件接口:差别的硬件平台大概采取差别的字节序,这在举行硬件编程时须要特别注意。
12.为什么操持低位在前,高位在后
- 盘算服从:盘算机的电路操持通常先处理惩罚低位字节,由于盘算都是从低位开始的。因此,对于某些特定的盘算机体系结构,使用小端字节序可以进步内存访问服从。
- 硬件操持:在某些硬件操持中,数据从低位到高位依次处理惩罚更为天然,这与盘算机内部处理惩罚数据的方式相匹配。
- 网络传输:只管网络传输通常采取大端字节序(Big Endian),但在某些特定的通讯协议中,如I2C,规定了数据传输必须是高位先行,这要求在发送和吸收数据时必须遵照协议规定。
- 通用性和兼容性:在操持某些体系时,为了确保与现有体系的兼容性,大概选择使用小端字节序,尤其是在x86架构的CPU中,它们通常使用小端字节序。
- 人类阅读风俗:大端字节序(Big Endian)更符合人类的阅读风俗,由于人们通常从左到右阅读,而左边通常是高位。但在内存中,低所在通常在前,这与小端字节序相匹配。
- 数据体现的直观性:大端存储通常被以为是一种更加直观的存储方式,由于它的字节序与人类通常的阅读序次划一,这有助于在处理惩罚数据和调试时更容易明白内存中的数据体现。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金 |