一、变量

1.变量定义的方法:

datatype identifier;    例如 int i1;

2.变量的初始化:

变量在使用前必须进行初始化,使用未初始化的变量会报错

对于方法中的局部变量必须显式初始化后才能使用

对于类或者结构中的字段如果没有显式初始化(使用构造函数)则在new新对象后其值默认为0

3.类型推断:

用var定义变量编译器会根据变量初始化的值来推断变量的类型

var someThing = 0; //根据初始化0推断someThing的类型为int

注意一旦被赋值推断出相应的数据类型后此变量的类型就不能再改变了

4.变量作用域

对于局部变量存在于表示声明该变量的块语句方法结束的封闭花括号之前的作用域内(其中在for while等语句中的变量只存在于循环体内)一个定义域内定义两个相同的变量名会报错

字段的作用域由类决定而且定义两个相同的字段也会报错

字段和局部变量的作用域冲突:一个类中可定义相同变量名的字段和局部变量,这时局部变量会屏蔽字段变量,此时如果想调用字段变量可以用this关键字(this关键字用于调用实例字段,如果是静态字段着直接用类名调用)

 1 using System;
 2 
 3 public class Example
 4 {
 5     static int i1 = 100; //  静态变量
 6     int i2 = 200;    //实例变量
 7     public static void Main(string[] args)
 8     {
 9         int i1 = 1; //局部变量
10         int i2 = 2;
11         Console.WriteLine("{0},{1},{2}", Example.i1, i1, i2);
12         Example ex = new Example();
13         ex.WriteInt();
14         
15         Console.ReadKey();
16     }
17     void WriteInt()
18     {
19         int i1 = 10; //局部变量
20         int i2 = 20;
21         Console.WriteLine("{0},{1},{2}",this.i2,i1,i2);
22     }
23 }

1.位于Main()和WriteInt()方法中的是局部变量虽然变量名相同但不再同一作用域中故不会冲突

2.Example类中定义一个实例变量和一个静态变量虽然与局部变量名相同但静态变量用类名来引用而实例变量用this关键字引用不会与局部变量发生冲突(注意:用this关键字引用的变量不能在static方法中使用因为static方法不依赖实例对象)

5.常量

字面值:比如123,’a’都为字面值他们不能改变和被赋值 12 = 123;错误

常量:用const关键字定义,C#中只能把字段或者局部变量声明为常量并且常量声明是必须初始化而且常量总是静态的但不必也不允许前面有static关键字

二、数据类型

数据类型根据其内存存储的方式的不同可以分为值类型和引用(通常值类型分配在栈上而引用类型分配在托管堆上)

1.值类型:分配在栈上根据类型的不同分配不同的空间其中存储变量所含的值

1.1预定义值类型

名称 CTS类型 说明
sbyte System.SByte 8位有符号整型
short System.Int16 16位有符号整型
int System.Int32 32位有符号整型
long System.Int64 64位有符号整型
byte System.Byte 8位无符号整型
ushort System.Uint16 16位无符号整型
uint System.Uint32 32位无符号整型
ulong System.Uint64 64位无符号整型
float System.Single 32位单精度浮点数精度7位
double System.Double 64位双精度浮点数精度15位
decimal System.Decimal 128位高精度精度28位
bool System.Boolean 只有两个值true和false
char System.Char 表示一个16位的Unicode

1.2枚举

用户定义的整数类型其基础类型可以是除char外的任意整型如果没有显示定义默认为Int32

 1 using System;
 2 
 3 public class Example
 4 {
 5     public enum TimeOfDay { Morning = 1, Afternoon, Evening };
 6     public static void Main(string[] args)
 7     {
 8         Console.WriteLine("Good{0}!",TimeOfDay.Morning);//TimeOfDay为枚举
 9         Console.WriteLine("Good" + (TimeOfDay)2 + "!");//枚举实际上就是整型的 
10         Console.WriteLine("{0}",(int)(TimeOfDay.Evening));//进一步证明枚举是整型的
11 
12         Console.ReadKey();
13     }
14 }

·定义枚举是可以对其赋值(如果不赋值则默认第一个为0第二个为1以此类推,如果不完全赋值则没有赋值的自动被赋予上个常量值加1如上例中Afternoon=2,Evening=3)

·可以将整数强制转换成枚举类型(此时注意看转换是否超出界限需要你自己判断)

·枚举也可以用于数值运算(此时必须强制类型转换为相应的整型)

·C#中枚举在后台会实例化为派生与基类System.Enum的结构可以调用其中的方法执行某种任务

1.3用户自定义值类型(结构)

C#中允许创建用户定义的值类型他们将被定义为从System.ValueType类派生的结构(结构与类很相似其中可以包含字段、属性、方法和事件)

2.引用类型:引用类型变量包含一个指针他指向托管堆中存储对象本身的位置,有因为引用类型只包含引用不包含实际值所以对方法体内参数所做的任何修改都将影响传递给方法调用的引用类型变量

2.1预定义引用类型

·object类型实际就是System.Object类别名Object类是所有类型(包括值类型)的最终基类所以可以将任何类型强制转化成Object类型

·string类型实际上System.String类

2.2指针:C#中指针只允许用于不安全代码中

2.3接口:其中定义实现类或结构必须遵守的契约(他们必须公布的方法、字段、属性等)接口不为这些成员提供任何实现

2.4类:用户定义的引用类型他们可以包括字段、常量、属性、方法、事件、运算符、构造函数和析构函数

2.5数组:代表一组元素,此元素可以是值类型或者引用类型(即使元素是值类型数组本身还是引用类型)

2.6委托:是引用方法的一种引用类型(类似与函数指针)他引用在另一个对象中定义的方法(此方法可以是静态方法、虚方法或实例方法)

3.确定类型

 1 using System;
 2 
 3 public class Example
 4 {
 5     public static void Main(string[] args)
 6     {
 7         int i1 = 10;
 8         string str = "HelloWorld";
 9         Type atype = str.GetType();//GetType()在Object类中定义
10         Type btype = typeof(string);
11         //typedef运算符中必须为类型的完全限定名称或者别名
12         Console.WriteLine("{0},{1}",atype,btype);//打印System.String
13         CompareS(i1);
14         CompareS(str);
15 
16         Console.ReadKey();
17     }
18     static void CompareS(Object obj)
19     {
20         if (obj.GetType() == typeof(string))
21             Console.WriteLine("是字符串类型");
22         else
23             Console.WriteLine("不是字符串类型");
24     }
25 }

两种方法来确定类型GetType()方法在Object类中定义所有类都隐式继承此方法没有参数 typeof运算符由语言支持其参数必须为类型的完全限定名或者别名(using定义的)

posted on 2013-02-22 20:16  redher  阅读(305)  评论(0)    收藏  举报