zoukankan      html  css  js  c++  java
  • 常见问题

    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而不用关系型数据库?

    首先要知道缓存缓存是干什么的,缓存是指可以进行高速数据交换的存储器,它先于内存与CPU交换数据。高速是缓存必须具备的特点,而关系型数据库都是存在硬盘上的,想要读取或修改,必须先加载到内存中,才能进行下一步操作。而redis是直接存储在内存中的,不用到硬盘上去操作,所以符合缓存的要求,快速高效。(但是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 属性以外,控件上还有四个可以从任何线程上安全调用的方法,它们是:InvokeBeginInvokeEndInvoke 和 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区别?

    19、C# virtual 函数

    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

  • 相关阅读:
    小问题收集
    JSON.NET与LINQ序列化示例教程
    前台页面中json和字符串相互转化
    jQuery Validate (1)
    jQuery Validate (摘自官网)
    SQL基础(八)-- sql左右连接中的on and 和 on where 的区别
    SQL基础(七)--or和in的使用
    SQL基础(六)--RaiseError的用法
    C#基础(三)--Sort排序
    C#中Equals和==的区别 (面试官经常会问到)
  • 原文地址:https://www.cnblogs.com/zxdz/p/13355121.html
Copyright © 2011-2022 走看看