1、C#允许把类和方法声明为abstract,即抽象类和抽象方法。
抽象类需要注意的几点:
第一,抽象类不能实例化;
第二,抽象方法是必须被子类重写的方法;
第三,如果类中包含抽象方法,那么类就必须定义为抽象类,不论是否还包含其他一般方法。
2、接口用interface声明,接口中的方法或属性前面不能有修饰符、方法没有方法体。
3、抽象类和接口的区分:
第一,类是对对对象的抽象;抽象类是对类的抽象;接口是对行为的抽象;
第二,如果行为跨域不同类的对象,可使用接口;对于一些相似的类对象,用继承抽象类;
第三,从设计角度讲,抽象类是从子类中发现了公共的东西,泛化出父类,然后子类继承父类,而接口是根本不知子类的存在,方法如何实现还不确认,预先定义。
4、面向对象的三大特征:封装(隐藏内部实现,稳定外部接口)继承(子类继承父类代码,实现代码复用)多态(不同子类对同一个消息做出不同的反映)
5、String 和 StringBuilder 对象的区别。String 对象串联操作总是用现有字符串和新数据创建新的对象。StringBuilder 对象维护一个缓冲区,以便容纳新数据的串联。如果有足够的空间,新数据将被追加到缓冲区的末尾;否则,将分配一个新的、更大的缓冲区,原始缓冲区中的数据被复制到新的缓冲区,然后将新数据追加到新的缓冲区。
具体说明:但需要修改字符串而不创建新的对象,则可以使用 System.Text.StringBuilder 类
方法说明:
StringBuilder.Append 将信息追加到当前 StringBuilder 的结尾。
StringBuilder MyStringBuilder = new StringBuilder("Hello World!"); MyStringBuilder.Append(" What a beautiful day."); Console.WriteLine(MyStringBuilder); 输出结果: Hello World! What a beautiful day.
StringBuilder.AppendFormat 用带格式文本替换字符串中传递的格式说明符。
int MyInt = 25; StringBuilder MyStringBuilder = new StringBuilder("Your total is "); MyStringBuilder.AppendFormat("{0:C} ", MyInt); Console.WriteLine(MyStringBuilder); 输出结果:Your total is $25.00
StringBuilder.Insert 将字符串或对象插入到当前 StringBuilder 对象的指定索引处。
StringBuilder MyStringBuilder = new StringBuilder("Hello World!"); MyStringBuilder.Insert(6,"Beautiful "); Console.WriteLine(MyStringBuilder); 输出结果:Hello Beautiful World!
StringBuilder.Remove 从当前 StringBuilder 对象中移除指定数量的字符。
StringBuilder MyStringBuilder = new StringBuilder("Hello World!"); MyStringBuilder.Remove(5,7); Console.WriteLine(MyStringBuilder); 输出结果:Hello
StringBuilder.Replace 替换指定索引处的指定字符。
StringBuilder MyStringBuilder = new StringBuilder("Hello World!"); MyStringBuilder.Replace('!', '?'); Console.WriteLine(MyStringBuilder); 输出结果:Hello World?
6、(1)托管代码 (managed code)
由公共语言运行库环境(而不是直接由操作系统)执行的代码。托管代码应用程序可以获得公共语言运行库服务,例如自动垃圾回收、运行库类型检查和安全支持等。这些服务帮助提供独立于平台和语言的、统一的托管代码应用程序行为。
托管代码是可以使用20多种支持Microsoft .NET Framework的高级语言编写的代码,它们包括:C#, J#, Microsoft Visual Basic .NET, Microsoft JScript .NET, 以及C++。所有的语言共享统一的类库集合,并能被编码成为中间语言(IL)。运行库编译器(runtime-aware ompiler)在托管执行环境下编译中间语言(IL)使之成为本地可执行的代码,并使用数组边界和索引检查,异常处理,垃圾回收等手段确保类型的安全。
在托管执行环境中使用托管代码及其编译,可以避免许多典型的导致安全黑洞和不稳定程序的编程错误。同样,许多不可靠的设计也自动的被增强了安全性,例如 类型安全检查,内存管理和释放无效对象。程序员可以花更多的精力关注程序的应用逻辑设计并可以减少代码的编写量。这就意味着更短的开发时间和更健壮的程序。
(2)非托管代码 (unmanaged code)
在公共语言运行库环境的外部,由操作系统直接执行的代码。非托管代码必须提供自己的垃圾回收、类型检查、安全支持等服务;它与托管代码不同,后者从公共语言运行库中获得这些服务。
7、程序集
dll文件中存放的是经过编译后的MSIL,运行时,它会由一个叫JIT的编译器再编译为适合本地运行的二进制,供程序运行。
在.Net Framework下,一个dll/exe文件也叫一个程序集,可以把它看作是一个程序的集合,因为程序要运行,除了必要的代码以外,可能牵扯到相关的图像,视频等等,而程序集,就是这些东西了一个集合。
下面对图中的名词一一介绍:
PE/COFF:Windows 操作系统能加载并执行.dll和.exe文件,是因为它能够理解PE/COFF格式.PE/COFF( Micorsoft Windows Protable Executable/Commom Object File Format )——可移植可执行/通用对象文件格式。PE/COFF头包含了供操作系统查看和利用的信息,如文件指针等等。
CLR头:程序集中包含的CLR代码,并不是计算机可以直接运行的,还需要进行即时编译。所以,需要将编译环境运行起来,因此,PE/COFF之后就是CLR头,告诉操作系统这个文件是一个.Net程序集,区别与其他类型的可执行程序。
清单:相当于一个目录,描述了程序集本身的信息,如程序集标识(版本号,名称等),资源(Resources),组成文件。
元数据:描述了程序集所包含的内容,包括:程序集包含的模块、类型、成员、可见性等。注意:元数据并不包含类型的实现,类似于C/C++中的.h头文件,在.Net中查看元数据的过程就叫“反射”。
CLL代码:元数据中类型的实现,包括方法体、字段等,类似于C++中的.cpp文件。
资源文件:如音乐,图片等。
8、MVC(Model View Controller)设计模式将一般的应用程序根据功能的不同,划分为模型,视图和控制器三部分。
模型、视图及控制器之间的相互关系如下:(工作原理)
当用户在浏览器中输入浏览地址,到获得页面的反馈信息,通常需要经过一下5个步骤:
(1)当用户在浏览器中输入浏览地址、发送页面请求时,实际上是向控制器发送相关的命令
(2)控制器接到用户的请求命令后,向模型请求获得相关的数据
(3)模型将对应的数据返回给控制器
(4)控制器在将模型返回的数据发送到指定的视图
(5)指定的视图呈现数据
9、MVC框架和WEB窗体框架
ASP.NET MVC 框架具有以下优点:
通过将应用程序分为模型、视图和控制器,化繁为简的工作更加轻松。
它不使用视图状态或基于服务器的窗体。 这使得 MVC 框架特别适合想要完全控制应用程序行为的开发人员。
它使用一种通过单一控制器处理 Web 应用程序请求的前端控制器模式。 这使您可以设计一个支持丰富路由基础结构的应用程序。 有关更多信息,请参见 Front Controller(前端控制器)。
它为测试驱动的开发 (TDD) 提供了更好的支持。
它非常适合大型开发人员团队支持的 Web 应用程序,以及需要对应用程序行为进行严格控制的 Web 设计人员。
基于 Web 窗体的框架具有以下优点:
它支持通过 HTTP 保留状态的事件模型,这有益于开发业务线 Web 应用程序。 基于 Web 窗体的应用程序提供了在数百个服务器控件中受支持的许多事件。
它使用页面控制器模式向单个页面添加功能。 有关更多信息,请参见 Page Controller(页面控制器)。
它针对基于服务器的窗体使用视图状态,这使得管理状态信息更加轻松。
它非常适合想要利用大量组件快速开发应用程序的 Web 开发人员和设计人员的小型团队。
通常,对于应用程序开发而言,它比较简单,这是因为组件(Page 类、控件等)紧密集成并且通常需要比 MVC 模型更少的代码。
10、微软三层结构的优缺点
三层架构(3-tier architecture) 通常意义上的三层架构就是将整个业务应用划分为:表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)。区分层次的目的即为了“高内聚,低耦合”的思想。