17 Essential .NET面试问题 *
Toptal来源的基本问题认为最好 .NET开发人员和工程师可以回答这个问题. 在我们社区的推动下,我们鼓励专家提交问题并提供反馈.
Hire a Top .NET开发人员面试问题
继承是面向对象程序设计中最重要的概念之一, 以及封装和多态性. 继承允许开发人员创建可重用的新类, extend, 并修改在其他类中定义的行为. 这样可以重用代码并加快开发速度. 与继承, 开发人员只能编写和调试一个类一次, 然后重用相同的代码作为新类的基础. 其成员被继承的类称为基类, 继承这些成员的类称为派生类. 中的所有类默认为 .. NET是可继承的.
简而言之,类是对象的定义,对象是类的实例.
我们可以把类看作对象的模板:它描述了所有的属性, methods, 实现对象将具有的状态和行为. As mentioned, 对象是类的实例, 类在实例化之前不会成为对象. 基于一个类可以有更多的对象实例,每个实例都有不同的属性.
托管代码是由 .NET compiler. 它不依赖于目标机器的体系结构,因为它是由CLR(公共语言运行时)执行的。, 而不是操作系统本身. CLR和托管代码给开发人员带来的好处很少, 比如垃圾收集, 类型检查和异常处理.
另一方面, 非托管代码直接编译为本机代码,并取决于目标机器的体系结构. 它由操作系统直接执行. 在非托管代码中, 开发人员必须确保他正在处理内存使用和分配(特别是由于内存泄漏)。, 手动键入安全性和异常.
In .. NET、Visual Basic和c#编译器创建托管代码. 要获得非托管代码,应用程序必须用C或c++编写.
申请加入Toptal的发展网络
并享受可靠、稳定、远程 Freelance .NET开发人员职位
当一个代码单元需要重复执行时,使用这两个循环. 不同的是 for
当您知道需要在代码中迭代多少次时,就可以使用循环. 另一方面, while
当您需要重复某些内容直到给定语句为真时,使用循环.
的语法 while
c#中的循环是:
While (condition[为真])
{
/ /声明
}
的语法 while
loop in VB.NET is:
While condition[为真]
' statements
End While
的语法 for
c#中的循环是:
for (initializer; condition; iterator)
{
/ /声明
}
的语法 for
loop in VB.NET is:
For counter [As datatype] = start To end [Step Step]
' statements
下一个[柜台]
装箱是将值类型转换为类型对象的过程, 拆箱就是从对象中提取值类型. 装箱是隐式的,拆箱是显式的.
示例(用c#编写):
int i = 13;
对象myObject = i; // boxing
i = (int)myObject; // unboxing
LINQ是语言集成查询(Language Integrated Query)的缩写,是在Visual Studio 2008中引入的. LINQ是一组将查询功能扩展到 .通过添加一组新的允许数据操作的标准查询操作符。NET语言语法, 不管数据源是什么. 支持的数据源有: .. NET Framework集合,SQL Server数据库,ADO.. NET数据集、XML文档和任何支持 IEnumerable
或者是通用的 IEnumerable
界面,c#和Visual Basic. 简而言之,LINQ在对象世界和数据世界之间架起了一座桥梁.
垃圾收集是一个低优先级的进程,它作为一个自动内存管理器,为应用程序管理内存的分配和释放. 每次创建一个新对象, 公共语言运行库从托管堆中为该对象分配内存. 只要托管堆中有可用的空闲内存空间, 运行时继续为新对象分配空间. However, 记忆不是无限的, 一旦应用程序填满了Heap内存空间, 垃圾收集可以释放一些内存. 当垃圾收集器执行收集时, 它检查托管堆中不再被应用程序使用的对象,并执行必要的操作来回收内存. 垃圾收集将停止所有正在运行的线程, 它会在堆中找到所有没有被主程序访问的对象并删除它们. 然后,它将重新组织堆中剩余的所有对象以腾出空间,并调整堆栈和堆中指向这些对象的所有指针.
手动在代码中强制垃圾收集, 你可以运行下面的命令(用c#写的):
System.GC.Collect();
IL,即中间语言,是一种独立于CPU的部分编译代码. 实时编译器(JIT)将使用当前环境属性将IL代码编译为本机机器码。. JIT编译器将IL代码转换为汇编代码,并使用目标机器的CPU架构来执行 .网络应用程序. In .. NET中,IL被称为公共中间语言(CIL),在早期 .NET时代,它被称为微软中间语言(MSIL)。.
CLI,即公共语言基础结构,是微软开发的一个开放规范. 它是用于部署、版本控制和安全性的编译代码库. In .有两种CLI类型:进程程序集(EXE)和库程序集(DLL)。. CLI程序集包含CIL中的代码, 如前所述, 在CLI编程语言的编译过程中, 源代码被翻译成CIL代码,而不是翻译成平台或处理器特定的目标代码.
To summarize:
- 编译时,源代码首先被翻译成IL (in) .NET(即CIL,以前称为MSIL).
- 然后将CIL组装成字节码,并创建CLI程序集.
- 代码执行前, CLI代码通过运行时的JIT编译器来生成本机机器码.
- 计算机的处理器执行本机机器码.
简单的回答是:在Stack中存储值类型(继承自 System.ValueType
),并在堆中存储引用类型(继承自 System.Object
).
我们可以说Stack负责跟踪实际执行的内容以及每个执行线程的位置(每个线程都有自己的Stack)。. 另一方面,堆负责跟踪数据或更精确的对象.
An interface 仅声明实现类应该具有的契约或行为. 它只能声明没有访问修饰符的属性、方法和事件. 所有声明的成员都必须实现.
An 抽象类 为必须由继承实体实现的功能和一些抽象/虚拟成员提供部分实现. 它也可以声明字段.
接口和抽象类都不能被实例化.
In LINQ, 延迟执行 这意味着在指定查询时没有执行查询. 具体来说,这是通过将查询赋值给一个变量来实现的. 完成后, 查询定义存储在变量中,但是在遍历查询变量之前不会执行查询. For example:
DataContext productContext = new DataContext();
var productQuery = from product in productContext . var.Products
where product.类型== "肥皂剧"
select product; // Query is NOT executed here
foreach (var product in productQuery) //查询在这里执行
{
Console.WriteLine(产品.Name);
}
你也可以强制 立即执行 of a query. 这很有用, for example, 如果数据库正在频繁更新, 在程序逻辑中,确保访问的结果是在代码中指定查询的地方返回的结果是很重要的. 的方法通常强制立即执行 Average
, Sum
, Count
, List
, ToList
, or ToArray
. For example:
DataContext productContext = new DataContext();
var productCountQuery = (from product in productContext ..Products
where product.类型== "肥皂剧"
选择产品).Count(); // Query executes HERE
A delegate in .. NET类似于C或c++中的函数指针. 使用委托允许程序员将对方法的引用封装在委托对象中. 然后可以将委托对象传递给可以调用引用方法的代码, 无需在编译时知道将调用哪个方法. 此外,我们可以使用委托在类中创建自定义事件. For example,
public delegate void FooDelegate();
类FooClass
{
//自定义事件
公共事件FooDelegate;
}
FooClass = new FooClass()
FooObj.FooEvent += new FooDelegate();
它只从内循环中中断.
你会知道的 System.Object
父类是所有的吗 .NET classes; In other words all types in .. NET(无论是隐式的、显式的还是用户创建的)派生自 System.Object
class.
提供的各种方法是什么 System.Object
派生类/类型?
System.对象提供了以下重要方法,其中包括:
-
ToString
-返回一个表示当前对象的字符串 - 两者都推翻了
Equals(对象)
,=(对象,对象)
GetHashCode
Finalize
GetType
ReferenceEquals
MemberwiseClone
这些方法中的大多数都提供了开发人员将使用的任何类型所需的基本实现 .NET stack.
而常量和只读变量有很多相似之处, 有一些重要的区别:
- 常量在编译时计算,而只读变量在运行时计算.
- 常量只支持值类型的变量(唯一的例外是字符串), 而只读变量可以保存引用类型的变量.
- 当值在运行时不改变时,应该使用常量, 只读变量主要用于它们的实际值在运行前未知的情况.
- 只读变量只能在声明时或在构造函数中初始化.
面试不仅仅是棘手的技术问题, 所以这些只是作为一个指南. 并不是每一个值得雇佣的“A”候选人都能回答所有的问题, 回答所有问题也不能保证成为A级考生. 一天结束的时候, 招聘仍然是一门艺术,一门科学,需要大量的工作.
Why Toptal
提出面试问题
提交的问题和答案将被审查和编辑, 并可能会或可能不会选择张贴, 由Toptal全权决定, LLC.
Looking for .网络开发人员?
Looking for .网络开发人员? 看看Toptal的 .网络开发人员.
Jakub Kubisiowski
Freelance .NET Developer
Jakub是一名技术领先的全栈开发人员,拥有10多年创建微服务的实践经验, APIs, 以及web应用程序. 他了解微软的技术栈,包括c#, .. NET Core和asp.net Core.NET. Jakub熟悉微服务架构和基于云的解决方案(Microsoft Azure). 在工业领域工作时, 他学会了交付关键的软件系统(高可用性), secure, and fast). 他也是一位愿意与客户密切合作的顾问.
Show More贾斯汀Michela
Freelance .NET Developer
Justin是一名技术专业人士,对学习充满热情,拥有18年以上领导团队构建企业级分布式应用程序解决现实问题的经验. 贾斯汀坚信,企业的各个方面都需要合作, 从开发到市场再到销售, 是成功的必要条件吗.
Show MoreToptal连接 Top 3% 世界各地的自由职业人才.
加入Toptal社区.