1.CLR
提供了程序的执行环境,CLR中有一个虚拟机,在许多方面与Java虚拟机类似。
CLR负责激活对象,并对其进行安全检查再将其在内存中布局,执行它们,最后进行垃圾回收。
CLR 为编译器提供了托管执行环境和编译服务。
CLR 编译器将源代码编译成中间语言 (IL),然后再以实时 (JIT) 方式执行 IL。
所有源语言都共享 CLR,并编译成相同的 IL。
2.基类库
这些类提供了一致且易于使用的方法,用于访问各种信息。
(例如,系统信息、用户信息等),而以前要访问这些信息,必须使用特殊的组件或 API。
框架基类与Java中的类集合很相似。这些类支持基本的输入与输出、字符串操作、
安全管理、网络通信、线程管理、文件操作、反射和集合等功能。
3.数据管理(ADO.NET and XML)
数据类支持保存对保存在后端数据库中的数据进行持久性管理。
这些类中包括用标准SQL(结构化查询语言)接口进行持久数据存储的SQL类。
还有称为ADO.NET的一组类,可以操作持久数据。
.NET框架还支持许多用于操作XML数据并进行XML搜索和转换的类。
ADO.NET 代替 ADO 作为 .NET 框架中的数据处理机制,它是使用 XML 进行数据传输的高度可伸缩技术。
4.ASP.NET
Windows Forms
所有语言都共享公共 Windows 窗体引擎。窗体设计器在所有语言中都是一致的,因此所有语言都可以访问提供相同属性和方法的相同固有控件。
即使使用不同的语言开发,其界面也都具有相同的外观。
Web Forms和Windows Forms使我们可以将RAD(快速应用开发)技术应用到web应用程序的开发中。
只需简简单单的把控件拖放到表单元上,双击控件,在编写对相关事件响应代码就行了。
5.公共语言规范
此规范是实现 .NET 框架的所有语言的基础,定义了公共类型系统的标准和所有语言必须实现的功能。这是第三方语言与框架集成的基础。
6.语言
Visual Studio .NET 自身包含四种语言:Visual Basic、Visual C++、Visual C# 和 JScript。
然而,.NET 框架的模块化特性使得由第三方创作的其他语言也可以集成到 Visual Studio .NET 中。
此类语言有 20 多种,包括 Perl、Component Pascal、SmallScript 和 Smalltalk。
1) 编好的代码(源代码)经过编译,链接,生成可执行的文件,然后就可以执行。即编辑的代码要最重生成可执行的程序(可执行的文件),需要经过编译、链接两个步骤。编译的作用是对代码进行语法检查,而链接的作用是链接代码中用到的编译器提供的资源。所以,通常通过编译、链接后形成的只形成一个可执行的文件。
2) 从键盘中读入hello命令,经过shell的解析,shell执行一系列的指令将hello目标文件中的代码和数据从磁盘中拷贝到主内存当中,如下图所示:
3) 这个过程会利用DMA技术,不经过CPU数据直接从磁盘拷贝到内存当中
4) 一旦hello目标文件中的代码和数据被加载到了内存当中,处理器就开始执行hello程序中的主程序的机器语言指令,这些指令将“hello world\n”串中的字符从内存中拷贝到寄存器中,再从寄存器中将这些内容拷贝到显示设备上,最终显示在屏幕当中。
Console.WriteLine("Hello,World!");
Console.ReadKey();
Console.ReadKey()的作用
暂停当前程序,等待用户按下任意键继续,按下的任意键将显示在我们的控制台当中
Web service到底是什么;在什么情况下你应该使用Web service。
研究一下当前的应用程序开发,你会发现一个绝对的倾向:人们开始偏爱基于浏览器的客户端应用程序。这当然不是因为客户端能够提供更好的用户界面,而是因为它能够避免花在桌面应用程序发布上的高成本。发布桌面应用程序成本很高,一半是因为应用程序安装和配置的问题,另一半是因为客户端和服务器之间通信的问题。
传统的Windows客户应用程序使用DCOM来与服务器进行通信和调用远程对象。配置好DCOM使其在一个大型的网络中正常工作将是一个极富挑战性的工作,同时也是许多IT工程师的噩梦。事实上,许多IT工程师宁愿忍受浏览器所带来的功能限制,也不愿在局域网上去运行一个DCOM。在我看来,结果就是一个发布容易,但开发难度大而且用户界面极其受限的应用程序。极端的说,就是你花了更多的资金和时间,却开发出从用户看来功能更弱的应用程序。不信?问问你的会计师对新的基于浏览器的会计软件有什么想法:绝大多数商用程序用户希望使用更加友好的Windows用户界面。
关于客户端与服务器的通信问题,一个完美的解决方法是使用HTTP协议来通信。这是因为任何运行Web浏览器的机器都在使用HTTP协议。同时,当前许多防火墙也配置为只允许HTTP连接。
许多商用程序还面临另一个问题,那就是与其他程序的互操作性。如果所有的应用程序都是使用COM或.NET语言写的,并且都运行在Windows平台上,那就天下太平了。然而,事实上大多数商业数据仍然在大型主机上以非关系文件(VSAM)的形式存放,并由COBOL语言编写的大型机程序访问。而且,还有很多商用程序继续在使用C++、Java、Visual Basic和其他各种各样的语言编写。除了最简单的程序之外,所有的应用程序都需要与运行在其他异构平台上的应用程序集成并进行数据交换。这样的任务通常都是由特殊的方法,如文件传输和分析,消息队列,还有仅适用于某些情况的的API,如IBM的”高级程序到程序交流(APPC)”等来完成的。在以前,没有一个应用程序通信标准,是独立于平台、组建模型和编程语言的。只有通过Web Service,客户端和服务器才能够自由的用HTTP进行通信,不论两个程序的平台和编程语言是什么。
什么是Web Service
* 对这个问题,我们至少有两种答案。从表面上看,Web service 就是一个应用程序,它向外界暴露出一个能够通过Web进行调用的API。这就是说,你能够用编程的方法通过Web来调用这个应用程序。我们把调用这个Web service 的应用程序叫做客户。例如,你想创建一个Web service ,它的作用是返回当前的天气情况。那么你可以建立一个ASP页面,它接受邮政编码作为查询字符串,然后返回一个由逗号隔开的字符串,包含了当前的气温和天气。要调用这个ASP页面,客户端需要发送下面的这个HTTP GET
返回的数据就应该是这样:
在linux系统终端中输入一条命令:echo hello world! 显示字符”hello world!”
用户在输入echo hello world!时,shell程序会将键盘输入的每一个字符逐一读入CPU寄存器中,然后再保存到主存储器中,在主存储器中形成字符串”echo hello world!”,当按下Enter键时,shell将调出linux系统的API接口函数”echo”,hello、world!作为echo函数的参数被使用,此时系统通过80端口:int 80产生一个软中断,由父进程通过fork(),创建一个子进程,需要申请空白PCB,为进程分配所需的资源,并初始化PCB,将其加入就绪队列。当该进程的时间片到达时,操作系统设置CPU上下文环境,并跳到程序开始处。
linux系统采用页式存储管理,程序的第一条指令执行,失败,缺页中断发生,此时操作系统需要分配一页内存,并通过软终端的方式调用磁盘驱动程序将代码从磁盘读入,读入之前需要保存现场,中断完成恢复现场,linux将外设认为是文件,数据将通过读接口调入内存。以后发生更多的缺页中断,读入更多的页面,若命中则无需产生中断。字符的显示同样需要系统调用,产生中断,调用设备驱动程序。将字符发送到窗口系统的缓冲区,告诉窗口系统它要显示字符串,窗口系统将字符串转成像素,写入存储映像区,视频硬件将成像素表示转换成一组模拟信号,接下来我们就能看到输出的hello world了
c#中,两种不同性质的数据类型,分别是值类型和引用类型。
1) 值类型
整型
浮点类型
float数据类型用于较小的浮点数,因为它要求的精度较低。
double数据类型比float数据类型大,提供的精度也大一倍(15位)。
如果在代码中没有对某个非整数值(如12.3)硬编码,则编译器一般假定该变量是double。
如果想指定该值为float,可以在其后加上字符F(或f),如:
float f = 12.3F;
decimal类型
decimal类型专门用于进行财务计算,使用decimal类型提供的28位的方式取决于用户。
要把数字指定为decimal类型,可以在数字的后面加上字符M或(m),如:
decimal d=12.30M;
bool(布尔)类型
char字符类型
char类型的字变量是用单引号括起来的。 如’A’
如果把字符把在"A"(双引号)内,编译器会把它看作是字符串,从而产生错误。
2) 引用类型(Object类型和字符串类型)
根据国际标准IEEE 754,任意一个二进制浮点数V可以表示成下面的形式:
(1)(-1)^s表示符号位,当s=0,V为正数;当s=1,V为负数。
(2)M表示有效数字,大于等于1,小于2。
(3)2^E表示指数位。
举例来说,十进制的5.0,写成二进制是101.0,相当于1.01×2^2。那么,按照上面V的格式,可以得出s=0,M=1.01,E=2。
十进制的-5.0,写成二进制是-101.0,相当于-1.01×2^2。那么,s=1,M=1.01,E=2。
为什么0x00000009还原成浮点数,就成了0.000000?
首先,将0x00000009拆分,得到第一位符号位s=0,后面8位的指数E=00000000,最后23位的有效数字M=000 0000 0000 0000 0000 1001。
由于指数E全为0,所以符合上一节的第二种情况。因此,浮点数V就写成:
V=(-1)^0×0.00000000000000000001001×2^(-126)=1.001×2^(-146)
显然,V是一个很小的接近于0的正数,所以用十进制小数表示就是0.000000。
请问浮点数9.0,如何用二进制表示?还原成十进制又是多少?
首先,浮点数9.0等于二进制的1001.0,即1.001×2^3。
那么,第一位的符号位s=0,有效数字M等于001后面再加20个0,凑满23位,指数E等于3+127=130,即10000010。
所以,写成二进制形式,应该是s+E+M,即0 10000010 001 0000 0000 0000 0000 0000。这个32位的二进制数,还原成十进制,正是1091567616。
类方法,也称静态方法,指的是用static关键字修饰的方法。此方法属类本身的方法,不属于类的某一个实例(对象)。类方法中不可直接使用实例变量。其调用方式有三种:可直接调用、类名.方法名、对象名.方法名。实例方法指的是不用static关键字修饰的方法。每个实例对象都有自身的实例方法,互相独立,不共享一个。其调用方式只能是对象名.方法名。
用修饰符static声明的方法为静态方法,不用修饰符static声明的方法为实例方法。不管类生成或未生成对象,类的静态方法都可以被使用,使用格式为:类名.静态方法名。静态方法只能使用该静态方法所在类的静态数据成员和静态方法。这是因为使用静态方法时,该静态方法所在类可能还没有对象,即使有对象,由于用类名.静态方法名方式调用静态方法,静态方法没有this指针来存放对象的地址,无法判定应访问哪个对象的数据成员。在类创建对象后,实例方法才能被使用,使用格式为:对象名.实例方法名。实例方法可以使用该方法所在类的所有静态成员和实例成员。
何时用静态方法,何时用实例方法?
先说实例方法,当你给一个类写一个方法,如果该方法需要访问某个实例的成员变量时,那么就将该方法定义成实例方法。一类的实例通常有一些成员变量,其中含有该实例的状态信息。而该方法需要改变这些状态。那么该方法需要声明成实例方法。
静态方法正好相反,它不需要访问某个实例的成员变量,它不需要去改变某个实例的状态。我们把该方法定义成静态方法。
出生:新创建的线程处于 出生 born状态,在调用线程的start方法之前,该线程一直处于出生状态;
就绪:当调用start方法后,线程便进入了 就绪状态 ready。
运行:当系统给线程分配处理器资源时,处于就绪状态的最高优先级线程便进入了运行状态。running
死亡:当线程的run 方法结束或抛出一个未捕获的异常,那么线程便进入死亡状态。
阻塞:如果处于运行状态的线程发出 I/O请求,它便进入阻塞状态。 blocked。当其等待的I/O操作结束时,阻塞的线程便回到就绪状态。
等待:当处于运行状态的线程调用wait方法时,线程便进入等待状态。它将按次序排在等待队列中,队列中的线程均是由于某个对象调用了wait方法才进入等待状态的
当与某对象相关的另一个线程调用了notify方法时,那么等待该特定对象的一个线程便进入就绪状态。
当与某对象相关的一个线程调用了notifyAll方法后,等待该对象的所有线程都回到就绪状态。
休眠: 当程序调用一个正在运行的线程的sleep 方法时,该线程便会进入休眠状态。