澳门新浦京娱乐场网站-www.146.net-新浦京娱乐场官网
做最好的网站

澳门新浦京娱乐场网站图解教程,基础概念001

* 基础

内容提要:

 

2017/7/17

澳门新浦京娱乐场网站 1

1、virtual和new

   - Virtual 关键字允许在派生类中重写这些对象,默认情况下,方法是非虚拟的,不可以重写非虚方法;

   - virtual关键字不可以与static、abstract、private、override一起使用。

   - Virtual关键字又是和override紧密不可分的,如果要实现Virtual方法就必须要使用override或new关键字(new和override产生的机理不同)。New和Override这两个关键字是互斥的。不可以同时使用;

   - new : new关键字可以在派生类中隐藏基类的方法

   - virtual: Override关键字主要是提供派生类对基类方法的新实现,重写的基类方法必须和Override的方法具有相同的签名,相同的访问修饰符

总结:New关键字主要用来区别派生类和基类同名方法的选择问题,通过隐藏基类方法,达到使编译器调用正确的方法的目的。Override主要用来对基类的方法和虚方法进行重写。

编译和运行面向对象.NET代码

什么是.NET?

C#和.NET框架

.NET框架,CLR的C#语言

.net框架是一个独立发布的软件包,包括了CLR,类库以及相关的语言编译器等工具。C#代码经过编译之后再CLR环境中运行。

.NET框架是一种比MFC或COM变成技术更一致并面向面对对象的环境,它的特点包裹一下几点。

1.多平台:该系统可以在广发的计算机上运行,包括服务器,桌面机到PDA和移动电话。

2.行业标准:该系统使用行业标准的通信协议,比如XML,HTTP,SOAP和WSDL。

3.安全性:该系统能提供更加安全的执行环境,及时有来源可疑的代码存在。

.NET框架由三部分组成

澳门新浦京娱乐场网站 2

执行环境称为CLR(Common Language Runtime,公共语言运行库)。CLR在运行期管理程序的执行。

BCL  基类库

大大改进的编程环境

1.面向对象的编程环境

CLR,BCL和C#被设计的完全面对对象,并形成良好的集成环境

2.自动垃圾回收

CLR有一项服务称为GC(垃圾收集),它能为你自动管理内存

3.互操作性

.NET框架的设计专门考虑了不同的.NET语言,操作系统或Win32 DLL和COM之间的互操作性 

(1).NET语言的互操作性允许不同的.NET语言编写的类,只需要遵循一定的规则即可。

(2).NET提供一种称为平台调用的特性,允许.NET的代码调用并使用非.NET的,但通过标准Win32 DLL 到处的纯C函数的代码,比如Windows API.

(3).NET框架还允许与COM的互操作。.NET软件组件能调用COM组件,而且COM也能调用.NET组件,就像它们是COM组件一样。

4.不需要COM

5.简化的部署

6.类型安全性

7.基类库

包含以下一些类

通用基础类:这些类提供了一组极为强大的工具,可以应用到广发的编程任务中,比如字符串操作,安全和加密。

集合类:这些类实现了列表,字典,散列表以及位数组

线程和同步类:这些类用于创建多线程程序

XML类:这些用于创建读取以及操作XML文档

编译成CIL

.NET语言的编译器接受源代码文件,并生成名为程序集的输出文件。程序集可以使可执行的文件或DLL

1 程序集里的代码并不是本机代码,而是一种名称为CIL(Common Intermediate Language,公共中间语言)的中间语言

2 程序集包含 的信息中包含下列项目

程序的CIL;

程序中使用的类型的元数据;

对其他程序集引用的元数据。

编译成本机代码并执行

程序的CIL直到他被调用运行时才会被编译成本机代码,在运行时,CLR执行下面的步骤(如图):

1、检查程序集的安全特性;

澳门新浦京娱乐场网站 3

2、在内存中分配空间;

3、把程序集中的可执行的代码发送给实时(Just-in-Time,JIT)编译器,把其中的一部分编译成本机代码。

程序集中的可执行的代码在需要的时候由JIT编译器编译,然后他就被缓存已被再后来的程序中执行。使用这个方法以为着不被调用的代码不会被编译成本机代码,而且被调用到的代码纸杯编译一次。

一旦CIL被编译成本机代码,CLR就在他运行时管理它,执行像释放无助内存,检查数组边界,检查参数类型和管理异常之类的任务。

托管代码:为.NET框架编写的代码,需要CLR。

非托管代码:不在CLR控制之下运行的代码,比如Win32 C/C DLL。


编译和执行综述

无论原始源文件的语言是什么,都遵循同样的编译和执行过程

澳门新浦京娱乐场网站 4

C#关键概念

