这才是你需要的最基础的.Net基础面试题(通俗易懂,最基础的.Net)1
1. Linq查询,lambda表达式
LINQ(Language Integrated Query,语言集成查询)提供了一种跨数据源和数据格式的统一模型,实现查询。主要包括三个部分:LINQ to Objects、LINQ to XML、LINQ enabled ADO.NET,
而在LINQ enabled ADO.NET中又包括LINQ to DataSet、LINQ to SQL 和 LINQ to Entities。
“Lambda 表达式”是一种简化的匿名函数,在C#3.0中引入的,可用于创建委托或表达式目录树。也可以将 Lambda 表达式作为参数或者返回值使用。它的语法形式是: 输入参数 => 表达式或语句块,其中,=> 读作“goes to”,在LINQ查询中大量的使用到。
2. C#中的垃圾回收机制。
GC就是垃圾回收器,一般来说系统会自动检测不会使用的对象或变量进行内存的释放,不需要手动调用,用 Collect() 就是强制进行垃圾回收,使内存得到及时的释放,让程序效率更高。
3. Linq查询的优势。
无需复杂学习过程即可上手。
编写更少代码即可创建完整应用。
更快开发错误更少的应用程序。
无需求助奇怪的编程技巧就可合并数据源。
让新开发者开发效率更高。
任何对象或数据源都可以定制实现Linq适配器,为数据交互带来真正方便。
4. 面向对象的主要思想包括什么?
在面向对象中,一切皆为对象,面向对象的三大特征:
1)封装:用抽象的数据类型将数据和基于数据的操作封装在一起,数据被保护在抽象数据类型内部,程序的其他部分只有通过被授权的操作(成员方法)才能对数据进行操作。。
2)继承:继承可以解决代码复用问题,子类可以沿用父类方法和属性的一种方式。
3)多态:继承同一父类的不同子类,对父类方法的不同实现。分为方法的隐藏和重写。
5. C#中的接口和抽象类有什么异同?
从形态层面上:
相同点:抽象类和接口的都是抽象的,不能实例化,需要子类实现其抽象成员。
不同点:
1)抽象类是类的部分实现,可以包含已实现的成员,而接口不能包含任何成员的实现。
2)抽象类与普通类一样,可以继承类和实现接口,而接口只能继承接口,不能实现接口。
从设计层面上:
不同点:
1)抽象类是对一种事物的抽象,即对类抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象。
2)抽象类作为很多子类的父类,它是一种模板式设计。而接口是一种行为规范,它是一种辐射式设计。也就是说对于抽象类,如果需要添加新的方法,可以直接在抽象类中添加具体的实现,子类可以不进行变更;而对于接口则不行,如果接口进行了变更,则所有实现这个接口的类都必须进行相应的改动。
3)抽象类一般作为父类使用,和实现类往往属于同一类事物,而接口和实现类则不然,只是一种实现关系,例如:演员和角色的关系。
6. 什么是装箱和拆箱?
装箱就是把值类型到引用类型的转换
拆箱就是引用类型到值类型的转换
7. 简述 private、protected、internal 、public 修饰符的访问权限。
private : 私有成员, 在类的内部才可以访问。
protected : 保护成员,该类内部和继承类中可以访问。
internal: 在同一程序集内可以访问。
public : 公共成员,完全公开,没有访问限制。
8. C#中的委托是什么?事件是不是一种委托?
C#中的委托是一种引用类型,表示具有相同方法签名的方法的引用。类似于函数指针,也就是说它们是指向函数的“引用”,更加安全。
事件不是委托,是委托类型的变量。
9. .NET的错误处理机制是什么?
简述一下try-catch,try里面放入可能发生异常的代码,catch里面放入如果发生异常要执行的代码,finally里面放入不管是否发生异常,都要执行的代码
一般来说,为了在.NET Framework中处理可能的错误,会采用try-catch-finally这样的代码结构,其中,try块包含了程序正常的操作部分,但可能会出现异常,catch块包含的代码用于处理try中产生的异常,而finally块主要用于清理资源或执行要在try块或catch块末尾执行的其他操作,值得注意的是,无论是否产生异常,finally块中的代码总是要执行的。
在.NET中提供了许多预定义的异常类,所有的异常类都是派生于Exception类,只有当产生的异常与catch块中声明的异常类型匹配时,才能对异常进行处理。若catch块不能处理当前的异常,则会默认向方法的调用上一层抛出异常,层层上抛,直到找到匹配的catch块为止,若不存在匹配的catch块,则程序将异常终止。
10. 线程和进程的区别
最根本区别:进程是操作系统资源分配的基本单位,而线程是CPU调度和执行的基本单位
1)在开销方面:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,线程之间切换的开销小。
2)所处环境:在操作系统中能同时运行多个进程(程序);而在同一个进程(程序)中有多个线程同时执行(通过CPU调度,在每个时间片中只有一个线程执行)
3)内存分配方面:系统在运行的时候会为每个进程分配不同的内存空间;而对线程而言,除了CPU外,系统不会为线程分配内存(线程所使用的资源来自其所属进程的资源),线程组之间只能共享资源。
4)包含关系:没有线程的进程可以看做是单线程的,如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。
11. WCF、WPF、WF、WebServices 简述
WCF:Windows Communication Foundation,是由微软开发的一系列支持数据通信的应用程序框架,可以翻译为Windows 通讯开发平台。它是.NET框架的一部分,由 .NET Framework 3.0 开始引入。整合了原有的windows通讯的 .net Remoting,WebService,Socket的机制,并融合有HTTP和FTP的相关技术。是Windows平台上开发分布式应用最佳的实践方式。
WPF:Windows Presentation Foundation,WPF是微软新一代图形系统,运行在.NET Framework 3.0架构下,为用户界面、2D/3D 图形、文档和媒体提供了统一的描述和操作方法。
WF: Windows Workflow Foundation,它是微软在.NET3.0之后推出的一套工作流开发框架,其主要的目的在于为现有的.NET应用程序嵌入工作流应用。
WebService:一种跨编程语言和跨操作系统平台的远程调用技术。
1)远程调用,就是一台计算机的应用可以调用其他计算机上的应用。
2)跨编程语言:是指服务端、客户端程序的编程语言可以不同
3)跨操作系统平台:是指服务端、客户端可在不同的操作系统上运行
例如:支付宝,支付宝并没有银行卡等数据,它只是去调用银行提供的接口来获得数据。还有天气预报等,也是气象局把自己的系统服务以WebService服务的形式暴露出来,让第三方网站和程序可以调用这些服务功能。
2. int[][]myArray3=new int[3] []{new int[3]{5,6,2},new int[5]{6,9,7,8,3},new int[2]{3,2}};myArray3[2][1]的值是
int[][]myArray3=new int[3] []{new int[3]{5,6,2},new int[5]{6,9,7,8,3},new int[2]{3,2}};myArray3[2][1]
答案:2
13. 启动一个线程主要用什么方法_______
创建Thread实例并调用Start方法启动线程
14. 能用foreach遍历访问的对象需要实现 ______ 接口或声明____方法的类型。
能用foreach遍历访问的对象需要实现 IEnumerable 接口或声明GetEnumerator 方法的类型
15. 请叙述const与readonly的区别。
(const是静态的,必须要初始值,readonly可以用常量去赋值,可以不初始化 )
const为静态常量,所谓静态常量就是在编译期间会对变量进行解析,再将常量的值替换成初始化的值。
readonly为动态常量,所谓动态常量就是编译期间会将变量标记只读常量,而不用常量的值代替,这样在声明时可以不初始化,可以延迟到构造函数初始化。
16. c#中的三元运算符是什么
C#中有一个三元运算符”?:”,语法为:条件表达式?表达式1:表达式2;
该操作首先求出条件表达式的值(bool类型),为true时调用表达式1,为false时调用表达式2。其逻辑为:”如果为真执行第一个,否则执行第二个。”
17. 当整数a赋值给一个object对象时,整数a将会被什么?
装箱(从值类型变成引用类型)
18. public static const int A=1;这段代码有错误么?是什么?
const成员都是static所以应该去掉static
19. 利用operator声明且仅声明了==,有什么错误么?
public void TestFunc()
{
Complex complex1 = new Complex();
Complex complex2 = new Complex();
//进行+操作
var s = complex1 + complex2;
}
}
public class Complex
{
public string Name { get; set; }
public int Age { get; set; }
public Complex()
{
}
// 必须在当前类中定义
//operator在这里定义,我们的类就可以进行+操作,
public static Complex operator +(Complex a, Complex b)
{
return new Complex() { Name = a.Name + b.Name, Age = a.Age + b.Age };
}
//这个是进行-操作
public static string operator -(Complex a, Complex b)
{
return null;
}
//public static Boolean operator ==(Complex a, Complex b)
//{
// return true;
//}
//public static Boolean operator !=(Complex a, Complex b)
//{
// return false;
//}
//public override bool Equals(object obj)
//{
// return base.Equals(obj);
//}
//public override int GetHashCode()
//{
// return base.GetHashCode();
//}
}
}
重载了就必须重载 “!=”
有就要有!= 不能缺少
20. 委托声明的关键字是什么?
delegate
委托是一种引用方法的类型。一旦为委托分配了方法,委托将与该方法具有完全相同的行为。委托方法的使用可以像其他任何方法一样,具有参数和返回值.
委托的定义格式(封装命名方法或匿名方法)
public delegate void TestDelegate(string message);
一个Demo
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
namespace CsharpConsoleApplication
{
public delegate void MyVoidDelegate();//声明一个没有参数没有返回值的委托函数
public delegate bool MyStringDelegate(string str);//声明一个参数为string类型,返回值为bool类型的委托
class Program
{
static void Main(string[] args)
{
MyVoidDelegate delvoid = new MyVoidDelegate(Who);//Who函数必须是无返回值且无参数
delvoid();//委托的调用
MyStringDelegate delstr = MyName;//MyName 函数必须是返回值为bool类型且参数是string类型
delstr("小明");//委托的调用
System.Console.ReadLine();
}
static void Who()
{
System.Console.WriteLine("我是中国人");
}
static bool MyName(string name)
{
System.Console.WriteLine("我叫"+name);
return true;
}
}
}
21. 用sealed修饰的类有什么特点?
该类为密封类,不可被继承
22. 在.Net中所有可序列化的类都被标记为什么?
使用Serializable特性标记
23. 下面的代码中有什么错误吗?
using System;
class A
{
public virtual void F(){
Console.WriteLine(“A.F”);
}
}
abstract class B:A
{
public abstract override void F();
}
答案:abstract override 是不可以一起修饰方法
父类中有abstract,那么子类同名方法必定有override,若父类中有 virtual方法,子类同名方法不一定是override,可能是overload。
24. 请解释接口的显式实现有什么意义?
//这种方式是隐示实现:
public interface IReview
{
void GetReviews();
}
public class ShopReview :IReview
{
public void GetReviews(){}
}
IReview rv = new ShopReview(); rv.GetReviews();
ShopReview rv = new ShopReview(); rv.GetReviews();
都可以调用GetReviews这个方法。
还有一种方式是显示实现:
public interface IReview
{
void GetReviews();
}
public class ShopReview :IReview
{
void IReview.GetReviews(){}
}
通过这种方式的接口实现。GetReviews就只能通过接口来调用:
IReview rv = new ShopReview(); rv.GetReviews();
下面的这种方式将会编译错误:
ShopReview rv = new ShopReview();rv.GetReviews();
// 结论:
// 隐示实现接口和类都可以访问
// 显示实现只有接口可以访问。
显式实现接口:实现类在实现接口中方法时,方法名前必须添加接口名,且不能添加访问修饰符。在调用时,显式实现接口的方法只能通过接口访问,不能通过类访问。
这样做的好处:
1)若一个类实现接口,而接口中的方法只需要在类的内部实现,则可以使用显式实现接口的方式,这样类的实例这无法使用该接口成员。
2)显式接口成员可以避免了成员之间因为同名而发生混淆。如果一个类希望对名称和返回类型相同的接口成员采用不同的实现方式,这就必须要使用到显式实现接口方式。
25. 请解释.NET采用委托实现的事件模型与JAVA中采用接口实现的事件模型有什么区别,
.net中的委托概念java中没有相同的,只有事件模式是一样的,java中有一个叫Obserable接口,可以添加IEventListener,使用内部类可以构建类似于委托的概念
26. 请解释ASP.NET中button linkbutton imagebutton 及hyperlink这四个控件之间的功能区别?
Button是按钮控件,具有按钮所有的属性和事件方法,在客户端被渲染为表单元素提交按钮。
Linkbutton是链接按钮,用于创建超链接样式的按钮。该控件的外观与 HyperLink 控件相同,但其功能与 Button 控件一样。它的主要作用是就是在ASP.NET页面中显示一个超链接。当点击链接时,页面就会往服务器端传递信息,并且在服务器端来处理相应的事件。在客户端被渲染为超链接以及一段用于提交数据的JS代码。
ImageButton 是图片按钮,它以一张图片来代替按钮,来执行按钮的功能,显示为图片,具有按钮的所有功能,在客户端被渲染为表单元素图片按钮。
Hyperlink是超链接控件,用于创建超链接,点击超链接可以使用户转移到同一页面的不同部分或另一个页面.不具有按钮的功能。
27. override与重载的区别
Override:方法重写,子类对父类中的方法进行重新实现,要求,父类与子类之间、方法名和参数类型,数量,顺序一致。在C#允许子类对父类的抽象方法或虚方法进行重写,以适应新的需求。
重载:在同一类中,存在多个具有相同方法名,而不同参数列表的方法,在调用时根据实际参数确定执行哪个重载方法。
28. 请描述一下ref和out在方法参数传递上的异同点?Ref和out
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace aaa
{
class Program
{
static void Main(string[] args)
{
int age = 22;//传递给ref定义参数的方法,所以必须赋初始值。
A a = new A();
a.GetStr(ref age);
Console.WriteLine(age.ToString());//导致参数按引用传递,所以目标函数会直接更改这个数字。
int year;////传递给out定义参数的方法,不需要赋初始值。
a.GetTest(out year);
Console.WriteLine(year.ToString());//导致参数按引用传递,所以目标函数会直接更改这个数字。
Console.Read();
}
}
public class A
{
//传入的值必须是初始化的,
public void GetStr(ref int i)
{
i = 0;//ref修饰,可以修改也可以不改。
}
//传进来的值可以是未初始化的
public void GetTest(out int i)
{
i = 100;//out修饰,必须在退出此方法前为out修饰的变量i赋值。
}
}
}
ref和out:
相同点:
1)在实参和形参上都必须添加关键字
2)在方法中对参数的设置和改变将会被保留。
不同点:
1)ref修饰的参数在方法调用前必须初始化,而out修饰的参数在方法调用时候可以不初始化。
2)在方法中out修饰的参数必须进行赋值,而ref修饰的参数不需要。
3)out修饰的参数主要用于返回值,ref修饰的参数主要用于修改。
29. 请指出GAC的含义
就是一个缓存,我们可以把某些需要的东西放入缓存,在运行一些程序可以直接用,而不需要把每一个需要的东西,都放到运行程序的目录下。
GAC:Global Assembly Cache,全局程序集缓存,它的作用是可以存放一些有很多程序都要用到的公共Assembly,例如System.Data、System.Windows.Forms等等。这样,很多程序就可以从GAC里面取得Assembly,而不需要再把所有要用到的Assembly都拷贝到应用程序的执行目录下面。举例而言,如果没有GAC,那么势必每个WinForm程序的目录下就都要从C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705下面拷贝一份System.Windows.Forms.dll,这样显然不如都从GAC里面取用方便,也有利于Assembly的升级和版本控制。GAC中的所有的Assembly都会存放在系统目录"%winroot%\assembly下面。放在系统目录下的好处之一是可以让系统管理员通过用户权限来控制Assembly的访问。
30. 请指出.NET中所有类型的基类
.Net中所有类型的基类是System.Object
31. 请列出C#中几种循环的方法,并指出他们的不同
for:一般用于循环次数已知的循环
while: 一般用于循环次数未知的循环,工作原理:先判断后执行
do…while:一般用于循环次数未知的循环,工作原理:先执行一次后判断
foreach:当一个序列实现IEnumerable接口或者GetEnumerator()方法时,可以用该循环方法,一般用于遍历集合或数组,更加安全。
32. 用C#实现以下功能:产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复
namespace Wolfy.RandomDemo
{
class Program
{
static void Main(string[] args)
{
int[] result = GetRandom(100);
for (int i = 0; i < result.Length; i++)
{
Console.WriteLine(result[i]);
}
Console.WriteLine("over:" + result.Length);
Console.Read();
}
/// <summary>
/// 获得无重复随机数组
/// </summary>
/// <param name="n">上限n</param>
/// <returns>返回随机数组</returns>
static int[] GetRandom(int n)
{
//容器A和B
int[] arryA = new int[n];
int[] arryB = new int[n];
//填充容器a
for (int i = 0; i < arryA.Length; i++)
{
arryA[i] = i + 1;
}
//随机对象
Random r = new Random();
//最后一个元素的索引 如n=100,end=99
int end = n - 1;
for (int i = 0; i < n; i++)
{
//生成随机数 因为随机的是索引 所以从0到100取,end=100
//一个大于等于 minValue 且小于 maxValue 的 32 位带符号整数,即:返回的值范围包括 minValue 但不包括 maxValue。
//如果 minValue 等于 maxValue,则返回 minValue
//
int minValue = 0;
int maxValue = end + 1;
int ranIndex = r.Next(minValue, maxValue);
//把随机数放在容器B中
arryB[i] = arryA[ranIndex];
//用最后一个元素覆盖取出的元素
arryA[ranIndex] = arryA[end];
//缩减随机数生成的范围
end--;
}
//返回生成的随机数组
return arryB;
}
}
}
33. 简要谈一下您对微软.NET 构架下remoting和webservice两项技术的理解以及实际中的应用。
WebService特点: 平台独立性(Platform-independent)、跨语言(只要能支持XML的语言都可以)以及穿透企业防火墙;Webservice是基于http的是无状态的;但是它的缺点也很明显,就是需要部署一台Web Server;而且速度比较慢;
.Net Remoting的特点是:用户既可以使用TCP信道进行二进制流方式通信,也可以使用HTTP信道进行SOAP格式的通信,效率相对WebService要高不少;Remoting可以用于有状态的情况;但是它的缺点也很明显,.Net Remoting只能应用于MS的.Net Framework之下。
使用场合:
如果互动双方都是支持.NET技术的环境,并且在操作系统上能提供一致的验证机制,而且很重视沟通双方作业的效率,就是.NET Remoting上场的时机。
相反的,如果沟通双方是异质环境,又或沟通的模式就是无状态的情况,持续进行的互动作业前后是没有关联的,Web Service就是理想选择了。
34. 根据线程安全的相关知识,分析以下代码,当调用test方法时i〉10时是否会引起死锁?并简要说明理由。
public void test(int i)
{
lock(this)
{
if (i〉10)
{
i--;
test(i);
}
}
}
不会发生死锁,(但有一点int是按值传递的,所以每次改变的都只是一个副本,因此不会出现死锁。但如果把int换做一个object[引用传递],那么死锁会发生)
35. 根据委托(delegate)的知识,请完成以下用户控件中代码片段的填写:
namespace test
{
public delegate void OnDBOperate();
public class UserControlBase : System.Windows.Forms.UserControl
{
public event OnDBOperate OnNew;
privatevoidtoolBar_ButtonClick(object sender,System.Windows.Forms.ToolBarButtonClickEventArgs e)
{
if(e.Button.Equals(BtnNew))
{
//请在以下补齐代码用来调用OnDBOperate委托签名的OnNew事件。
}
}
}
}
if( OnNew != null ){
OnNew( );
}
36. NET Remoting 的工作原理是什么?
在Remoting中是通过通道(channel)来实现两个应用程序域之间对象的通信。首先,客户端通过Remoting,访问通道以获得服务端对象,再通过代理解析为客户端对象。这就提供一种可能性,即以服务的方式来发布服务器对象。远程对象代码可以运行在服务器上(如服务器激活的对象和客户端激活的对象),然后客户端再通过Remoting连接服务器,获得该服务对象并通过序列化在客户端运行。
37. 在.NET中,配件的意思是?
配件就是Assembly(程序集),程序集由程序集清单,类型元数据,MSIL代码和资源组成。
38. .NET中读写文件需要用到那些方法?他们的作用?
1)File类:
使用场合:当读写文件大小不大,同时可以一次性进行读写操作的时候使用
使用方式:不同的方式可以读写文件类型不一样。
ReadAllBytes() WriteAllByte():可以读写任意类型的文件
ReadAllLines() ReadAllText():只能读写文本类型文件
2)FileStream类:
使用场合:当读写大文件的时候使用,它可以自定义读写的数组大小
使用方式:一个流对象只能做一个事情:如果需要读和写那么就需要创建两个流
读取:将数据读取到数组
写入:将数组的数据再写入到文件
3)StreamReader/StreamWrite类:
使用场合:只能对文本文件进行读写操作
使用方式:它可以按行、按字符以及按块进行读取和写入
39. 在C#中有一个double型的变量,比如10321.5和122235401.21644,作为货币的值如何按各个不同国家的习惯来输出。比如美国用$10,321.50和$122,235,401.22而在英国则为£10 321.50和£122 235 401.22
System.Globalization.CultureInfo MyCulture = new System.Globalization.CultureInfo("en-US");
//System.Globalization.CultureInfo MyCulture = new System.Globalization.CultureInfo("en-GB");为英 国 货币类型decimal y = 9999999999999999999999999999m;
string str = String.Format(MyCulture,"My amount = {0:c}",y);
40. 在C#中using和new这两个关键字有什么意义,请写出你所知道的意义?
using 关键字有两个主要用途:
1)作为指令,用于为命名空间创建别名或导入其他命名空间中定义的类型。
2)作为语句,用于定义一个范围,在此范围的末尾将释放对象。
在 C# 中,new 关键字可用作运算符、修饰符或约束。
1)new 运算符:用于创建对象和调用构造函数。这种大家都比较熟悉,没什么好说的了。
2)new 修饰符:在用作修饰符时,new 关键字可以显式隐藏从基类继承的成员。
3)new 约束:用于在泛型声明中约束可能用作类型参数的参数的类型。
41. 在下面的例子里,输出什么?
using System;
class A
{
public A()
{
PrintFields();
}
public virtual void PrintFields(){}
}
class B:A
{
int x=1;
int y;
public B()
{
y=-1;
}
public override void PrintFields()
{
Console.WriteLine(“x={0},y={1}”,x,y);
}
当使用new B()创建B的实例时,产生什么输出?
概述一下:
先调用父类构造方法,父类构造方法种调用了PrintFields(),这个方法被子类重写了
所以调用子类的PrintFields()方法,输出,
然后才会调用B的构造方法,y=-1这时的x=1,y=-1
详细:
创建子类对象时,先调用父类构造方法,再调用子类构造方法,当调用父类构造方法时,由于还未调用子类构造方法,因此,x=1,y=0,当调用父类构造方法时,在父类构造方法中将调用PrintFields()方法,而该方法为虚方法且被子类重写,由于目前为子类对象,因此,调用子类重写后的PrintFields()方法,故输出:X=1,Y=0。
42. 求以下表达式的值,写出您想到的一种或几种实现方法: 1-2+3-4+……+m
int Num = this.TextBox1.Text.ToString() ;
int Sum = 0 ;
for (int i = 0 ; i 〈 Num + 1 ; i++)
{
if((i%2) == 1)
{
Sum += i ;
}
else
{
Sum -=i ;
}
}
System.Console.WriteLine(Sum.ToString());
System.Console.ReadLine() ;
43. 描述一下C#中索引器的实现过程,是否只能根据数字进行索引?
不是。可以用任意类型。
44. NET中读写XML的类都归属于哪些命名空间?
答:System.Xml
45. CLR与IL分别是什么含义?
简述:
CLR是一个虚拟机,支持不同语言的互操作
IL是中间语言,所有的.Net源码都编译成IL,IL是CPU的指令集,运行时被编译器变成机器码,被解释执行
CLR:Common Language Runtime,公共语言运行时,是一套完整的、高级的虚拟机,它被设计为用来支持不同的编程语言,并支持它们之间的互操作。
IL,中间语言,也称MSIL,微软中间语言,或CIL,通用中间语言;所有.NET源代码在进行编译时都被编译成IL,IL独立于CPU的指令集,与平台无关。在应用程序运行时被即时(Just-In-Time,JIT)编译器处理成为机器码,被解释及执行。
46. 进程与程序的区别?
(1)进程是动态的,而程序是静态的。
(2)进程有一定的生命期,而程序是指令的集合,本身无“运动”的含义。没有建立进程的程序不能作为1个独立单位得到操作系统的认可。
(3)1个程序可以对应多个进程,但1个进程只能对应1个程序。进程和程序的关系犹如演出和剧本的关系。
47. 私有程序集与共享程序集有什么区别?
一个私有程序集通常为单个应用程序所使用,并且存储于这个应用程序所在的目录之中,或此目录下面的一个子目录中。
共享程序集通常存储在全局程序集缓存(Global Assembly Cache)之中,这是一个由.NET运行时所维护的程序集仓库。共享程序集通常是对许多应用程序都有用的代码库,比如.NET Framework类。
48. New有几种用法
在 C# 中,new 关键字可用作运算符、修饰符或约束。
1)new 运算符:用于创建对象和调用构造函数。这种大家都比较熟悉,没什么好说的了。
2)new 修饰符:在用作修饰符时,new 关键字可以显式隐藏从基类继承的成员。
3)new 约束:用于在泛型声明中约束可能用作类型参数的参数的类型。
49. 接口是否可继承接口?抽象类是否可实现接口?抽象类是否可继承类?
在C#中,接口可以继承接口,但不是实现接口,因为,接口中不能存在实现的成员。
抽象类与普通类无差异,只是不能被实例化而已,因此,抽象可以实现接口,也可以继承类,但抽象类一般作为父类使用。
50. 什么是类和对象以及关系?
对象:一种具有状态(属性)和行为(方法)的编程实体,用于描述现实世界的某个具体事物。
类:具用一系列对象共同特征和行为的通用类型。
对象和类的关系:
类是对象的抽象,而对象是类的具体实例。类是抽象的,不占用内存,而对象是具体的,占用存储空间。类与对象的关系就如模具和铸件的关系,类的实例化结果就是对象,而对一类对象的抽象就是类,类描述了一组有相同属性和相同方法的对象。