C#与C++的数据类型对比:
变量的声明与初始化:
int i ; //声明,未初始化
int j = 9; //初始化
j = i; //error,变量在使用前必须初始化
C#特有的运算符:
int i = 7, j = -9;
i =+ j; //i等于j
Console.WriteLine("{0}, {1}", i, j);
i =- j; //i等于j的相反数
Console.WriteLine("{0}, {1}", i, j);
C#中类似if,while中的判断条件必须是bool型:
int i = 7;
if (i) //error, i不是bool
{
}
while (i) //error, i不是bool
{
}
隐式类型转换:
只要类型A的取值范围完全包含在类型B的取值范围内,A就可以向B进行隐式类型转换。
1、位数低的可以向位数高的进行类型转换;同样位数符号不同不能转换。
2、有符号的不能转换成为无符号的。
3、所有整型和char可以转化为float,double,decimal。
4、浮点数里只有float可以转化成为double。
5、任何类型都不能转化为char;char可以转化的类型同ushort,包括ushort。
6、string和bool不能参与隐式类型转换。
显示类型转换:
可以用checked和unchecked来检验或者忽略显示类型转换中的数据溢出。
可以在工程属性的build-advanced中修改默认的显示转换是否check。
byte bt = 1;
int i = 555;
bt = unchecked((byte)i); //溢出,btye里的值异常,程序继续
bt = checked((byte)i); //溢出,程序崩溃
可以用Convert.进行类型转换。
如果参数是string,且不是合法数值,或者值在转换过程中溢出,则无视unchecked,程序崩溃。
int i = 555;
i = unchecked(Convert.ToInt16("oo16")); //字符串非法,无视unchecked修饰,程序崩溃
i = unchecked(Convert.ToInt16("55555555")); //溢出,无视unchecked修饰,程序崩溃
i = Convert.ToInt16("16"); //OK
枚举类型:
1、enum在定义的时候可以指定值的类型,只能为整形。
2、在使用enum值的时候需要加上类型名限定符。
3、enum变量和其值类型变量间相互赋值需要显示类型转换。
4、可以用对象的ToString方法或者Convert的ToString方法将enum转换成为string。
5、可以用Enum.Parse方法将string转换成为enum。
6、整数0可以隐式转换为enum类型,其它整数不可。
enum MyType : int //enum中的值类型为int
{
mon = 1,
tue,
wed
}
static void Main()
{
MyType t;
t = MyType.mon;
int i = (int)t; //enum转换成为int需要显示转换
t = (MyType)2; //int转换成为enum需要显示转换
string s = t.ToString(); //利用ValueType的ToString方法转换成为string
Console.WriteLine("string is {0}.", s);
s = Convert.ToString(t); //利用Convert的ToString方法转换成为string
Console.WriteLine("string is {0}.", s);
MyType nt = (MyType)Enum.Parse(typeof(MyType), s); //将string转化成为enum
Console.WriteLine("enum is {0}.", nt);
}
struct类型:
成员默认不是public。
数组类型:
1、包括一维数组,多维数组,数组的数组。
2、多维数组每一维的元素个数相同;数组的数组每一维元素个数可以不同。
3、利用foreach遍历数组的数组时,需要嵌套。
static void Main()
{
int[] myarray1 = { 1, 2, 3, 4 }; //使用指定值初始化数组
int[] myarray2 = new int[4]; //用默认值0初始化数组
int[] myarray3 = new int[4] { 1, 2, 3, 4 }; //并用
for (int i = 0; i < 4; ++i)
{
Console.WriteLine("{0} {1} {2}", myarray1[i], myarray2[i], myarray3[i]);
}
//利用foreach遍历数组
foreach (int i in myarray3)
{
Console.WriteLine("{0}", i);
}
//多维数组(每一维元素个数相同)
int[,] mymul1 = { { 1, 2, 3 }, { 4, 5, 6 } };
int[,] mymul2 = new int[2, 3];
int[,] mymul3 = new int[2, 3] { { 1, 2, 3 }, { 4, 5, 6 } };
foreach (int i in mymul2)
{
Console.WriteLine("{0}", i);
}
//数组的数组(不同维之间的元素个数可以不同)
int[][] myaa = new int[2][];
myaa[0] = new int[3] { 1, 2, 3 };
myaa[1] = new int[5] { 9, 8, 7, 6, 5 };
//利用foreach嵌套遍历数组的数组
foreach (int[] ia in myaa) //数组的数组中的元素是数组
{
foreach (int i in ia)
{
Console.WriteLine("{0}", i);
}
}
}
string类型:
string类型变量可以看做是char变量的只读数组。
string的操作函数一般不改变原来的string,生成新的string,当不指定char数组参数时,默认为空格,基本操作如下:
ToUpper,ToLower:大小写转换。
Trim,TrimStart,TrimEnd:在string的两端除去指定char。
PadLeft,PadRight:在string两端添加指定字符,使其长度满足指定长度。
Split:用指定char作为分隔符,将string分割成为string数组。
static void Main()
{
string s = "Hello World";
//string类型变量可以看做是char变量的只读数组
char c = s[3];
Console.WriteLine("{0}", c);
foreach (char cc in s)
{
Console.WriteLine("{0}", cc);
}
//利用string的ToCharArray方法获得char数组
char[] ca = s.ToCharArray();
foreach (char cc in ca)
{
Console.WriteLine("{0}", cc);
}
//利用string或数组的Length属性获得字符串长度
Console.WriteLine("{0},{1}", ca.Length, s.Length);
//ToLower返回新的string,不改变原来的string
string ns = s.ToLower();
Console.WriteLine("{0},{1}",ns, s);
ns = ns.ToUpper(); //将字符串变为大写
Console.WriteLine("{0},{1}", ns, s);
//Trim用来从string的两端除去指定char,返回新的string,不改变原来string
//TrimStart和TrimEnd用来删除string前面和后面的内容
s = " my testtttt ";
ns = s.Trim(); //无参数则除去字符串两端的空格
Console.WriteLine("{0},{1}", ns, s);
char[] tc = {' ', 't', 's'};
ns = s.Trim(tc);
Console.WriteLine("{0},{1}", ns, s);
//PadLeft用来在字符串左边添加指定字符,使string长度达到一定数量
ns = s.PadLeft(20, '+');
Console.WriteLine("{0},{1}", ns, s);
//Split用来以指定的char[]中的char作为分隔符,将string分割成string[]
string[] sa;
char[] csep = {'y', ' '};
sa = s.Split(csep);
foreach (string sss in sa)
{
Console.WriteLine("{0}", sss);
}
}
C#的数据类型有三大类:
1.数值类型
2.引用类型
3.指针类型(仅用于非安全代码)
其中,
1.1 数值类型包括:结构类型(struct)和枚举类型(enum)
1.1.1 结构类型有:简单类型和用户自定义结构类型
1.1.1.1 简单类型有:整型(byte、sbyte、long、ulong、short、ushort、 int、uint)、浮点数类型(float、double)、十进制类型(decimal)、字符类型(char)、布尔型(bool)
bool类型的值只能为true或false,不能为整数类型。
十进制类型是一种高精度128位数据类型,当定义一个decimal 变量并赋值给它时使用 m 下标以表明它是一个十进制类型
如:decimal d_value = 1.0m;
C#提供的字符类型采用Unicode 字符集,一个Unicode 的标准字符长度为16位。
可以直接通过十六进制转义符(前缀\x) 或Unicode 表示法给字符型变量赋值(前缀\u), 如下面对字符型变量的赋值写法都是正确的:
char c = '\x0032';
char c = '\u0032';
在C和C++中,字符型变量的值是该变量所代表的ASCII码,字符型变量的值作为整数的一部分,可以对字符型变量使用整数进行赋值和运算,而这在C#中是被禁止的。
为枚举类型的元素所赋的值的类型限于long int short 和byte 等整数类型。
2.1 引用类型又包括:类(class、object、string)、接口(interface)、数组(array)、代理(delegate)
2.1.1 类包括:用户自定义的类、object基类、string类
object类是所有其它类型的基类,C#中的所有类型都直接或间接地从objec类中继承。
因此对一个object的变量可以赋予任何类型的值:
int x =25;
object obj1;
obj1 = x;
object obj2 = ‘A’;
using System;
class TestCS
{
//引用类型
class RefType
{
public int i;
}
//值类型
struct ValueType
{
public int i;
}
static void Main()
{
int x =25;
//引用类型必须用new来创建实例,默认值为0
RefType r = new RefType();
//值类型可以不用new创建实例
ValueType v;
v.i = x;
Console.WriteLine("{0}, {1}", r.i, v.i);
RefType rt;
//rt.i = 0; //error,没有引用到具体对象
RefType rr = null; //OK,引用类型可以赋值为null
//ValueType vv = null; //error, 值类型不能赋值为null
//数组也是引用类型,但是支持非new形式的创建实例的方式
int[] ir = new int[3];
int[] irr = { 1, 2, 3, 4 };
}
}
代表(delegate)是一个类似函数指针的东西。
using System;
class Test
{
public class TestDelegate
{
//non-static method
public void Output()
{
Console.WriteLine("Output");
}
//static method
static public void StaticFun()
{
Console.WriteLine("StaticFun");
}
}
//声明delegate
delegate void Fun();
static void Main()
{
// 将delegate指向静态的方法
Fun f = new Fun(TestDelegate.StaticFun);
f(); //通过delegate调用method
TestDelegate obj = new TestDelegate();
// 将delegate指向非静态的方法
f = new Fun(obj.Output);
f(); //通过delegate调用method
}
}
在C#中数组可以是一维的,也可以是多维的,同样也支持矩阵和参差不齐的数组。
static void Main()
{
//一维数组
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]);
string[] a1; // 一维string 数组
string[,] a2; // 二维
string[, ,] a3; // 三维
string[][] j2; // 可变数组数组
string[][][][] j3; //多维可变数组
}
装箱转换是指将一个值类型隐式地转换成一个object 类型,比如:
int i = 10;
object obj = i;
也可以用显式的方法来进行装箱操作:
int i = 10;
object obj = object(i);
拆箱转换是指将一个object 类型显式地转换成一个值类型,例如:
int i = 10;
object obj = i;
int j = (int)obj;