C# 中有两大数据类型:值类型和引用类型。值类型包括简单类型(Simple types),结构类型(struct types)和枚举类型(Enumeration types)。引用类型包括类、委托、数组、接口。
1 值类型:
1.1 简单类型:整数类型、布尔类型、字符类型和实数类型。
1.1.1 整数类型:依据变量在内存中所占的位数,整数类型包括九种,分别为:短字节型(sbyte,有符号8位整数,值在-128-127)、字节型(byte无符号8位整数,值在0-255)、短整型(short有符号16整数,值在-32768-327687)、无符号短整型(ushort,无符号16位整数,值在0-65535)、整型(int,有符号32位整数,值在-2147483648-2147483647)、无符号整型(uint,无符号32位整数,值在0-4294967295)、长整型(long,有符号64位整数,值在-9223372036854775808-9223372036854775807)、无符号长整型(ulong,无符号64位整数,值在0-18446744073709551615)。
1.1.2 布尔类型 两种取值:true和false。注意不能bool x=0或者x=1这种写法是错误的,会出现以下报错:“常量值“1”无法转换为“bool””。这也是C#与c和C++的区别。
1.1.3 实数类型:包括浮点类型和十进制类型,浮点类型包括单精度(float)和双精度(double),单精度取值范围在1.5x10-45到3.4x10(38)精度为7位数。双精度取值范围5.0x10-324到1.7x10(308)之间,精度为15位到16位数。十进制类型是一种高精度128 位数据类型它所表示的范围从大约1.0×10-28 到7.9×10(28) 的28 至29 位有效数字注意该精度是用位数 (digits)而不是以小数位(decimal
places)来表示的运算结果准确到28 个小数位十进制类型的取值范围比double 类型的范围要小得多但它更精确.当定义一个decimal 变量并赋值给它时使用 m 下标以表明它是一个十进制类型。
如
decimal d_value = 1.0m;
如果省略了m 在变量被赋值之前它将被编译器当作双精度double 类型来处理。主要用于方便我们在金融和货币方面的计算。
1.1.3 字符类型 C#提供的字符类型按照国际上公认的标准采用Unicode 字符集,一个Unicode 的标准字符长度为16 位用它可以来表示世界上大多种语言可以按以下方法给一个字符变量赋值。如:char c = 'A';
1.2结构类型 结构类型使用struct定义,并且可以嵌套。举例说明:
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
PhoneBook p;
p.name = "cedar";
PhoneBook.address d;
d.city = "上海";
Console.WriteLine(p.name + d.city);
}
}
struct PhoneBook
{
public string name;
public uint age;
public string phone;
public struct address
{
public string city;
public string street;
public uint no;
}
}
}
1.3 枚举类型:枚举enum 实际上是为一组在逻辑上密不可分的整数值提供便于记忆的符号,比如我们声明一个代表星期的枚举类型的变量。
enum WeekDay{
Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday
};
WeekDay day;
注意结构是由不同类型的数据组成的一组新的数据类型结构类型的变量的值,是由各个成员的值组合而成的而枚举则不同枚举类型的变量,在某一时刻只能取枚举中某一个元素的值。比如day 这个表示星期的枚举类型的变量,它的值要么是Sunday,要么是Monday 或其它的星期元素。但它在一个时刻只能代表具体的某一天不能既是星期二又是星期三。
day = Tuseday;
按照系统的默认枚举中的每个元素类型都是int 型且第一个元素删去的值为0,它后面的每一个连续的元素的值按加1 递增,在枚举中也可以给元素直接赋值,如下:把星期天的值设为1 ,其后的元素的值分别为2,3…
enum WeekDay{
Sunday=1, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday
};
为枚举类型的元素所赋的值的类型限于long int short 和byte 等整数类型。
举例:
class Program
{
enum WeekDay
{
Sunday = 1, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday
}
static void Main(string[] args)
{
WeekDay day = WeekDay.Friday;
Console.WriteLine(day);
}
}
2. 引用类型
2.1类:类是面向对象编程的基本单位,是一种包含数据成员、函数成员和嵌套类型的数据结构,类的数据成员有常量、域和事件,函数成员包括方法、属性、索引指示器、运算符、构造函和析构函数。类和结构同样都包含了自己的成员,但它们之间最主要的区别在于,类是引用类型而结构是值类型。类支持继承机制,通过继承,派生类可以扩展基类的数据成员和函数方法,进而达到代码重用和设计重用的目的。
两个常用的类:object和string。object类是所有其他类型的基类,c#中的所有类型都直接或者间接地从object类中继承。string是C#中的另一个基类,专门用于对字符串的操作,这个类中封装了许多内部的操作。比如字符串连接,取长度等。
举例:
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
PhoneBook b = new PhoneBook("cedar");
b.Phone = "68974566";
Console.WriteLine(b.Phone);
Console.WriteLine(b.Name + "的号码:" + b.Phone);
Console.WriteLine(b.GetBook());
}
}
class PhoneBook
{
private string name;
private string phone;
private struct address
{
public string city;
public string street;
public uint no;
}
public string Phone
{
get
{
return phone;
}
set
{
phone = value;
}
}
public string Name
{
get
{
return name;
}
}
public PhoneBook(string n)
{
name = n;
}
public string GetBook()
{
return Name + "的电话号码:" + Phone;
}
}
/*结果:
68974566
cedar的号码:68974566
cedar的电话号码:68974566
请按任意键继续. . .
*/
}
2.2 委托是一种定义方法签名的类型,可以与具有兼容签名的任何方法关联。您可以通过委托调用方法。委托用于将方法作为参数传递给其他方法。事件处理程序就是通过委托调用的方法。您可以创建一个自定义方法,当发生特定事件时某个类(例如 Windows 控件)就可以调用您的方法。与委托的签名(由返回类型和参数组成)匹配的任何可访问类或结构中的任何方法都可以分配给该委托。方法可以是静态方法,也可以是实例方法。这样就可以通过编程方式来更改方法调用,还可以向现有类中插入新代码。只要知道委托的签名,就可以分配您自己的方法。
委托具有以下特点:
· 委托类似于 C++ 函数指针,但它们是类型安全的。
· 委托允许将方法作为参数进行传递。
· 委托可用于定义回调方法。
· 委托可以链接在一起;例如,可以对一个事件调用多个方法。
· 方法不必与委托签名完全匹配。
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication1
{
delegate int myDelegate();//声明一个委托
public class myClass
{
public int InstanceMethod()
{
Console.WriteLine("This is Instance method.");
return 0;
}
static public int StaticMethod()
{
Console.WriteLine("This is static method");
return 0;
}
}
class Program
{
static void Main(string[] args)
{
myClass m = new myClass();
myDelegate d = new myDelegate(m.InstanceMethod);
d += myClass.StaticMethod;
d();
}
}
/*结果:
This is Instance method.
This is static method
请按任意键继续. . .
*/
}
2.3 数组
数组是一种数据结构,它包含若干相同类型的变量。数组是使用类型声明的:
type[] arrayName;
数组类型的值是对象。数组对象定义为存储数组元素类型的值的一系列位置。重复值的数量由数组的秩和边界来确定。数组类型从类型 System. Array 继承而来。此类表示所有的数组,不论它们的元素类型或它们的秩如何。对数组定义的操作有:根据大小和下限信息分配数组;编制数组索引以读取或写入值;计算数组元素的地址(托管指针);以及查询秩、边界和数组中存储的值的总数。其元素具有零下限的一维数组(有时称为矢量),不论其上限如何,都会有一种以数组中元素的类型为基础的数组类型。多维数组或一维但下限非零的数组,不论数组的上限如何,如果它们具有相同的元素类型和秩,则具有相同的数组类型。不支持零维数组。
举例:
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int[] arr = new int[5];
for (int i = 0; i < arr.Length; i++)
arr[i] = i * i;
for (int i = 0; i < arr.Length; i++)
Console.WriteLine("arr[{0}] = {1}", i, arr[i]);
}
}
/*结果:
arr[0] = 0
arr[1] = 1
arr[2] = 4
arr[3] = 9
arr[4] = 16
请按任意键继续. . .
*/
}
2.4 接口:接口只包含方法、属性、事件或索引器的签名。成员的实现是在实现接口的类或结构中完成的。一个接口可从一个或多个基接口继承。当基类型列表包含基类和接口时,基类必须是列表中的第一项。实现接口的类可以显式实现该接口的成员。显式实现的成员不能通过类实例访问,而只能通过接口实例访问。
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication1
{
interface IPoint
{
// Property signatures:
int x
{
get;
set;
}
int y
{
get;
set;
}
void SampleMethod();
}
class Point : IPoint
{
// Fields:
private int _x;
private int _y;
// Constructor:
public Point(int x, int y)
{
_x = x;
_y = y;
}
// Property implementation:
public int x
{
get
{
return _x;
}
set
{
_x = value;
}
}
public int y
{
get
{
return _y;
}
set
{
_y = value;
}
}
public void SampleMethod()
{
Console.WriteLine("This is interface method");
}
}
class Program
{
static void PrintPoint(IPoint p)
{
Console.WriteLine("x={0}, y={1}", p.x, p.y);
p.SampleMethod();
}
static void Main(string[] args)
{
Point p = new Point(2, 3);
Console.Write("My Point: ");
PrintPoint(p);
}
}
/*结果:
My Point: x=2, y=3
This is interface method
请按任意键继续. . .
*/
}