文档库 最新最全的文档下载
当前位置:文档库 › CSharp学习资料

CSharp学习资料

CSharp学习资料
CSharp学习资料

第一章.NET 体系结构简介

1.1 .NET 体系主要由以下两部分组成

1.11 .NET Framework 类库

.NET Framework 类库是一个内容丰富的类集合,它可以完成以前要通过Windows API 来完成的绝大多数任务。

1.12 公共语言运行库(CLR )(Common Language Runtime ) CLR 是.NET Framework 的核心执行环境,也称.NET 运行库。

1.2 CLR 概述

CLR 主要负责“托管代码”的编译和运行。

在.NET 中代码的编译分为两个阶段,如图1.1所示:

1、把源代码编译为Microsoft 中间语音(MSIL );

2、CLR 把MSIL 编译为平台专用的代码。

编译器 CLR 激活JIT

图1.1 .NET 中C#语音的执行过程

1.21 托管代码(Managed Code )

托管代码是由CLR 运行环境(不是直接由操作系统)执行的代码。托管代码的优点:

◆ 平台无关性

◆ 提高性能

◆ 语音的互操作性

目标机器(Window s 、Linux 等) *.cs

C#源代码 MSIL 微软中间语音

1.22 非托管代码(Unmanaged Code)

非托管代码是由操作系统直接执行的代码。非托管代码必须提供自己的垃圾回收、类型检查、安全支持等服务;它与托管代码不同,后者从公共语言运行库中获得这些服务。非托管代码有汇编语音、C语音等。

托管代码和非托管代码区别:前者运行效率稍低,代码编写容易,开发效率高;后者运行效率高,代码编写较难,开发效率低。

第二章面向对象语言C#基础

2.1 C#简介

2.11第一个C#程序(控制台应用程序)

using System; //引用命名空间

namespace BitPC.CSharp.Basics //定义命名空间