2、不用vs软件写代码

  - 在notepad 中写代码,命名为.cs结尾的文件:My.cs

  - 对源文件运行C#命令行编译器csc.exe ,编译(csc My.cs)→ 运行(My.exe)

  - 打开命令行的方法:1、cmd中运行批处理文件【C:Program Files (x86)Microsoft Visual StudioPreviewEnterpriseCommon7ToolsVsDevCmd.bat】,然后再转到d: 盘 csc My.cs ; 

                2、在windows→ 菜单→ 开始→ 程序→ VS菜单→ 命令提示符窗口

   注: cmd中,d:转到d盘目录下, cd MyNote转到d盘的MyNote目录下

using System;
namespace Wrox
{
    public class My
    {
        static void Main()
        {
            Console.WriteLine("Hello form Wrox");
            Console.ReadLine();
        }
    }
}

 

IL/MSIL(Microsoft Intermediate Language)中间语言的优点

 

CLR

.NET框架的核心组件是CLR,他在操作系统的顶层并管理程序的执行,如图所示。CLR还提供下列服务:

自动垃圾回收;

安全和认证;

通过访问BCL(base class library,基类库)得到广泛的编程功能,包括入院Web服务和数据服务之类的功能。

C# 组织结构的关键概念是程序 (program)、命名空间 (namespace)、类型 (type)、成员 (member) 和程序集 (assembly)。

* net框架

  - .NET框架由三部分组成。

              澳门新浦京娱乐场网站 5

值类型与引用类型

起源:比尔盖茨在2000年的Professional Developers Conference介绍了一个崭新的平台叫作Next Generation Windows Service,也就是后来的.NET。

CLI

CLI(Common Language Infrastructrue,公共语言基础结构),他把所有的.NET框架的组件连接成一个内聚的,一致的系统。他展示了系统的概念和架构,并详细说明了所有软件都必须坚持的规定和约定。CLI是一组阐述了系统的架构,规则和约定的规范。

澳门新浦京娱乐场网站 6

CLI的重要组成部分

1.公共类型系统

CTS(Common Type System,公共类型系统)定义了那些在托管代码中一定会使用的类型的特征。CTS的一些重要方面如下:

CTS定义了一组丰富的内置类型,以及每种类型确定的、详细的特性;

.NET兼容编程语言提供的类型通常映射到CTS中已定义的内置类型集的某一个特殊子集;

CTS最重要的特征之一是所有类型都集成自公共的基类——object。

2.公共语言贵方

CLS(conmon language specification,公共语言规范)详细的说明了一个.NET兼容编程语言的规则,属性和行为。其主题包裹数据类型和,类结构和参数传递。

缩写回顾

澳门新浦京娱乐场网站 7


C# 程序由一个或多个源文件组成。

1.CLR 

               * 内存管理和垃圾收集。

    * 代码安全验证。

    * 代码执行、线程管理及异常处理。

    - .NET Framework的核心是运行库执行环境,称为(公共语言运行库CLR或.NET运行库),通过CLR控制下运行的代码称为托管代码

数据类型化

软件层:.NET可以被看作是介于操作系统和编程语言之间的软件层,它可以支持多种编程语言,包括C#,VB.NET,C ,F#,等等。

C#编程概述

命名约定

标识符风格

Pascal风格  标识符中每个单词首字母大写   用于类型名和成员名      CarDeck,DealersHand

Canel风格    除第一个单词以外,标识符中所有单词都首字母大写  用于本地变量和方法参数

字段名称以下划线开头:_HighTemp、_LowTemp.

6种可以有用户自己创建的类型:

类类型  class;

结构类型 struct ;

数组类型 array;

美剧类型 enum;

委托类型 delegate;

接口类型 interface;

运行中的程序使用两个内存区域来储存数据:栈和堆。

栈是一个内存数组,是一个LIFO(last-in first-out,后进先出)的数据结构,栈储存几种类型的数据:

某些类型变量的值;

程序当前的执行环境;

传递给方法的参数。

栈的特征

栈有如下几个普遍特征:

数据只能从栈的顶端插入和删除;

把数据放到栈顶 称为入栈;

从栈顶删除数据称为出栈;

堆是一块内存区域,堆里的内存可以任意顺序存入和移除。

程序可以在堆里保存数据,但并不能显示的删除它们。CLR的自动GC在判断出程序的代码将不会在访问某数据项时,会自动清除无主的堆对象。

值类型   只需要一段单独的内存,用于储存实际的数据,位于栈中

引用类型  需要两段内存

第一段储存实际的数据,位于堆中。

第二段是一个引用,指向数据在堆中的存放位置,引用放在栈里

