C#语言基础(上)
前言:写给我自己。陆陆续续学习C#已经有8个月的时间了,但是脑子里面还是一片混乱,学的多,忘的也多,重新安心的坐在这里,把之前学过的东西整理一下。
1.1第一个C#程序:
using System;
class test{
static void Main(){
int x=12*30;
Console.WritleLine(x);
}
}
- 在C#中语句按顺序执行,以后面的分号(或者代码块)结尾。
- 方法可以接收调用者输入的参数,并通过返回类型给调用者返回输出数据。
- C#把Mian方法当作默认执行入口,Main方法也可以返回一个整型,从而为程序执行的环境返回一个值。
- 方法是C#中的一种函数,另一种函数是我们用来执行乘法运算的*运算符。还有构造方法、属性、事件和索引器和终结器。
- 类由数据成员和函数成员组成,形成面向对象的构件块。类也是一种类型。
- .Net Framework的组织方式为嵌套的命名空间。如using system.Text;也可以用完全限定名来引用类型。
- C#编译器把一些列的.cs文件编译成程序集,程序集是.Net Framework最小的打包和部署单元。程序集是一个应用程序或者是一个库(没有Main方法)。.NET Framework就是一组库。
1.2语法
- 标识符是程序员为类、方法、变量等选择的名字。标识符必须是一个完整的词。区分大小写。通常约定参数、局部变量、私有字段应该由小写字母开头,其他单词大写;而其他类型应该有大写字母开头,其他单词也大写。
- 关键字是系统保留的名称,不能将他们用作标识符。如uisng class static void int等,下面是所有C#关键字:如果用关键字作为标识符,可以在关键字前面加“@”来避免冲突。
- 一些关键字是上下文相关的(上下文关键字),他们也可以不用“@”前缀就能当作标识符来用。
- 字面量是静态嵌入程序中的原始数据片段。比如10、“Hello World”等。 分号用于结束一条语句。这意味着一条语句也可以放到多行中,比如在ADO.NET中如果我们要写一条很长的SQL,可以放入多行中。大括号用于将多条语句放到一个大括号中形成一个语句块。
- 注释:C#提供了两种注释方式:单行注释和多行注释。单行注释由双斜线开始,到本行结束为止://…多行注释以/开始,以/结束,可以用来注释多行。注释也可以嵌入到XML文档中。
类型基础
- 型定定义了值的蓝图。值是由变量或者常量表示的存储位置。变量是表示存储位置的符号, 包含的值会不断变化。而常量则表示不会变化的值。C#中的所有值都是一种类型的实例。一个值或这一个变量所包含的一组可能值均由其类型决定。
- 定义类型是是指那些由编译器特别支持的类型。int就是一种预定义类型,他代表了正负21亿的整数范围(2147483648),还有long、float、double、char、string、bool等
- C#的一个优点是预定义类型和定义类型只只有少量的不同
- 实例化某种类型即可创建数据,预定义类型可以简单的通过字面量来创建实例,例如12或者”Hello World“。使用new运算符后会立即实例化一个对象,对象的构造方法会在创建对象的时候被调用。构造方法向发法一样被定义,不同的是方法名和返回类型被简化成它所属的类型名。
- 实例与静态成员:由类型的实例操作的的据成员和和数成员称称为实例成员,而那些不是由类型实例操作的成员必须添加static前缀修饰。还有一点需要注意的是:静态类型的成员都是静态成员,这是因为不能在静态类中添加实例成员,因为静态类永远不会被实例化。
- **Public关键字:**该关键字将成员公开给其他类,把成员标记为Public就是在说:"这就是我想让其他类看到的,剩下的都是我自己私有的。"用面向对象语言,我们称之为利用共有成员封装了类中的私有成员。
- **转换:**在C#中,兼容类型的实例可以互相转换。转换始终会根据一个已经存在的值创建一个新的值:
int a = 1234;
long b = a; //a到b的转换是隐式的,因为b能够保存的数据远远大于a,所以是安全的
Console.WriteLine(b+1);//1235
Console.WriteLine(a);//124
对于”转换始终会根据一个已经存在的值创建一个新的值“这句话,意思就是a是已经实例化好的,b根据a的值创建了一个新的实例,该实例是“long”类型的。转换可以是隐式的也可以是显式的,隐士转换会自动发生,而显式转换需要cast关键字。例如:int转换为long可以隐式的进行,而反之不行。隐式转换只有在下列条件都满足时才进行 :
①编译器能保证转换总能成功。
②没有信息在转换的过程中丢失。
相对的,只有满足下列条件时才能进行显式转换:
①编译器不能保证转换总能成功。
②信息在转换的过程中可能会丢失。
而如果编译器确定某个转换一定会失败,那么隐式的和显式的转换都会被禁止。包含泛型的转换在特情况下也会失败。**提示:**数值转换是C#内置的,C#还支持引用转换、装转换和自定义转换。
值类型和引用类型
所有C#类型可以分为以下几类:
①值类型
②引用类型
③类型参数(泛型参数)
④指针类型
值类型包含大部分的内建类型(预定义类型)以及自定义的Struct类型和emun类型。
值类型和引用类型最根本的区别在于他们在内存中的处理方式。
引用类型包含类 、数据、委托、接口。
值类型:值类型的变量和常量的内容仅仅是一个值。对值类型的赋值操作会赋值这些实例。例如:
public struct Point
{
public int x;
public int y;
}
static void Main(string[] args)
{
Point p=new Point();
p.x = 1;
Point p2 = p;//赋值引起了复制
Console.WriteLine(p2.x);
p.x = 9;
Console.WriteLine(p2.x);//1
}
p和p2拥有各自不同的内存空间。
引用类型:引用类型比值类型更复杂,它有两部分组成,对象和对象的引用。引用类型的变量或常量的内容是对一个包含值的对象的引用。给引用类型赋值时只是复制了引用,而不是对象实例。(这样其实很合理,按存储开销来说,对象在对上的存储开销会比较大,这样做的结果是两个引用同时指向了对象)如果上例中的Point是个class,则对p的操作就会影响到p2了。
null:一个引用可以赋值null表示它不指向任何对象。相对的,值类型通常(可空类型除外)不会有null值。
存储开销:值类型实例正好存储占用其字段的内存,Poin(struct)需要真用8个字节。**提示:**从技术上说,CLR用整数倍字段的大小来分配内存。Struct A{byte x; long y;}被分配了16字节的大小(long是8个字节,CLR按照y字段的长度乘以A中的字段总数来分配内存)。引用类型为引用和对象单独分配内存,对象占用了和字段一样的字节数,此外,还要加上额外的管理开销,它用于存储对象的键值,还有像多线程读写锁的状态和它是否被垃圾回收(GC)选中等临时信息。每一个对象的引用都需要额外4到8字节,这取决于32为还是64为系统。
预定义类型的分类
C#中的预定义类型又称为框架类型,它们都在System命名空间下。下面的两个语句仅仅在拼写上有所不同:
int a;
System.int32 i;
在CLR中,除了decimal以外的一系列值类型被认为是基本类型,所谓基本类型,是因为它们在编译过的代码中被指令直接支持。因此它们通常被翻译成底层处理器直接支持的指令。
//下面的是16进制的表示
int a=7; //0x7
bool b=true;//0x1
char x='A';//0x41
float y=0.5f;//用IEEE浮点型编码
数值类型:下表列出了所有的C#预定义值类型
数字字面值:整型字面值可以用十进制或16进制标记,16进制小数用0X前缀表示。(中文翻译中的渣)实数字面值可以使用十进制和指数标记。
数值字面值类型推断中文翻译太烂了,网上下载了一本英文原版的,看到这的时候简直错误百出,没法看的地步了。这部分以后的内容以后在补上吧。