今天面试的一些知识性总结
今天去面试,答了一套个人认为是在我所有做过笔试题中比较好的一套,因为终于看到不考控件的.net笔试题了。这套题考察的内容比较基础,但是仍然有几个地方不是特别熟悉,特此总结一下自己的知识漏洞。
- 知识漏洞1:property和attribute的区别
看到这道题我先是一愣,话说对属性这个概念,脑子里的第一印象就是property,虽说知道attribute也是属性的意思,但是基本没在C#中看到过。在这里我们就来梳理一下什么是property,什么又是attribute。
property的概念一般为人们所熟知,是向外提供的数据区域,一般用于存取类的字段。如这样
private string name; public string Name { get { return name; } set { name = value; } }
而attribute在很多书上翻译为自定义属性,也叫定制特性。attribute是描述对象在编译时或运行时属性的,与property完全不同的概念,这里只能说有时英语比汉语博大精深。。。。。。那么这个所谓的定制特性是个啥呢,让我们看下面的例子
1.自定义Attribute类:VersionAttribute
[AttributeUsage(AttributeTargets.Class)] public class VersionAttribute : Attribute { public string Name { get; set; } public string Date { get; set; } public string Describtion { get; set; } }
2.使用自定义Attribute的Class:
[Version(Name = "hyddd", Date = "2013-04-23", Describtion = "hyddd's class")] public class MyCode { //... }
3.上面这个Class中的Attribute一般会被如何使用呢?
class Program { static void Main(string[] args) { var info = typeof(MyCode); var classAttribute = (VersionAttribute)Attribute.GetCustomAttribute(info, typeof(VersionAttribute)); Console.WriteLine(classAttribute.Name); Console.WriteLine(classAttribute.Date); Console.WriteLine(classAttribute.Describtion); } }
示例完毕!上面三段代码相信已经说明了Attribute大概是一个什么东西和怎么去用。Attribute可以用来向运行时描述你的代码,或者在程序运行的时候影响应用程序的行为。
其实attribute虽说直接一提你可能没有印象,但是平时我们经常用到它,比如[DllImport("xxx.dll")]、[Serializable]等等都属于系统默认的attribute,只是不太清楚怎么称呼它。
- 知识漏洞2:ReferenceEquals()
我们会经常在笔试题中看到考察“==”与Equals()的区别,但是考到ReferenceEquals()你可能就迷糊了。题目中是把int i = 5;int j = 5;传了进去,我当时以为这道题是在考察值类型的内存存储位置,后来发现理解错了。百度一下,你会了解到:ReferenceEqual比较参数的引用对象是否相同。对于值类型,就算值相等,但传给函数时,也需要装箱成不同的对象,因此无论如何,此函数对于值类型参数总是返回False。
- 知识漏洞3:什么是应用程序域
话说这个题不会的话,应该打板子了,基本每本讲C#的书第一章都会讲这个内容,但是说实话,这个问题可能让干了好几年.net的人去答,有一大半人不会,当然了像这种尽人皆知皆不会的题有很多,只能说知识掌握的不够牢固。
概念上讲应用程序域 (application domain) (AppDomain) 一种边界,它由公共语言运行库围绕同一应用程序范围内创建的对象建立(即,从应用程序入口点开始,沿着对象激活的序列的任何位置)。应用程序域有助于将在一个应用程序中创建的对象与在其他应用程序中创建的对象隔离,以使运行时行为可以预知。在一个单独的进程中可以存在多个应用程序域。
我们知道.NET程序都是运行在托管环境(managed environment),但是操作系统只提供了进程(Process),而进程呢又只是提供了内存的控制。所以我们创建的.NET程序是无法直接在进程 中运行的,那怎么办呢?这个时候应用程序域作为中介的角色出现了,它能够运行非托管进程和托管进程之上所以我们的WINFROM、WENFROM,控制台 应用程序或是程序集都是运行在一个应用程序域中。
单独的库程序集是不能被直接运行的(库程序集即.dll的文件),它必须和一个可执行程序集文件一起启动(可执行程序集即.exe)。当可执行文件加载完毕时,.NET会在当前进程中创建一个应用程序域称为默认域,域的名称和程序集的名称相同,它不能被销毁直至进程销毁。
那C#不是运行在托管环境下的吗?那应用程序域是允许访问加载的程序集的Net Runtime所提供的服务。
一个进程可以包涵多个应用程序域,一个应用程序域可以包涵多个程序集,那有什么好 处呢?就是好处1.创建进程的开销要比创建一个应用程序域的开销要大的多,所以创建多个域在进程2.错误隔离,一个应用程序域如果崩溃,只会影响其所在的 应用程序域,而不会影响其他应用程序域。
- 知识漏洞4:new都可能有什么用途
new的用途答题时只想起了两个,分别是new 运算符 用于创建对象和调用构造函数和new 修饰符 用于隐藏基类成员的继承成员。这两个经常用,所以比较熟悉,其实还有第三个,就是new 约束 用于在泛型声明中约束可能用作类型参数的参数的类型。
当泛型类创建类型的新实例,请将 new 约束应用于类型参数,如下面的示例所示:
class ItemFactory<T> where T : new() { public T GetNewItem() { return new T(); } }
当与其他约束一起使用时,new() 约束必须最后指定:
public class ItemFactory2<T> where T : IComparable, new() { }
这四个知识漏洞就是今天所总结的,大神们看了不要笑话。
感谢阅读倾剑飞血的博客
本文地址:http://www.cnblogs.com/jacklandrin/archive/2013/04/23/3039117.html
联系我:jacklandrin@hotmail.com
本文版权归作者所有,欢迎转载,演绎或用于商业目的,但是必须说明本文出处(包含链接)。