说明:对于引用类型的任何对象,他所有的数据成员都存放在堆里,无论他们是指类型还是引用类型。

变量

变量是一个名称,表示程序执行时储存在内存中的数据

澳门新浦京娱乐场网站 8

澳门新浦京娱乐场网站 9


类和接口就是类型的示例。

1.1 编译:

  1. 将源代码编译为Microsoft中间语言(IL)【低级语言,数字代码,可快速转换为本地机器码】

  2. CLR把IL编译为平台专用的代码

  - 优点:

    平台无关性:编译为中间语言可以获得.NET平台无关性。

    提高性能:IL总是即时编译(称为JIT编译),只编译调用的那部分,代码编译过一次后,得到的本地可执行程序就存储起来,直到退出程序为止,下次运行着代码就不需要重新编译了。

         托管IL代码几乎和本地机器代码的执行速度一样快,JIT编译器确切知道程序运行在什么类型的处理器上,可以利用该处理器提供的任何特性或特定的机器代码指令来优化最后

         的可执行代码。

    语言的互操作性:能将VB C# C 编译为中间语言,编译为中间语言的代码可以与其他语言编译过来的代码进行交互操作。

 

程序集、.NET基类和名称空间

用来产生托管代码的框架、平台:传统的编译方式是"源代码→编译→可执行文件",在.NET中编译方式是"源代码→编译→程序集→可执行文件"。编译后的程序集包含IL代码和元数据,在运行时再转换成机器代码。

类:基础

类是一个能储存数据并执行代码的数据结构,它包含以下内容:

数据成员,它储存与类的实例相关的数据,数据成员通常模拟该类所表示的显示世界事务的特性

函数成员,它执行代码。函数成员通常模拟类所表示的显示世界事务的功能和操作。

澳门新浦京娱乐场网站 10

 类是逻辑相关的数据和函数的封装,通常代表真实世界中的或概念上的事务。

运行中的程序是一组相互作用的对象。

字段和方法是最重要的类成员类型,字段是数据成员,方法是函数成员。

字段

字段是隶属于类的变量

1、他可以是任何类型,无论是预定义类型还是用户定义类型

2、和所有变量一样,字段用来保存数据,并具有如下特征:

  它们可以被写入;

  它们可以被读取;

字段 (field)、方法、属性和事件是成员的示例。

