C#基础(一)(温故而知新)
一、C#与.NET的关系
C#本身是一门语言,他是用于生成面向.NET环境的代码,但其并不是.NET的一部分。换言之,C#编写的代码总是运行在.NET Framework中。而且,在很多时候,C#的特定功能依赖于.NET。比如,在C#中声明一个int类型,实际上是.NET中System.Int32类的一个实例。
.NET的核心是CLR(公共语言运行时)。在CLR中运行的代码,我们成为“托管代码”。
我们写的代码在运行之前,会经过两个编译阶段。
1、把源代码编译为IL(Microsoft中间语言)
2、CLR把IL编译为平台专用的代码。
在这里,我们来简单说说“托管代码”。
IL和Java的字节代码的理念基本是一样的,都是一种低级语言,都用数字表示,可以非常快速度的转化为机器代码,这样执行效率会高很多,同时这也就是我们经常说的“平台无关性”的实现很重要的一个环
节。VB.NET C# J# 的源码都可以被编译成相同的IL, 也就实现了平台无关。换言之,只要.NET Framework 可以运行在任何设备或系统上,VB.NET C# J#编写的代码都可以运行,而且都可以运行在任何设备或者系统上。
VB.NET C# J# 的源码都可以被编译成相同的IL,这样不同语言编写的不同类都可以很容易的相互操作,也就是所说的,语言的互操作性。
似乎这个IL(Microsoft 中间语言)很好很强大,很神很奇特。我们接下来了解下这个IL。
首先,简要的说说它的主要特征:
A、面向对象和使用接口
B、值类型和引用类型之间的巨大差别
C、强数据类型
D、使用异常来处理错误。
E、使用属性(attribute)
接下来具体说说这些特征。
(一)、面向对象和使用接口
面向对象,在此不做多的阐述了。主要在这里说说接口。关于接口,有一个很重要的理念:提供一个契约,实现给定接口的类,必须提供该接口的所有方法和属性的实现。举个例子说明吧,有个接口IUser ,其有age,sex,userName属性,有setUname(),getAge()方法。有个类,UserClass继承自IUser。这时,UserClass就必须实现IUser的所有方法setUname(),getAge()和所有属性age,sex,userName。
(二)、值类型和引用类型的巨大差异。
对于值类型,变量直接保存其数据,而对于引用类型,变量仅仅保存数据的地址。值类型一般存储在堆栈中,引用类型一般存储在托管堆中。
(三)、强数据类型
所谓强数据类型,是指所有的变量都明确的被标记为某个特定的数据类型。比如string 或者int 等。IL不允许对模糊数据类型执行操作。在javascript中的var 变量就是模糊类型数据。
不过在现在的,.NET 3.5 中也加入了var ,也就是模糊数据类型。
(四)、使用异常来处理错误。
C#中以try{} catch{}finally{}代码块来处理。这个具体在后面再谈。
(五)、属性的使用。
用户定义的Attribute和其对应的数据类型或方法的元数据放在一起,这对于文档说明很有用,它们和反射技术一起使用,执行特定的任务。
在这里提及到的元数据以及反射,在后面我们将会详细讲述到。
C#基础(二)(温故而知新)
二、程序集
程序集(Assembly)是包涵编译好的,面向.NET Framework 的代码的逻辑单元。程序集是完全自我描述性的,也是一个逻辑单元。程序集的一个重要特点是其包含的元数据描述了对应代码中定义的类型和方法。程序集也包含了自身的元数据。
程序集也有私有程序集和共享程序集之分。这些在后面我们将会学习到。
三。、反射。
因为程序集存储了元数据,包括在程序集中定义的所有类型和方法,所以可以编程访问这些元数据。这种技术就成为反射。这种方法很有趣,我们在后面详细介绍。
四、命名空间
命名空间是.NET避免类名冲突的一种方式。在大型开发中,往往都是团队开发,假如A公司开发了一个user类,而B公司也开发了一个user类,如果两个类要一起工作,就很可能产生冲突,这时候,命名空间便能很好的解决问题。A公司的user类的命名空间可以命名为companyA,而B公司的user类可以命名为companyB,这样即使两个类在一起工作也不会产生冲突,在实例化类的时候,我们采用命名空间.类名这样的方式来实例化的。即:companyA.user 这样的方式。
C#基础(三)(变量的声明,变量的作用域
以及常量)
从这一节开始,我们开始复习C#基础知识,涉及变量声明,变量的初始化,作用域,C#的预定义数据类型,C#中的循环和条件语句,枚举,命名空间,Main()方法,C#标识符和关键字,C#编码的规范和约定,等等。
首先,我们还是从非常经典的“Hello word !”开始。
我们新建一个.txt文件,并且更改为test.cs 。然后键入以下内容。
using System;
namespace gosoa
{
class MyFirstClass
{
static void Main()
{
Console.WriteLine("Hello world !");
}
}
}
然后打开C#命令行编译器,编译这个文件。也就是在C#命令行中输入
csc test.cs
编译成功后会在存放该文件的目录,生成一个文件。我们继续在C#命令行中输入 就会运行文件,输出Hello World !(说明:这里的C#命令行在开始-程序-Microsoft .NET Framework SDK v2.0-SDK命令提示)
在上个例子中,我们简单说明几个该注意的事项,首先,第一句using System; 是用来引入System基类。和java的import相似,这是C#的基类,C#的所有工作都依赖于该基类。第二句namespace gosoa 是我们之前提到的命名空间,命名空间为gosoa,当然,你可以命名为任意名称。但,为了避免冲突,我们一般采用自己公司的域名做为命名空间。第三句,class MyFirstClass 是声明一个名称为MyFirstClass的类。第四句,static void
Main() 是程序的主方法,注意,这里的Main() 方法首字母大写喔。第五句,Console.WriteLine ("Hello world !"); 就是输出Hello world ,
Console.WriteLine 就是基类中的一个方法。
在C#中,和其他很多语言(C,JAVA等)一样,句子末尾以分号”;”结束,程序代码都放在{}一对大括号中。
一、变量
1.1变量的声明
C#中变量的声明我们以实例来说明,例如,int i; 该句声明了一个int (整型) 变量i 。再如,string str; 这句声明了一个string(字符串类型)的
变量str 。
1.2变量初始化
C#编译器需要每个变量在有了初始值之后才能使用该变量。
在C#变量初始化时有两点需要注意,
A 、变量是类或者结构中的字段,如果没有显式的初始化,在默认状态下,创建这些变量时,其初始
值就是0;例如下面的代码:
using System;
namespace gosoa
{
class MyFirstClass
{
static int y;
static void Main()
{
Console.WriteLine(y);
}
}
}
我们在类中声明了一个变量y,然后输出该变量,编译并运行后我们会看到输出的结果是0 。
writeline输出数值变量B、方法中的变量,必须显式的初始化,否则在使用该变量的时候会出错。如下面的代码:在编译的时候就会报错。我们需要把int y ; 显式的初始化
,才会通过编译。比如我们初始化y的值为10 ,即int y=10; 便会通过编译。
using System;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论