常见问题
1、wpf和winform的区别?
2、委托和事件的区别?
委托的本质bai,是一个类,而du事件,是一个委托类型的私有zhi变量加上两个公有方法dao(事件的+=和-=),这是本质区别。
打个比方,string 也是一个类,而string s = "a",这个s是string类型的一个变量(略有不恰当,为了方便直观理解)。
public delegate void myDel();相当于你创建了一个myDel的类,所以委托可以在任何地方创建,类需要实例化,所以委托需要实例化,要myDel m = ……;
申明一个事件 public event myDel myEvent;
事件myEvent是一个myDel类型的一个变量,因为是变量,所以事件只能在类里面申明,不需要实例化,有点类似与上面的那个m,当然不全是,他还有两个方法(+=,-=),调用一次+=方法,myEvent += MethodA;其实是把MethodA方法,封装成一个myDel类型的委托对象,然后把这个对象的引用赋值给这个myEvent变量。如果多次调用+=,就是多个方法封装成了多个myDel委托对象,然后这些委托对象放在一个列表里面,然后myEvent就指向这个列表,触发的时候,就是调用这个列表里面的所有委托的Invoke方法。
上述是编译时他们的本质区别,用法上的区别主要就是事件只能在申明他的这个类里面调用触发,委托没有这个限制
3、面向对象3大特征?封装、继承、多态
面向对象的三个基本特征是:封装、继承、多态。
封装是面向对象的特征之一,是对象和类概念的主要特性。 封装,也就是把客观事物封装成抽象的类,并且类可以把自己的 数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。隐藏对象的属性和实现细节,仅对外公开接口,提高代 码安全性,封转程度越高,独立性越强,使用越方便。 继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。 通过 继承创建的新类称为“子类”或“派生类”。 被继承的类称为“基类”、“父类”或“超类”多态性:允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子 对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针
4、接口和静态类?
普通类:
可以实例化就是new一个,可以被继承,有默认的构造方法即使不写出来。
静态类:
不能实例化,不能被继承,没有默认的构造方法,但是有静态构造方法作用是给静态属性赋值。
抽象类:
不能实例化,只能被继承,被继承的时候子类必须实现抽象类中的抽象方法。
接口:
可以被调用,可以被继承。
抽象类和接口其实很像,但是区别有二
1接口可以被继承,抽象类不能
2抽象类可以定义,public,protected,package,private
静态和非静态属性
final和非final属性
但是接口中声明的属性,只能是
public
静态
final的
即便没有显示的声明
抽象类(abstract):
(1) 抽象方法只作声明,而不包含实现,可以看成是没有实现体的虚方法
(2) 抽象类不能被实例化
(3) 抽象类可以但不是必须有抽象属性和抽象方法,但是一旦有了抽象方法,就一定要把这个类声明为抽象类
(4) 具体派生类必须覆盖基类的抽象方法
(5) 抽象派生类可以覆盖基类的抽象方法,也可以不覆盖。如果不覆盖,则其具体派生类必须覆盖它们。
接口(interface):
(1) 接口不能被实例化
(2) 接口只能包含方法声明
(3) 接口的成员包括方法、属性、索引器、事件
(4) 接口中不能包含常量、字段(域)、构造函数、析构函数、静态成员。
接口没有构造函数,抽象类可以有构造函数,通过这点就确定了其各自的用途:接口是实现功能,抽象类是实现多态。
5、如何 查看git缓存区和已提交区内容?
git ls-files 查看暂存区中文件信息
二、参数信息,括号里是简写
--cached (-c) 查看暂存区中文件,git ls-files 命令默认是此命令
--midified (-m)查看修改的文件
--delete (-d)查看删除过的文件
--other (-o)查看没有被git跟踪的文件
--stage (-s) 显示mode以及文件对应的Blob对象,进而我们可以获取暂存区中对应文件里面的内容。
git ls-files -c 或者 git ls-files --cached 其他类似
6、为什么用redis而不用关系型数据库?
什么是Redis持久化?Redis有哪几种持久化方式?优缺点是什么?
持久化就是把内存的数据写到磁盘中去,防止服务宕机了内存数据丢失。
Redis 提供了两种持久化方式:RDB(默认) 和AOF
7、tcp/ip通讯建立过程?通过socket套接字
参考内容:https://www.cnblogs.com/f-ck-need-u/p/7623252.html
TCP/IP通信过程,简单为,三次建立,四次断开。具体如下:
三次建立:
主机A发送SYN(seq=x)报文给主机B,主机A进入SYN_SEND状态 ;
主机B收到SYN报文,回应一个SYN(seq=y)ACK(ACK=x+1)报文,主机B进入SYN_RECV状态;
主机A收到主机B的SYN报文,回应一个ACK(ACK=y+1)报文,主机A进入established状态。
三次握手完成,主机A和主机B已经建立连接。
四次断开:
某个应用进程先调用close,称该端执行“主动关闭”(active close)。该端的TCP发送一个FIN分节,表示数据发送完毕;
接收到这个FIN的对端执行“被动关闭”(passive close),这个FIN由TCP确认。
一段时间的等待后,接收到这个文件结束符的应用进程将调用close关闭它的套接字,所以它的TCP也发送一个FIN。
接收到这个最终FIN的原发送端TCP(主动要求关闭连接的那一端)确认这个FIN。
因为每个方向都需要一个FIN和ACK,所以断开需要4个次连接
8、数据库备份还原?
9、jquery?
10、装箱、拆箱?
装箱 就是把“值类型”转换成“引用类型”(Object);
拆箱 就是把“引用类型”转换成“值类型”;
//装箱 boxing
int
i = 3 ;
//分配在栈上
object
o = i ;
//隐式装箱操作,int i 在堆上
object
b = (
object
)i ;
//显示装箱操作
//拆箱 unboxing
int
j = (
int
) o ;
//显示拆箱(将对象o拆箱为int类型)
int
k = b ;
//error!!, 不能隐式拆箱
11、值类型和引用类型?
值类型:值类型是直接将值存储在栈内的,是一个对象的实例,在C#的中,long、int、float、char、bool、enum、struct都是值类型,它们都继承System.ValueType。
引用类型:数据存储在内存堆中,而内存中只存放数据的地址,在C#中引用类型包括类,接口,委托等。
每一个值类型都有一个独立的内存区域保存自己的值,调用它的时候调用的是他的值,而应用类型调用的是内存中的地址。
比如a1=18,这时候在内存中保存的是18,当把a1赋值给a2的时候,他们两个引用的是同一个内存空间,a2的值会保存为a1的值,当把a2改为20后,因为a1和a2引用的是同一个内存地址,所以a1也变成20,这是引用类型。
值类型是当把a1赋值给a2时,会为a2再开一块新的内存空间保存a1的值。当把a2改成20时,只会在a2的空间保存20,和a1没关系了。
①、速度上的区别
值类型存取速度快,引用类型存取速度慢。
②、用途上的区别
值类型表示实际数据,引用类型表示指向存储在内存堆中的数据的指针或引用。
③位置上的区别
值类型的数据存储在内存的栈中,引用类型的数据存储在内存的堆中,而内存单元中只存放堆中对象的地址。
④类型上的区别
值类型的变量直接存放实际的数据,而引用类型的变量存放的则是数据的地址,即对象的引用。
12、硬件是怎么直接和winform工具交互的?
通过com口,红外。
13、tcp/ip 3次握手和3次挥手
14、invoke和begininvoke区别?
最大的区别就是BeginInvoke属于异步执行的。
- Control.Invoke 方法 (Delegate) :在拥有此控件的基础窗口句柄的线程上执行指定的委托。
- Control.BeginInvoke 方法 (Delegate) :在创建控件的基础句柄所在线程上异步执行指定委托
msdn说明:
控件上的大多数方法只能从创建控件的线程调用。 如果已经创建控件的句柄,则除了 InvokeRequired 属性以外,控件上还有四个可以从任何线程上安全调用的方法,它们是:Invoke、BeginInvoke、EndInvoke 和 CreateGraphics。 在后台线程上创建控件的句柄之前调用 CreateGraphics 可能会导致非法的跨线程调用。 对于所有其他方法调用,则应使用调用 (invoke) 方法之一封送对控件的线程的调用。 调用方法始终在控件的线程上调用自己的回调。 |
参考地址:https://blog.csdn.net/guangod/article/details/86286204
15、什么是多线程?为什么用多线程?多线程之间怎么处理争夺资源的问题?进程间通信问题?同一进程不同线程间通信和跨进程的线程间通信?
参考地址:https://blog.csdn.net/beidaol/article/details/89135277
16、如何取链表中某个值?
- 在节点ListNode定义中,定义为节点为结构变量。
- 节点存储了两个变量:value 和 next。value 是这个节点的值,next 是指向下一节点的指针,当 next 为空指针时,这个节点是链表的最后一个节点。
- 注意注意val只代表当前指针的值,比如p->val表示p指针的指向的值;而p->next表示链表下一个节点,也是一个指针。
- 构造函数包含两个参数 _value 和 _next ,分别用来给节点赋值和指定下一节点
线性表
线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的。
线性表分类:顺序存储结构、链式存储结构
例子:数组
顺序存储结构:两个相邻的元素在内存中也是相邻的。通过首地址和偏移量就可以直接访问到某元素,关于查找的适配算法很多,最快可以达到O(logn)。缺点是插入和删除的时间复杂度最坏能达到O(n),要开辟稍大点的内存,造成内存浪费。
链式存储结构:相邻的元素在内存中可能不是相邻的,每一个元素都有一个指针域,指针域一般是存储着到下一个元素的指针。优点是插入和删除的时间复杂度为O(1),不会浪费太多内存,添加元素的时候才会申请内存,删除元素会释放内存,。缺点是访问的时间复杂度最坏为O(n),关于查找的算法很少,一般只能遍历,这样时间复杂度也是线性(O(n))的了,频繁的申请和释放内存也会消耗时间。
链表
链表就是链式存储的线性表。
根据指针域的不同,链表分为单向链表、双向链表、循环链表等等。
参考:https://jingyan.baidu.com/article/fd8044fa3b2fd85031137a25.html
17、泛型指什么?
泛型能够让类型像参数一样传递。更加安全,避免装箱拆箱。
T Read<T>(string cacheKey, long dbId = 0) where T : class;
传递的类型可以限定范围 where T :class 是指类型T只是是引用类型。
18、B/S 和C/S区别?
C# virtual 是虚拟的含义,在 C# 语言中,默认情况下类中的成员都是非虚拟的,通常将类中的成员定义成虚拟的,表示这些成员将会在继承后重写其中的内容。
virtual 关键字能修饰方法、属性、索引器以及事件等,用到父类的成员中。
使用 virtual 关键字修饰属性和方法的语法形式如下。
//修饰属性
public virtual 数据类型 属性名{get; set; }
//修饰方法
访问修饰符 virtual 返回值类型方法名
{
语句块;
}
需要注意的是,virtual 关键字不能修饰使用 static 修饰的成员。
此外,virtual 关键字既可以添加到访问修饰符的后面,也可以添加到访问修饰符的前面,但实际应用中习惯将该关键字放到访问修饰符的后面。
子类继承父类后能重写父类中的成员,重写的关键字是 override。
所谓重写是指子类和父类的成员定义一致,仅在子类中增加了 override 关键字修饰成员。
20、orm是指什么?EF+Dapper 为啥2个都用?哪个好?为啥?
21、分页是用什么实现的?存储过程吗?
sql server :利用分页的sql语句和泛型(T)、接口、static静态类、 IEnumerable,dapper (其中可以传object参数) ,linq 将参数的字符串反序列化成linq对象
int num = (pageIndex - 1) * pageSize; (pageIndex 页码 pageSize每页条数)
int num1 = (pageIndex) * pageSize;
Select * From (Select ROW_NUMBER() Over (Order By meteraddr desc) As rowNum, * From (select * from Meters) T ) As N Where rowNum > num(变量) And rowNum <=num1 (变量)
oracle:
Select * From (Select ROWNUM, T.* From (select * from Meters Order By meteraddr desc) T ) N Where rowNum > num(变量) And rowNum <= num1 (变量);
mysql:
int num = (pageIndex - 1) * pageSize;
select * from Meters Order By meteraddr desc limit num(变量),pageSize;
22、消息队列、全栈开发、分布式、微服务、nosql
消息队列面试题:https://www.cnblogs.com/peteremperor/p/10273077.html
NoSQL代表
MongDB、 Redis、Memcache
NoSQL,指的是非关系型的数据库。NoSQL有时也称作Not Only SQL的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称。
NoSQL用于超大规模数据的存储。
23、C# XElement XML用法总结: https://www.cnblogs.com/s7ven/articles/3575478.html