C# 基础复习

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的编译器再编译为适合本地运行的二进制,供程序运行。

C# 基础复习 

在.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窗体框架

(1)基于 MVC 的 Web 应用程序的优点

ASP.NET MVC 框架具有以下优点:

  • 通过将应用程序分为模型、视图和控制器,化繁为简的工作更加轻松。

  • 它不使用视图状态或基于服务器的窗体。 这使得 MVC 框架特别适合想要完全控制应用程序行为的开发人员。

  • 它使用一种通过单一控制器处理 Web 应用程序请求的前端控制器模式。 这使您可以设计一个支持丰富路由基础结构的应用程序。 有关更多信息,请参见 Front Controller(前端控制器)。

  • 它为测试驱动的开发 (TDD) 提供了更好的支持。

  • 它非常适合大型开发人员团队支持的 Web 应用程序,以及需要对应用程序行为进行严格控制的 Web 设计人员。

(2)基于 Web 窗体的 Web 应用程序的优点

基于 Web 窗体的框架具有以下优点:

  • 它支持通过 HTTP 保留状态的事件模型,这有益于开发业务线 Web 应用程序。 基于 Web 窗体的应用程序提供了在数百个服务器控件中受支持的许多事件。

  • 它使用页面控制器模式向单个页面添加功能。 有关更多信息,请参见 Page Controller(页面控制器)。

  • 它针对基于服务器的窗体使用视图状态,这使得管理状态信息更加轻松。

  • 它非常适合想要利用大量组件快速开发应用程序的 Web 开发人员和设计人员的小型团队。

  • 通常,对于应用程序开发而言,它比较简单,这是因为组件(Page 类、控件等)紧密集成并且通常需要比 MVC 模型更少的代码。 

10、微软三层结构的优缺点

三层架构(3-tier architecture) 通常意义上的三层架构就是将整个业务应用划分为:表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)。区分层次的目的即为了“高内聚,低耦合”的思想。

优点

1、开发人员可以只关注整个结构中的其中某一层;
2、可以很容易的用新的实现来替换原有层次的实现;
3、可以降低层与层之间的依赖;
4、有利于标准化;
5、利于各层逻辑的复用。
6、结构更加的明确
7、在后期维护的时候,极大地降低了维护成本和维护时间

缺点

1、降低了系统的性能。这是不言而喻的。如果不采用分层式结构,很多业务可以直接造访数据库,以此获取相应的数据,如今却必须通过中间层来完成。
2、有时会导致级联的修改。这种修改尤其体现在自上而下的方向。如果在表示层中需要增加一个功能,为保证其设计符合分层式结构,可能需要在相应的业务逻辑层和数据访问层中都增加相应的代码。
3、增加了开发成本。
 
 
11、何为三层结构
 
三层结构的程序不是说把项目分成DAL,BLL,WebUI三个模块就叫三层了,下面几个问题在你的项目里面:
⒈ UILayer里面只有少量(或者没有)SQL语句或者存储过程调用,并且这些语句保证不会修改数据?
⒉ 如果把UILayer拿掉,你的项目还能在Interface/API的层次上提供所有功能吗?
⒊ 你的DAL可以移植到其他类似环境的项目吗?
⒋ 三个模块,可以分别运行于不同的服务器吗?
如果不是所有答案都为YES,那么你的项目还不能算是严格意义上的三层程序. 三层程序有一些需要约定遵守的规则:
⒈ 最关键的,UI层只能作为一个外壳,不能包含任何BizLogic的处理过程
⒉ 设计时应该从BLL出发,而不是UI出发. BLL层在API上应该实现所有BizLogic,以 面向对象的方式
⒊ 不管数据层是一个简单的SqlHelper也好,还是带有Mapping过的Classes也好,应该在一定的抽象程度上做到系统无关
⒋ 不管使用COM+(Enterprise Service),还是Remoting,还是WebService之类的远程对象技术,不管部署的时候是不是真的分别部署到不同的服务器上,最起码在设计的时候要做这样的考虑,更远的,还得考虑多台服务器通过负载均衡作集群
所以考虑一个项目是不是应该应用三层/多层设计时,先得考虑下是不是真的需要? 实际上大部分程序就开个WebApplication就足够了,完全没必要作的这么复杂. 而 多层结构,是用于解决真正复杂的项目需求的。
 
12、ASP.NET和ASP的区别
 
13、两大常用网络应用体系
C/S(Client/Server)结构即客户端和服务器端结构
B/S(Browser/Server)结构即浏览器和服务器结构
 
14、.NET和SQL Server中的“空值”是否是一回事?
ADO.NET数据提供程序从数据库中提取数据时,在字段没有有效值时会自动分配DBNull值,即SQL Server中的NULL等同于.NET中的DBNull。
 
15、C#各各版本的功能和区别:
.NET Framework 2.0 版中的新增功能: http://msdn.microsoft.com/zh-cn/library/t357fb32(v=vs.90).aspx
C# 2.0语言和编译器中的新功能: http://msdn.microsoft.com/zh-cn/library/7cz8t42e(v=vs.80).aspx
.NET Framework 3.0 版中的新增功能: http://msdn.microsoft.com/zh-cn/library/bb822048(v=vs.90).aspx
.NET Framework 3.5 版中的新增功能: http://msdn.microsoft.com/zh-cn/library/bb332048(v=vs.90).aspx
C# 3.0语言和编译器中的新功能: http://msdn.microsoft.com/zh-cn/library/bb383815(v=vs.90).aspx
.NET Framework 3.5 SP1 版中的新增功能: http://msdn.microsoft.com/zh-cn/library/cc713697(v=vs.90).aspx
.NET Framework 4.0 版和C#4.0中的新增功能: http://msdn.microsoft.com/zh-cn/magazine/ff796223.aspx
 
 16、装箱和取消装箱(拆箱)
装箱是将值类型转换为 object 类型或由此值类型实现的任一接口类型的过程。 当 CLR 对值类型进行装箱时,会将该值包装到 System.Object 内部,再将后者存储在托管堆上。 取消装箱将从对象中提取值类型。 装箱是隐式的;取消装箱是显式的。
如何避免装箱拆箱,提高性能:
如果必须频繁地将值类型装箱,则最好避免使用值类型,例如在非泛型集合类(如 System.Collections.ArrayList)中。 可以通过使用泛型集合(例如System.Collections.Generic.List<T>)来避免将值类型装箱。 装箱和取消装箱都是需要大量运算的过程。 对值类型进行装箱时,必须创建一个全新的对象。 此操作所需时间可比简单的引用赋值操作长 20 倍。 取消装箱时,强制转换过程所需时间可达赋值操作的四倍。 
 
17、foreach

你可能感兴趣的:(C#)