大胖的部落格

Just a note

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  112 随笔 :: 0 文章 :: 3 评论 :: 0 Trackbacks
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 = { 1234 };             //使用指定值初始化数组
    int[] myarray2 = new int[4];                 //用默认值0初始化数组
    int[] myarray3 = new int[4] { 1234 };  //并用

    
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 = { { 123 }, { 456 } };
    
int[,] mymul2 = new int[23];
    
int[,] mymul3 = new int[23] { { 123 }, { 456 } };

    
foreach (int i in mymul2)
    {
        Console.WriteLine(
"{0}", i);
    }


    
//数组的数组(不同维之间的元素个数可以不同)
    int[][] myaa = new int[2][];
    myaa[
0= new int[3] { 123 };
    myaa[
1= new int[5] { 98765 };

    
//利用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 = 1234 };
    }

}


代表(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;

posted on 2009-06-14 15:29 大胖 阅读(275) 评论(0)  编辑 收藏 引用 所属分类: C#

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理