1.2 编译工具涵盖了编码和调试所需的一切,包括:

    * Visual Studio集成开发环境IDE.

    * .NET兼容的编译器(如:C# VB...).

    * 调试器.

    * 网站开发服务器技术,如ASP.NET 或WCF

  BCL(base class library基类库),是.NET框架的一个大类库

  C#编写的代码靠.NET Framework运行,结论:1.c#的体系结构和方法反映了.net基础方法论  2.多数情况下,c#特定语言功能取决于.NET的功能,或依赖于.NET基类。

一、.NET和C#

对于C#语言来说:C#的结构和方法论反映了.NET基础方法论;在许多情况下,C#的特定语言功能取决于.NET的功能,或依赖于.NET基类。

Q:.NET与c#的关系?

A:C#是专门为与Microsoft的.NET Framework一起使用而设计的(.NET Framework 是一个功能非常丰富的平台,可开发、部署和执行分布式应用程序)。

注意:C#就其本身而言只是一种语言,尽管它是用于生成面向.NET环境的代码,但它本身不是.NET的一部分。.NET支持的一些特性,C#不支持。而C#语言支持的另一些特性,.NET却不支持。

按开发到执行阶段来说:开发阶段.NET提供了庞大的类库,在程序执行阶段,.NET提供了一个CLR运行时环境帮助我们实时编译程序、进行安全检查、执行垃圾回收,管理内存等。

程序集扩展名.exe(应用程序)或.dll(类库)

2. 中间语言

二、 公共语言运行库(CLR,Common Language Runtime)

托管代码(Managed Code):在CLR控制下运行的代码。

Q:.NET 是如何编译代码的?

A:将源代码编译为中间语言CLR把IL编译为平台专用的代码。

Q:使用IL有哪些优点?

A:平台无关性、提高性能和语言的互操作性。

即时编译(JIT,Just In Time)

Q:为什么托管IL代码几乎和本地机器代码的执行速度一样快?

A: JIT编译器并不是把整个应用程序一次性编译完,而是只编译它调用的那部分代码。代码编译过一次后,得到的本地可执行程序就存储起来,直到退出该应用程序为止,下次运行该代码时,就无需在编译。

Q:为什么IL即时编译可以提高性能?

A:因为编译过程的最后一部分是在运行时进行的,JIT编译器确切地知道程序运行在什么类型的处理器上,可以利用该处理器提供的任何特性或特定的机器代码指令来优化最后的可执行代码。

Q:IL是如何体现语言的互操作性的?

A:将任何一种语言(.NET 支持的语言)编译为中间语言,编译为中间语言的代码可以与从其他语言编译过来的代码进行交互操作。

 

CLR、CTS、CLS

2.1 特征

  1. 面向对象和使用接口:带有类的单一继承性,

  2. 不同的值类型和引用类型:值类型变量之间存储数据,引用类型变量仅存储地址,对应的数据在该地址中找

  3. 强数据类型化

  4. 使用异常来处理错误

  5. 使用特性(attribute)

三、中间语言

Q:IL的主要特征?

A: 面向对象和使用接口,值类型和引用类型之间的显著差异,强数据类型化,使用异常处理错误和使用特性。

Q:什么是接口理念?

A:提供一个契约,实现给定接口的类必须提供该接口指定的方法和属性的实现方式。

Q:语言互操作性的含义?

A:用一种语言编写的类应能直接与另一种语言编写的类通信。主要可以体现在:

用一种语言编写的类应能继承另一种语言编写的类。

一个类应能包含另一个类的实例,而不管两个类是什么语言编写的。

一个对象应能直接调用用其他语言编写的另一个对象的方法。

对象应能在方法之间传递。

在不同的语言之间调用方法时,应能在调试器中交替调试这些方法调用,即调试不同语言编写的源代码。(Visual Studio IDE已经实现该功能,注意该功能不是CLR提供的。)

Q:什么是值类型,什么是引用类型?

A:值类型(Value Type),变量直接存储数据。引用类型(Reference Type),变量仅存储地址,对应的数据可以再改地址中找到。

IL数据存储的规范:引用类型的实例总是存储在一个名为托管堆的内存区域中,值类型一般存储在堆栈中(如果值类型在应用类型中声明字段,它们内联存储在堆中)。

通过类型系统(CTS,Common Type System);公共语言规范(CLS,Common Language Specification);CLS和CTS一起确保语言的互操作性。

澳门新浦京娱乐场网站 11

Q:什么样的对象会被.NET 垃圾回收器回收?

A:一个对象不被任何其他对象所引用时,GC采用一定的算法在托管堆中遍历所有对象,构成一个对象图,而不可以到达的对象将成为被释放的垃圾对象。

Q:.NET 垃圾回收的工作原理?

澳门新浦京娱乐场网站图解教程,基础概念001。A:每个应用程序都有一组根,指向托管堆中的存储位置,由JIT编译器和CLR运行时维护根指针列表,主要包括全局变量,静态变量,局部变量和寄存器指针等。垃圾收集器就是通过指针列表来实现托管堆中的对象图,当垃圾回收器启动时,它假设所有对象都是可回收的垃圾,然后开始遍历所有的根,将根引用的对象标记为可达对象图中,依次类推,垃圾收集器通过根列表的递归遍历,将能找到的所有可达对象,形成一个可达图。同时不可到达的对象则认为是可回收的对象。这种算法一般称为:标记和清除算法。

内存管理周期性的执行内存清理工作,一般按照以下步骤启动垃圾收集器:

对象充满时。

强制执行GC.Collect方法。

windows报告内存不足,CLR将强制执行垃圾回收。

CLR卸载AppDomain时,GC将对所有代龄的对象执行垃圾回收。

垃圾收集器将托管堆中的对象分为三代:第0代,第1代,第2代,其中第0代对象的回收的效率最高,CLR初始化后,被添加到托管堆中的对象都被定为第0代,当有垃圾回收执行时,未被回收的对象升级为第1代对象,而后新建的对象仍为第0代对象。也就是说代龄越小,表示对象越新,通常情况下生命周期越短。因此垃圾收集器总是首先回收第0代的不可到达对象的内存。第0代对象内存不足以创建新的对象,同时第1代对象的体积也超出了容量值时,垃圾回收器将同时对第0代和第1代对象进行垃圾回收。回收后未被收回的第1代对象升级为第2代对象,未被回收的0代对象升级为1代对象,而后新建的对象仍为第0代。垃圾收集正式上述过程的不断重复。

强数据类型化带来的安全性:.NET很好的弥补了Windows提供的安全机制,因为它提供的安全机制是基于代码的安全性,而Windows仅提供了基于角色的安全性

Q:什么是应用程序域?

A:应用程序域是.NET中的一个重要技术改进,它用于减少运行应用程序的系统开销,这些应用程序需要与其他程序分离开来,但仍需彼此通信。

应用程序域是分离组件的一种方式,它不会导致因在进程间传递数据而产生的性能问题。

其方法是把任何一个进程分解到多个应用程序域中。每个应用程序域大致对应一个应用程序,执行的这个线程都运行在一个具体的应用程序域中。

澳门新浦京娱乐场网站 12

Q:.NET 如何处理运行时的错误?

A:.NET通过异常机制来处理运行时的错误情况。异常结构确保在发生错误情况时,执行进程跳到最有针对性的异常处理例程上,来处理错误。

规范:.NET包含了众多的规范,比如CIL,BCL, FCL, CTS, CLS,等等。

CLR:公共语言运行时

3.垃圾回收

  - 内存泄漏:请求内存的代码必须显式通知系统它什么时候不再需要该内存,很容易被遗漏,从而导致内存泄漏;

  - .NET垃圾回收期是一个程序,用来清理内存。所有动态请求的内存都分配到堆上,隔一段时间.NET检测到给定进程的托管堆已满,需要清理时,就调用垃圾回收器。垃圾回收器处理目前代码

     中所有变量,检查对存储在托管堆上的对象的引用,没有引用的对象被删除。因此:不能保证什么时候会调用垃圾回收器:CLR决定需要它时就可以调用它

四、程序集

Q:什么是程序集?

A:程序集是包含编译好的、面向.NET Framework的代码的逻辑单元。

注意:程序集是完全自描述的,它不是一个物理单元,可以存储在多个文件中。

注意:可执行代码和库代码使用相同的程序集结构。唯一区别是可执行代码的程序集包含一个主程序入口点。

Q:程序集的特性?

A:程序集的一个重要特性时它们包含的元数据描述对应代码中定义的类型和方法。程序集也包含描述程序集本身的元数据,这种程序集元数据包含在一个清单的区别当中,可以检查程序集的版本及其完整性。

Q:私有程序集与共享程序集的区别?

A:私有程序集是一种最简单的程序集类型。私有程序集一般附带在某个软件上,且只能用于该软件。

共享程序集是其他应用程序可以使用的公共库。

为解决名称冲突和程序集不同版本之间的覆盖问题,我们把共享程序集放在一个特定的子目录树中,这个子目录树称为全局程序集缓存(GAC,Global Assembly Cache)为了避免名称冲突,应根据私钥加密法为共享程序集指定一个名称,该名称称为强名(strong name),并保证唯一性,它必须由要引用共享程序集的应用程序来引用。

私有程序集完全是自包含的,只需把相应文件放在文件系统中对于文件夹即可,这个过程成为0影响安装。

Q:什么是反射技术?

A:因为程序集存储了元数据,包括在程序集中定义的所有类型和这些类型的成员的细节,所以可以编程访问这些元数据。这种技术成为反射。

什么是IL?

CTS:通用类型库

4. 应用程序域

  - 减少运行应用程序的系统开销,同时需要与其他程序分离开来,但仍需要彼此通信。

  - windows通过地址空间把进程分隔开来,每个进程有4GB的虚拟内存来存储其数据和可执行代码(4GB对应32位系统),每个进程都会有不同的映射,虚拟地址空间块映射的物理内存之间不重叠。

  - 任何进程都只能通过制定虚拟内存中的一个地址来访问内存,即进程不能直接访问物理内存。

  - 虚拟路径:相对路径, 物理路径:硬盘的绝对路径

五、名称空间

Q:什么是名称空间?

A:名称空间不过是数据类型的一种组合形式,但名称空间中所有数据类型的名称都会自动加上该名称空间的名字作为其前缀。

 

CLS:公共语言规范

5. 程序集

  - 程序集assembly是包含编译好的、面向.NET Framework的代码的逻辑单元,可以存储在多个文件中(动态程序集存储在内存中);如果一个assembly存储在多个文件中,其中就会有一个包含入口点的

    主文件,该文件描述了程序集中的其他文件。

  - 可执行代码和库代码使用相同的程序集结果。但是可执行的程序集包含一个主程序的入口点;而库程序集不包含。

  - 程序集的重要特征:包含的元数据描述了兑银代码中定义的类型和方法,程序集也包含描述程序集本身的元数据。

 

六、小结

澳门新浦京娱乐场网站 13

这是我读完第一章的一些笔记,如果有哪些不正确的地方,还请大家指出。

IL,Intermediage Language,中间语言,并不是CPU可以直接执行的本地机器语言,在转换成计算机可以识别的指令之前,还要进行一个被称为"Just in time"的二次编译过程。在.NET框架下,任何语言,比如C ,VB.NET,C#,等等,在经过各自的编译器编译之后,都会被转换成中间语言。IL还有另外的2种叫法:CIL,Common Intermediate Language;MSIL, Microsoft Intermediate Language。

CLR与IL分别是什么含义?

* C#概述

  - 块:{语句1 ;  语句2;} 注意:{}后面没有分号

  - Console.Write(" ");  

    * Console.WriteLine(" Two sample integers are {0} and {1} .", 3, 6);  从0开始替代标记、替代值

    * Console.WriteLine("Three integers are {1} , {0}, {1}", 3, 6); 输出6, 3, 6 。注意标记位和标记值一一对应,标记位从0开始。

  - 格式化字符串:

澳门新浦京娱乐场网站,    * Console.WriteLine(" The value: {0:C}.", 500);   格式化为货币,$500.00

    * Console.WriteLine(" {0, 10} ", 500); 正数右对齐,左边补...

  - 注释:

    * 单行//, 多行 /**/, 文档注释 ///

 

CLR:公共语言运行时,类似于Java中的JVM,Java虚拟机;在.Net环境下,各种编程语言使用一种共同的基础资源环境。CLR就是具体的编程语言如:C#.NET与操作系统之间的翻译,同时为具体的编程语言提供资源:

1.数据类型

查看IL代码,参考这里:

IL,中间语言,也称MSIL,微软中间语言,或CIL,通用中间语言;所有.NET源代码(不管用哪种语言编写)在进行编译时都被编译成IL。在应用程序运行时被即时(Just-In-Time,JIT)编译器处理成为机器码,被解释及执行。

 - 预定义类型16种:

    澳门新浦京娱乐场网站 14

 

什么是托管代码和非托管代码?

- 自定义类型6种:

      类(class)、结构(struct)、数组(array)、枚举(enum)、接口(interface)

什么是CLI?

托管代码就是Visual Basic .NET和C#编译器编译的代码。编译器把代码编译成中间语言(IL),而不是能直接在你的电脑上运行的机器码。比如用C# /http://VB.NET澳门新浦京娱乐场网站图解教程,基础概念001。写的任何代码都是托管代码

2. 栈和堆:

    * 栈:是一个内存数组(桶,LIFO先进后出,后进先出)

         # 存储类型:某些类型变量的值、程序当前的执行环境、传递给方法的参数

      # 栈的特征:只能从栈顶插入(push入栈),删除(pop出栈)

     * 堆:是一块内存区域,可以分配大块的内存用来存储某类型的数据对象,可以随意插入和移除;当对象不再被使用时,CLR的GC会自动回收

 

非托管代码直接编译成目标计算机的机械码,只能运行在编译出它们的计算机上,或者是其它相同处理器或者几乎一样处理器的计算机上。Visual C 可以创建非托管程序。比如COM组件, ActiveX组件和Win32接口函数都是非托管代码。

   - 值类型和引用类型

    * 值类型:需要一段单独的内存,存储实际的数据,放在栈中

    * 引用类型:需要两段内存。第一段存储实际的数据,放在堆中;第二段是一个引用,指向数据在堆中的存放的位置,放在栈中

    * 总结:

      简单情形:值类型数据放在栈中;引用类型,实际数据始终放在堆中,引用放在栈中

      复杂情形:引用类型的数据始终放在堆中;值类型对象或引用类型的引用部分可以放在堆中,也可以放在栈中,依赖于实际环境。

 在赋值的时候,值类型是复制一份,新的和旧的在以后的操作中互不影响,而引用类型复制的只是地址,在以后的修改中,修改新的旧的也会受到影响。

    * 为数据分配内存:

      ClassA  a = new ClassA();  a只是用来保存引用分配在栈中,使用new才是给实际数据分配内存【new运算符为任意指定类型的实例分配内存并初始化内存】

     澳门新浦京娱乐场网站 15

CLI,Common Language Infrastructure, 公用语言基础, .NET的各种规范都遵循了这个标准。

托管代码与非托管代码的区别

3. 变量常量

变量类型 用途 存储位置 自动初始化
本地变量 在方法的作用域保存临时数据,不是类型成员 栈或堆和栈
字段 保存和类型或类型实例相关的数据,是类型成员 
参数 从一个方法到另一个方法传递数据的临时变量,不是类型的成员
数组元素 同类数据项构成的有序集合的一个成员,可以为本地变量,也可以类型的成员 类成员是,本地变量否

    * 静态类型:变量的类型在编译的时候确定并且不能再运行时修改。

    * dynamic:在编译时对dynamic类型的所有信息打包,在运行时,对这些信息进行检查,会抛出异常。

    澳门新浦京娱乐场网站 16

  - var关键字(从等号右边推断出的实际类型的速记,并不改变C#的强类型性质)

    * 只能用于本地变量,不能用于字段。

    * 只能在变量声明中包含初始化时使用(即var n = 10;)

    * 一旦编译器推断出变量的类型,它就是固定且不能更改。

  - 常量: const double PI = 3.1415; 声明时初始化,在编译时确定类型,不能再赋值

  - DateTime dt = DateTime.Now;

 

1、托管代码独立于平台和语言,能更好的实现不同语言平台之间的兼容;

  -  委托

澳门新浦京娱乐场网站 17澳门新浦京娱乐场网站 18

namespace EventTest
{
    /// <summary>
    /// 委托总结:委托是一种类型,和类是平级,因此不存在重载一说
    /// 系统提供的委托: 
    ///     无返回值:Action无参数无返回值,Action<string, int>有参数无返回值
    ///     有返回值:Func<int, int>最后一个都是返回值
   public  class SmarizeDelegate
    {
        public void Test()
        {
            MyDel del = (x, y) => { return x   y; };  //lamda表达式
            del(10, 20);

            MyDel2<int> del2 = (x, y) => x   y; //lamada表达式带return就要带{},不带return就可以不带{}
            del(10, 20);

            M1((x, y) => (x   y).ToString()); //Func有返回值委托,传入两个int,返回一个string

            Func<string, string, string> fn = M2(); //调用委托作为返回值的
            fn("你好", "徐攀");
        }

        static void M1(Func<int, int, string> fn) //委托作为方法参数类型
        {
            Console.WriteLine(fn(10, 20));
        }

        static Func<string, string, string> M2() //委托作为方法返回值
        {
            return new Func<string, string, string>((x,y) => x y);
        }
    }

    public delegate int MyDel(int x, int y); //基本委托

    public delegate T MyDel2<T>(T t1, T t2); //泛型委托
}

委托代码

 

什么是BCL?

     非托管代码依赖于平台和语言。

 

2、托管代码可享受CLR提供的服务(如安全检测、垃圾回收等),不需要自己完成这些操作;

BCL, Basic Class Library, .NE为我们提供的基类库。

       非托管代码需要自己提供安全检测、垃圾回收等操作。

 

托管代码的执行过程

创建一个控制台项目。

1、选择编译器:选择一个或多个针对运行库的语言编译器,如 Visual Basic、C#、Visual C 、JScript 或许多第三方编译器(如 Eiffel、Perl 或 COBOL 编译器)。

 

2、编译,将源代码翻译为microsoft中间语言(MSIL)并生成需要的元数据。

把鼠标停留在Console上,并按F12。

3、执行,实时 (JIT) 编译器将 MSIL 翻译为本机代码。PS:编译过程中,代码通过验证.

 

      确认 MSIL 和元数据是否可以将代码确定为类型安全。

发现Console是System的成员,点击System。

4、运行代码:公共语言运行库提供使执行能够发生以及可在执行期间使用的各种服务的结构。

 

什么是基元类型

发现System是mscorlib的成员,点击mscorlib。

由编译器直接支持的数据类型称为基元类型,例如:在C#中,int直接映射为System.Int32类型

 

类型:sbyte / byte / short / ushort /int / uint / long / ulong       char / float / double / bool

发现mscorlib是一个程序集,位于C:Program Files (x86)Reference AssembliesMicrosoftFramework.NETFrameworkv4.5mscorlib.dll

类型

 

澳门新浦京娱乐场网站 19

也就是mscorlib包含了.NET的基类库。

澳门新浦京娱乐场网站 20

 

类型有两种:值类型 (value type) 和引用类型 (reference type)

string类型是否属于基类库呢?

值类型存储是数据,存储于栈,派生于 System.ValueType

 

引用类型的变量存储对其数据的引用称为对象。存储于堆。

把鼠标停留在string关键字上,并按F12。

值类型、静态变量被

 

GC回收吗?

发现string实际上是System.String类型,原来.NET为我们把关键字string和CLI标准System.String作了映射。

值类型是在栈上, 当某方法返回时, 栈会恢复到该方法调用前的状态, 该方法在栈上分配的值类型的内存自然就释放了, 不必等GC。PS:回收引用类型

 

静态字段 分配在Loader heap 中,非 GC heap,不受GC控制。
应用程序域卸载的时候回收静态变量

依此类推, btye映射了System.Byte, short映射了System.Int16, 等等。

值类型、引用类型是否可以派生?

 

值类型密封(seal)的,所以无法派生出新的值类型。

像string, byte, short,等等,这些都是基元类型。所以,凡是把语言本省的关键字与CLI的类型映射起来的,都叫基元类型。

引用类型可以派生出新的类型。

 

值类型和引用类型的区别

什么是FCL?

继承System.Value的类型都是值类型,其他类型都是引用类型。

 

引用类型可以派生出新的类型,而值类型不能;

FCL, Framework Class Library, 框架类库,提供的类库更多,BCL是FCL的子集。比如,在ASP.NET MVC下提供了System.Web.MVC。

引用类型存储在堆中,而值类型既可存储在堆中也可以存储在栈中。

 

引用类型可以包含null值,值类型不能(可空类型功能允许将null赋给值类型);

什么是CTS?

引用类型变量的赋值只复制对对象的引用,而不复制对象本身。而将一个值类型变量赋给另一个值类型变量时,将复制包含的值。当比较两个值类型时,进行的是内容比较;而比较两个引用类型时,进行的是引用比较。

 

值类型在内存管理方面具有更好的效率,并且不支持多态,适合用作存储数据的载体;引用类型支持多态,适合用于定义应用程序的行为。

CTS, Common Type System, 公共类型系统。CTS规定了在编程语言中可以定义的方面,包括:类、结构、委托,类中的方法、字段、属性、事件等,还定义了一些约束,比如所有类型都隐式继承自System.Object类型。

Int[]是引用类型还是值类型

 

数组类型继承System.Array,而System.Array继承自System.Object。所以所有的数组类型都是引用类型

什么是CLS?

引用类型各概念

 

类:包含数据成员(字段)和函数成员(方法、属性等)的数据结构

CLS, Common Language Specification, 公共语言规范,必须完全符合CTS的标准,是CTS的子集。比如C#编译生成的程序集有很多类,VB编译生成的程序集也有很多类,现在VB编译需要引用C#程序集的某个类,怎么办呢?

接口:像一个协定,作为一个公共函数成员的命名集

 

委托:对具有特定参数列表和返回类型的方法的引用,通过委托,将方法作为实体赋值给变量和作为参数传递

我们需要让C#程序集中,需要被引用的这个类符合CLS规范,.NET为我们准备了CLSCompliant特性。

数组类型:通过在某个类型名后加一对方括号来构造的,数组不用声明就可以应用。例如:int[];

 

用户可以自定义类型?

[assembly:CLSCompliant(true)]

public class SomeClass

{    

}

类类型(class type)、结构类型(struct type)、接口类型(interface type)、枚举类型(enum

 

type)和委托类型(delegate type)。

什么是CLR?

哪些类型支持泛型?

 

类类型、结构类型、接口类型、委托类型

CLR, Common Language Runtime, 公用语言运行时。IL代码需要通过CLR进行即时编译才能转换成机器代码。大致过程是:

变量

 

C# 中存在几种变量(variable),包括字段、数组元素、局部变量和参数,变量表示了存储位置。

编程语言代码编译生成程序集。程序集中的PE/COFF头包含了供Windows操作系统查看和使用的信息;CLR头告诉操作系统这是一个.NET程序集;程序集清单描述了程序集本身的信息,比如程序集标识、程序集包含的资源、组成程序集的文件,等等;元数据描述了程序集包含的内容,比如包含的模块、类型、类型成员、类型成员的可见性,等等。

澳门新浦京娱乐场网站 21

 

什么是装箱和拆箱?

CLR开始工作:管理应用程序域,加载和运行程序集, 安全检查, 将IL代码JIT编译成机器代码,异常处理, 垃圾回收,等等。

装箱:从值类型转换到引用类型。

 

拆箱:从引用类型转换到值类型。

相关文章:

装箱

CLR如何加载程序集以及程序集版本策略  
查看是否安装.NET Framework、.NET Framework的版本号、CLR版本号    
CLR是如何被加载并工作的  

装箱转换允许将 value-type 隐式转换为 reference-type。下列装箱转换:

 

从任何 value-type 到 object 类型。

什么是JIT?

从任何 value-type 到 System.ValueType 类型。

 

从任何 non-nullable-value-type 到 value-type

JIT, just in time, 即时编译。在CLR中,把IL转换成机器代码的工作交给了JIT编译器。即时编译只在方法第一次被调用时发生。

实现的任何 interface-type。

从任何nullable-type到由nullable-type的基础类型实现的任何interface-type

从任何enum-type到 System.Enum 类型。

从任何具有基础 enum-type 的 nullable-type 到 System.Enum 类型。

装箱转换隐含着复制一份待装箱的值

拆箱转换

取消装箱转换允许将reference-type显式转换为value-type。存在以下拆箱转换:

从 object 类型到任何 value-type。

从 System.ValueType 类型到任何 value-type。

从任何interface-type到实现了该 interface-type 的任何non-nullable-value-type

从任何interface-type到其基础类型实现了该interface-type的任何nullable-type

从 System.Enum 类型到任何 enum-type。

从 System.Enum 类型到任何具有基础 enum-type 的 nullable-type。

本文由澳门新浦京娱乐场网站发布于www.146.net,转载请注明出处:澳门新浦京娱乐场网站图解教程,基础概念001