{

class MyFirstCSharpClass //引用类类型

{

public static void Main() //方法

{

Console.WriteLine(“This is my first C# program!”);//输出无参字符串

//输出带参数的字符串

Console.WriteLine(“{0},你好,你的性别是{1}的!”,”唐健”,”男”);

Console.ReadLine();

return;

}

}

}

2.2 变量

2.21 变量的定义及初始化

在C#中声明变量使用的语法:数据类型变量;

例如:int i;

◆变量只能先定义后使用;

◆定义变量后必须初始化才能使用;

◆变量要占用一定字节数的内存单元,以上声明会在堆栈中给i分配4个字节。

声明i后,进行如下的初始化:

int i=10;

2.3 预定义数据类型

2.31 值类型和引用类型

●值类型

结构体:struct(直接派生于System.ValueType)

数值类型:

整形:sbyte,short,int,long等

字符型:char

浮点型:float,double

财务计算类型:decimal

布尔类型:bool或Boolean

用户自定义的结构体

枚举:enum

可空类型:?及??

●引用类型

数组类型

用户自定义的类型:

类:class

接口:interface

委托:delegate

对象类型:object

字符串:string

●两种类型的区别

存储地址不同:值类型存储在堆栈,引用类型存储在托管堆;

值类型之间主要传值,引用类型之间主要传地址;

例如:int是值类型,这表示下面的语句会在内存的两个地方存储值20;

考虑下面代码

//i和j都是整形

i=20;

j=i;

Vector x,y;

x=new Vector();

x.Value=30;

y=x;

Console.WriteLine(y.Value); y.Value=50;

Console.WriteLine(x.Value);

要理解的重点是在执行上面这段代码后,只有一个Vector 对象。x 和y 都指向包含该对象的内存位置(y=x ;是传地址)。要让y 指向另一个不同的地址,必须使用new 关键字创建一个新对象。

如果变量是一个引用,可以把其值设置为null ,表示它不指向任何对象,而值类型不能赋值为空(可空类型除外);

如果将引用设置为null ,就不可对它调用任何非静态的成员函数或字段,否者运行时会抛出异常。

2.32 CTS (Common Type System )类型

在C#中声明一个int 类型的数据时,声明的实际上是.NET 结构System.Int32的一个实例,其意义深远:这表示在语法上,可以把所有的基本数据类型看作是支持某些方法的类。例如,要把int i 转换为string ,可以编写如下代码:

2.33 预定义的值类型

内置的值类型表示基本数据类型,例如整形和浮点型、字符型和布尔型。

2.34 预定义的引用类型

C#支持两个预定义的引用类型:object (根类型,CTS 中其他类型都是从它派生出来的),string (Unicode 字符串)

Object 类型

在C#中,object 类型就是最终的父类型,所有内置类型和用户定义的类型都 是从它派生而来。两个目的:

◆ 可以使用object 引用绑定任何子类型的对象。

◆ Object 类型执行许多一般用途的基本方法,包括Equals ()、

GetHashCode ()、GetType ()和Tostring ()。用户定义的类需要使用一种面向对象技术——重写。

父类型的引用可以指向任何派生类的对象。

String 类型

C#有string 关键字,在翻译为.NET 类时,它就是System.String 。

y=null ;//正确 int a=null ;//错误 string s=i.Tostring (); string str1=”Hello ”; string str2=”World ”; string str3=str1+str2;

● 字符串字面量放在双引号中(“….”);若放在单引号中,编译器会把它

当作char ,引发错误。

● 尽管这是一个值类型赋值,但string 是一个引用类型。String 对象保留在

堆上,而不是栈上。

● String 与引用类型在常见的操作上有一些区别。例如,修改其中一个字

符串,就会创建一个全新的string 对象,而另一个字符串没有改变。如下:

可以看到,str1的值被改为

World ,但是str2的值仍是Hello 。

在字符串中,若要使用一般意义上的反斜杠,则需要用两个反斜杠字符(\\)来表示它,第一个“\”是转义字符,如:

String filepath=”C:\\ProCSharp\\First.cs ”;

可以在字符串字面量前面加上@,在这个字符后的所有字符都被看作是其原来的含义——不会被解释为转义字符:

String filepath=@”C:\ProCSharp\First.cs ”;

甚至允许在字符串字面量中包含换行符:

String jabberwocky=@”’Twas brillig and the slithy toves

Did and mother in the way.”;

那么jobberwocky 的值就是:

’Twas brillig and the slithy toves

Did and mother in the way.

2.35字符串常规操作

◆ 创建字符串

以上的操作性能不佳,浪费内存空间(任何一次对字符值的修改都要重新创建全新的对象及占用新的内存),,若需要频繁地进行字符串的连接,建议写成:

或使用StringBuilder 类对象:

StringBuilder str2=new StringBuilder(string.Empty,25);是创建StringBuilder 类的带string str1=”Hello ”;

string str2=str1;

str1=”World ”;

string str1=string.Empty; str1+=”How old ”; str1+=”are you?”; string str1=”How old ”+”are you ?”;

StringBuilder str2=new StringBuilder(string.Empty,25); Str2.Append=(“How old ”); Str2.Append=(“are you?”);

有空字符串的一个实例,同时指定该对象的最大容量为25,当修改str2时,在达到容量之前,它不会为自己重新分配空间。当达到容量时,将自动分配新的空间且容量翻倍。所有从性能上来说,StringBuilder省去了频繁创建对象内存的时间,在性能上得到了很大的提高。

2.36 var关键字

从C#3.0开始,C#中可用var关键字来声明任何类型的局部变量,该变量需要根据初始化表达式来推断变量的类型,所有在使用var关键字定义局部变量时必须进行初始化。

var a=1;

var b=”Hello”;

var c=new int[]{1,2,3};

Console.WriteLine(a.GetType());

Console.WriteLine(b.GetType());

Console.WriteLine(c.GetType());

输出结果:

System.Int 32

System.String

System.Int 32[]

上例中的“GetType()”方法是获得对象所属的数据类型,是反射机制的一种应用。

使用var关键字定义变量时,需要注意以下几点:

在声明时必须同时赋值,因为声明依赖于赋值号右边的表达式。

在使用var声明一个局部变量后,它仍然具有强类型

var a=1;

a=”Hello”;//会提示“无法将类型string隐式转换int”;

在初始化时,不能是空类型(null)

var a=null;//会提示“无法将类型赋予隐式类型的局部变量”;

Var的声明仅限于局部变量。

public class Program

{

var a=1;//会出现”上下文关键字var只能出现在局

部变量声明中”的错误提示

public static void Main()

{

//……;

}

}

2.37流控制

相关文档