最近找工作面的面试题目汇总(一)

 

正文

简介

最近面了几间公司,每次面试完我都特意把题目记住并写在云笔记上,用于写博客文章,也为了给新手们补补基础。

回到顶部

1.抽象类的介绍,抽象类里的虚函数和抽象函数

参考文档

  1. 抽象类、密封类及类成员(C# 编程指南)
  2. abstract(C# 参考)

    简介

    不能初始化的类被叫做抽象类,它们只提供部分实现,但是另一个类可以继承它并且能创建它们
    的实例。抽象类能够被用于类,方法,属性,索引器和事件,使用abstract 在一个类声明中表示该类倾向要作为其它类的基类,成员被标示成abstract,或被包含进一个抽象类,必须被其派生类实现。

  3. 一个抽象类可以包含抽象和非抽象方法,当一个类继承于抽象类,那么这个派生类必须实现所有的,一个抽象方法是一个没有方法体的方法。
  4. 通过声明派生类也为抽象,我们可以避免所有或特定的虚方法的实现,这就是抽象类的部分实现。
  5. 在C#中,一个抽象类能够继承另一个非抽象类,另外,继承了基类的方法,添加新的抽象和非抽象方法是可行的。
  6. 一个抽象类也能从一个接口来实现,这种情况,我们必须为所有的方法提供方法体,这些方法是来自接口。
  7. 我们不能把关键字abstract 和 sealed 一起用在C#中,因为一个密封类不能够被抽象。
  8. 一个抽象类必须为所有的接口成员提供实现

一个用于实现接口的抽象类可能把接口方法安排到抽象方法上。例如

interface I 
{void M(); } abstract class C: I { public abstract void M(); }

抽象类特征

  1. 抽象类不能被实例化;
  2. 抽象类可以包含抽象方法和访问器;
  3. 不能把抽象类用密封(sealed)来修饰,那就意味着类不能被继承,这违反抽象类被继承的原则;
  4. 一个派生于一个抽象类的非抽象类必须包括所有的继承来的抽象方法和访问器的实现;
  5. 在方法和属性中使用abstract 关键字意味着包含它们的实现

抽象方法特征

  1. 抽象方法是隐式的虚方法;
  2. 抽象方法的声明只能在抽象类中;
  3. 因为抽象方法声明只提供一个无实现的方式,没有方法体;
  4. 方法体的实现被覆写方法提供,覆写方法是一个非抽象类的成员;
  5. 抽象属性的行为和抽象方法相像,除了不同的声明形式。
  6. 在一个静态属性中使用abstract 是一个错误。
    *一个抽象属性能够通过派生类使用 override 实现.
回到顶部

2.虚函数和抽象方法

参考文档

  1. C#之虚函数
  2. 虚方法(virtual)和抽象方法(abstract)的区别

    虚方法与非虚方法的最大不同是,虚方法的实现可以由派生类所取代,这种取代是通过方法的重写实现的。

虚方法的特点

  1. 虚方法前不允许有static,abstract,或override修饰符;
  2. 虚方法不能是私有的,因此不能使用private修饰符;
  3. 我们知道一般函数在编译时就静态地编译到了执行文件中,其相对地址在程序运行期间是不发生变化的,而虚函数在编译期间是不被静态编译的,它的相对地址是不确定的,它会根据运行时期对象实例来动态判断要调用的函数,
    其中那个申明时定义的类叫申明类,那个执行时实例化的类叫实例类
    如:A a =new B(); 其中A是申明类,B是实例类。
  • 当调用一个对象的函数时,系统会直接去检查这个对象申明定义的类,即申明类,看所调用的函数是否为虚函数;
  • 如果不是虚函数,那么它就直接执行该函数。而如果是一个虚函数,那么这个时候它就不会立刻执行该函数了,而是开始检查对象的实例类。
  • 在这个实例类里,他会检查这个实例类的定义中是否有实现该虚函数或者重新实现该虚函数(通过override关键字)的方法,如果有,它就不会再找了,而是马上执行该实例类中实现的虚函数的方法。而如果没有的话,系统就会不停地往上找实例类的父类,并对父类重复刚才在实例类里的检查,直到找到第一个重载了该虚函数的父类为止,然后执行该父类里重载后的函数。

虚方法(virtual)和抽象方法(abstract)的区别

  1. 虚方法必须有实现部分,抽象方法没有提供实现部分,抽象方法是一种强制派生类覆盖的方法,否则派生类将不能被实例化。如:
//抽象方法
public abstract class Animal { public abstract void Sleep(); public abstract void Eat(); } //虚方法 public class Animal { public virtual void Sleep(){} public virtual void Eat(){} }
  1. 抽象方法只能在抽象类中声明,虚方法不是。其实如果类包含抽象方法,那么该类也是抽象的,也必须声明为抽象的。如:
public class Animal
{public abstract void Sleep(); public abstract void Eat(); } 

编译器会报错:
Main.cs(10): 'VSTest.Animal.Sleep()' is abstract but it is contained in nonabstract class 'VSTest.Animal'
Main.cs(11): 'VSTest.Animal.Eat()' is abstract but it is contained in nonabstract class 'VSTest.Animal'

  1. 抽象方法必须在派生类中重写,这一点跟接口类似,虚方法不必。
public abstract class Animal
{public abstract void Sleep(); public abstract void Eat(); } public class Cat : Animal { public override void Sleep() { Console.WriteLine( "Cat is sleeping" ); } // we need implement Animal.Eat() here }

编译器会报错:Main.cs(14): 'VSTest.Cat' does not implement inherited abstract member 'VSTest.Animal.Eat()'
因为我们没有实现抽象类中所有抽象方法。

回到顶部

3.静态类和静态类成员

参考文档

  1. 静态类和静态类成员(C# 编程指南)
  2. C#静态方法与非静态方法的比较

(一).C#静态方法与非静态方法比较一、C#静态成员

  • 静态成员属于类所有,非静态成员属于类的实例所有。
  • 每创建一个类的实例,都会在内存中为非静态成员新分配一块存储;非静态成员属于类所有,为各个类的实例所公用,无论类创建了多少实例;类的静态成员在内存中只占同一块区域。

(二).C#静态方法与非静态方法比较二、C#静态方法

  • C#静态方法属于类所有,类实例化前即可使用。
  • 非静态方法可以访问类中的任何成员,静态方法只能访问类中的静态成员
  • 因为静态方法在类实例化前就可以使用,而类中的非静态变量必须在实例化之后才能分配内存,这样,C#静态方法调用时无法判断非静态变量使用的内存地址。所以无法使用。而静态变量的地址对类来说是固定的,故可以使用。

(三).C#静态方法与非静态方法比较三、C#静态方法是一种特殊的成员方法

它不属于类的某一个具体的实例,而是属于类本身。所以对静态方法不需要首先创建一个类的实例,而是采用类名.静态方法的格式 。

  • static方法是类中的一个成员方法,属于整个类,即不用创建任何对象也可以直接调用!

    static内部只能出现static变量和其他static方法!而且static方法中还不能使用this....等关键字..因为它是属于整个类!

  • 静态方法效率上要比实例化高,静态方法的缺点是不自动进行销毁,而实例化的则可以做销毁。
  • 静态方法和静态变量创建后始终使用同一块内存,而使用实例的方式会创建多个内存.
  • C#中的方法有两种:实例方法,静态方法.

(四).C#静态方法与非静态方法比较四、C#静态方法中获取类的名称

静态方法中用:

string className =   
System.Reflection.MethodBase.  
GetCurrentMethod().ReflectedType.FullName; 

非静态方法中还可以用:

string className = this.GetType().FullName;  
回到顶部

4.静态构造函数

定义:静态构造函数用于初始化任何 静态 数据,或用于执行仅需执行一次的特定操作。 在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数。

静态构造函数具有以下特点:

  1. 静态构造函数既没有访问修饰符,也没有参数。
  2. 在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类。
  3. 无法直接调用静态构造函数。
  4. 在程序中,用户无法控制何时执行静态构造函数。
  5. 静态构造函数的典型用途是:当类使用日志文件时,将使用这种构造函数向日志文件中写入项。
  6. 静态构造函数在为非托管代码创建包装类时也很有用,此时该构造函数可以调用 LoadLibrary 方法。
  7. 如果静态构造函数引发异常,运行时将不会再次调用该构造函数,并且在程序运行所在的应用程序域的生存期内,类型将保持未初始化。
回到顶部

5.接口和抽象类

参考文档

  1. C#中抽象类和接口的区别

①.抽象类和接口的区别:

  1. 类是对对象的抽象,可以把抽象类理解为把类当作对象,抽象成的类叫做抽象类.而接口只是一个行为的规范或规定,微软的自定义接口总是后带able字段,证明其是表述一类类“我能做。。。”。抽象类更多的是定义在一系列紧密相关的类间,而接口大多数是关系疏松但都实现某一功能的类中;
  2. 接口基本上不具备继承的任何具体特点,它仅仅承诺了能够调用的方法;
  3. 一个类一次可以实现若干个接口,但是只能扩展一个父类;
  4. 接口可以用于支持回调,而继承并不具备这个特点;
  5. 抽象类不能被密封;
  6. 抽象类实现的具体方法默认为虚的,但实现接口的类中的接口方法却默认为非虚的,当然您也可以声明为虚的;
  7. (接口)与非抽象类类似,抽象类也必须为在该类的基类列表中列出的接口的所有成员提供它自己的实现。但是,允许抽象类将接口方法映射到抽象方法上;
  8. 抽象类实现了oop中的一个原则,把可变的与不可变的分离。抽象类和接口就是定义为不可变的,而把可变的座位子类去实现;
  9. 好的接口定义应该是具有专一功能性的,而不是多功能的,否则造成接口污染。如果一个类只是实现了这个接口的中一个功能,而不得不去实现接口中的其他方法,就叫接口污染;
  10. 尽量避免使用继承来实现组建功能,而是使用黑箱复用,即对象组合。因为继承的层次增多,造成最直接的后果就是当你调用这个类群中某一类,就必须把他们全部加载到栈中!后果可想而知。(结合堆栈原理理解)。同时,有心的朋友可以留意到微软在构建一个类时,很多时候用到了对象组合的方法。比如 asp.net中,Page类,有Server Request等属性,但其实他们都是某个类的对象。使用Page类的这个对象来调用另外的类的方法和属性,这个是非常基本的一个设计原则;

  11. 如果抽象类实现接口,则可以把接口中方法映射到抽象类中作为抽象方法而不必实现,而在抽象类的子类中实现接口中方法。

②.抽象类和接口的使用

  1. 如果预计要创建组件的多个版本,则创建抽象类。抽象类提供简单的方法来控制组件版本;
  2. 如果创建的功能将在大范围的全异对象间使用,则使用接口。如果要设计小而简练的功能块,则使用接口;
  3. 如果要设计大的功能单元,则使用抽象类。如果要在组件的所有实现间提供通用的已实现功能,则使用抽象类;
  4. 抽象类主要用于关系密切的对象;而接口适合为不相关的类提供通用功能。

以下是我在网上看到的几个形象比喻。
1.飞机会飞,鸟会飞,他们都继承了同一个接口“飞”;但是F22属于飞机抽象类,鸽子属于鸟抽象类;
2. 就像铁门木门都是门(抽象类),你想要个门我给不了(不能实例化),但我可以给你个具体的铁门或木门(多态);而且只能是门,你不能说它是窗(单继承),一个门可以有锁(接口)也可以有门铃(多实现)。门(抽象类)定义了你是什么,接口(锁)规定了你能做什么(一个接口最好只能做一件事,你不能要求锁也能发出声音吧(接口污染))。

回到顶部

6.mvc和webform

  1. 图解ASP.NET MVC与WebForm的区别
  2. 深入比较ASP.NET Webform和ASP.NET MVC两种开发方式的优缺点
  3. mvc与三层结构终极区别
  4. MVC:请求过程
  5. asp.net MVC处理机制
回到顶部

7.mvc的filter

  1. [ASP.NET MVC 小牛之路]11 - Filter
  2. ASP.Net MVC开发基础学习笔记:四、校验、AJAX与过滤器点
回到顶部

8.项目中前端用了啥框架,怎么实现,以及如何自定义jquery插件

  1. jquery开发自定义的插件总结
  2. 做自定义轮播

学习闭包:

(1).学习Javascript闭包(Closure)

(2).javascript的闭包

(3).图解闭包

当你自认为做出了不错的功能但描述出来时又支支吾吾的时候,不要为自己说不出来而懊恼,因为不是你发挥有问题,更不要向别人解释用了啥高大上插件,别让自己成为接口程序员,请静下心回去补补基础。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/281059.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

你认识的C# foreach语法糖,真的是全部吗?

本文的知识点其实由golang知名的for循环陷阱发散而来, 对应到我的主力语言C#, 其实牵涉到闭包、foreach。为了便于理解,我重新组织了语言,以倒叙结构行文。先给大家提炼出一个C#题:观察for、foreach闭包的差异左边输出…

C#对window 硬件类操作,ManagementObjectSearcher

原文转载:http://blog.csdn.net/da_keng/article/details/50589145 纯属转载,复制过来方便编程时寻找。感谢作者:I-Awakening复制前补充: 在刚学C#,用ManagementObjectSearcher 竟然不能解析到头文件,需要手…

2018第51周日

从人们开始用电脑开始就面临着文件版本控制的问题,从最原始的同一个文档多个不同命名表示版本到使用本地的文件版本管理,到后面集中式版本管理如2000年的SVN,到再后来的分布式的版本控制系统,如2005年的Git。到现在用的最多的版本…

twitter批量取消关注_如何在Twitter上取消阻止“潜在敏感内容”

twitter批量取消关注Twitter推特Twitter blocks some tweets with a “potentially sensitive content” warning. You can disable this warning—even on an iPhone or iPad, where the option isn’t normally available. You can also disable sensitive content warnings …

mysql数值类型总结及常用函数

最近在学习下,总结一下mysql数值类型; mysql字符类型分: 1、整数类型: 字节 值范围 INTERGER 1 -127-128 SMALLINT 2 MEDIUMINT…

Semantic-UI的React实现(二):CSS类构造模块

更简单的类名标签 Semantic-UI使用了更简单的类名声明。用过Bootstrap的同学都会被其复杂的类名标签折磨过&#xff0c;例如一个简单的按键样式&#xff0c;不论颜色或是大小&#xff0c;都需要btn-前缀声明&#xff1a; <button type"button" class"btn btn…

skype自动回复_如何在Windows 10上阻止Skype自动启动

skype自动回复Microsoft微软The Skype app included with Windows 10 now has a notification area icon. That’s great, but what if you never use Skype and don’t want it starting every time you sign in? Here’s how to get rid of it. Windows 10随附的Skype应用程…

Vue 组件实例属性的使用

前言 因为最近面试了二、三十个人&#xff0c;发现大部分都还是只是停留在 Vue 文档的教程。有部分连教程这部分的文档也没看全。所以稍微写一点&#xff0c;让新上手的 Vuer 多了解 Vue 文档的其他更需要关注的点。 因为 Vue 文档已经是个很成熟的文档&#xff0c;并且实现的 …

C# 读取硬盘信息类

在编写工具检查硬盘信息时&#xff0c;总结常用到的类&#xff1a; Win32_DiskDrive 这个用了检查整个硬盘的信息&#xff0c;如果电脑只有一个硬盘&#xff0c;那只显示一条信息。参考如下代码&#xff0c;AddTextBox为自定义显示函数。&#xff08;MSDN class 查询&#xff1…

95后沪漂女孩深陷“狠”且“卷”职场,向上思维,永不过时!

hi&#xff0c;这里是桑小榆。最近和一个伙伴oncall了很久&#xff0c;对我的文章以及思想转变产生了很大的共鸣&#xff0c;她向我分享了一些职场经历还有成长经历等&#xff0c;她的这些经历也让我引发了一定的思考。光光&#xff0c;最近刚升任了部门主管&#xff0c;对于当…

PHP:6种GET和POST请求发送方法

在i94web博客中&#xff0c;我试过了畅言和多说两种社会化评论框&#xff0c;后来还是抛弃了畅言&#xff0c;不安全。 无论是畅言还是多说&#xff0c;我都需要从远程抓取文章的评论数&#xff0c;然后存入本地数据库。对于多说&#xff0c;请求的格式如下&#xff1a; // 获取…

解决Ubuntu 16.04下提示boot分区空间不足的办法

原文地址: http://www.jb51.net/article/106976.htm   https://www.linuxidc.com/Linux/2015-09/123227.htm 因为linux内核一直在更新&#xff0c;更新后&#xff0c;旧的内核就不在使用&#xff0c;但旧的内核文件还在boot里面&#xff0c;占据着空间&#xff0c;更新几次过…

3d镜头 适配_您是否应该将镜头适配器与无反光镜相机一起使用?

3d镜头 适配Canon佳能Mirrorless cameras aren’t the future, they’re the present. If you’re switching from an older DSLR, though, the obvious thing to do is just buy an adapter so you can keep using your old gear. 无反光镜相机不是未来&#xff0c;而是现在。…

C#弹窗提示并自动关闭方法

刚学C#不久&#xff0c;就写个工具&#xff0c;总结写一个简便自定义提示窗口方法&#xff0c;并自动关闭。 1.在项目添加windows form&#xff08;非user control&#xff09;&#xff0c;命名为Form_wait。 2.在Form_wait,加入需要控件与一个定时器timer1。 数字10为计时显…

dotNET 7:最小 API 使用

最小 API 并不是在 .NET 7 中才加入的&#xff0c;记得应该是在 .NET 6 中就已经提供&#xff0c;只是对我来说&#xff0c;到现在才开始使用。创建一个最小 API在 VS 2022 中创建 WebAPI 项目&#xff0c;不勾选使用控制器&#xff0c;创建出来的就是最小 API &#xff1a;不勾…

Taro小程序采坑记

Taro&#xff0c;京东凹凸实验室出品的适配多端的一个框架&#xff0c; Taro 是一套遵循 React 语法规范的 多端开发 解决方案。现如今市面上端的形态多种多样&#xff0c;Web、React-Native、微信小程序等各种端大行其道&#xff0c;当业务要求同时在不同的端都要求有所表现的…

struts入门

struts工作过程&#xff1a; 反射代码&#xff1a; Class clazz Class.forName("action全路径"); Method m clazz.getMethod("execute"); Object o m.invoke(); package标签&#xff1a; 转发&#xff1a;地址栏不变 修改struts默认常量值&#xff1a; 常…

《Android应用开发攻略》——2.14 备份Android应用程序数据

2.14 备份Android应用程序数据 Pratik Rupwal2.14.1 问题当用户恢复出厂设置或者改用新的Android设备时&#xff0c;应用程序丢失存储数据或者应用程序设置。2.14.2 解决方案Android的Backup Manager&#xff08;备份管理器&#xff09;能够在应用程序重新安装时自动恢复备份数…

C#程序开机启动与获取程序启动路径

写windows工具时&#xff0c;要进行电源管理&#xff0c;需要重启与开关机OS&#xff0c;这样工具就需要自动启动。查了网上很多资料&#xff0c;修改注册列表就可以。 但是&#xff0c;复制几个网站的代码并自己修改都发现不行&#xff0c;最后发现脚本之家这段代码才成功&am…

wpf office 菜单_如何带回Office 2007中的旧菜单

wpf office 菜单Using the new Ribbon feature in Office 2007 takes time to learn…time you don’t have because projects are stacking up. Today we will look at UBitMenu, a utility that puts the familiar Office 2003 menu into the 2007 ribbon. 使用Office 2007中…