C#速成[转载]

原文出处:http: // www.codeguru.com/cs_syntax/CSharp.html
None.gif
原作者:Aisha Ikram
None.gif在一些术语上我尽量做到与MSDN的中文资料所述术语保持一致
None.gif
None.gif使用环境: .NET, C#, Win XP, Win 
2000  
None.gif
None.gif绪论
None.gifC#是这样的一种语言,具有C
++ 的特点,象Java一样的编程风格, 并且象Basic一样的快速开发模型。如果你已经知道了C ++ ,本文会在不到一个小时的时间内让你迅速掌握C#的语法。熟悉Java的括会更好,因为Java的程序结构、打包(Packages)和垃圾收集的概念有助于你更快的了解C#。因此在讨论C#的构造时,我会假定你了解C ++
None.gif
None.gif本文会讨论C#语言的构造与特点,同时会采取简洁的和你能理解的方式使用些代码示例,我们会尽量让你能稍微看看这些代码就能理解这些概念。
None.gif
None.gif注意:本文不是为C#高手(C# gurus)所写. 这是针对在C#学习上还是初学者的文章。
None.gif
None.gif下面是将要讨论的C#问题的目录:
None.gif
None.gif程序结构 
None.gif命名空间
None.gif数据类型
None.gif变量
None.gif运算符和表达式
None.gif枚举
None.gif语句(Statements )
None.gif类(Classes)和结构(Structs)
None.gif修饰符(Modifiers)
None.gif属性(Properties)
None.gif接口(Interfaces)
None.gif方法参数(Function Parameters)
None.gif数组(Arrays)
None.gif索引器(Indexers)
None.gif装箱及拆箱操作
None.gif委托(Delegates)
None.gif继承和多态
None.gif
None.gif下面的内容将不会在被讨论之列:
None.gif
None.gifC
++ 与C#谁更通用
None.gif诸如垃圾回收、线程以及文件处理等概念
None.gif数据的类型转换
None.gif异常处理
None.gif.NET库
None.gif
None.gif
-------------------
None.gif程序结构
None.gif
-------------------
None.gif这一点象C
++ ,C#是一种对大小写字母敏感的语言,分号“;”是语句间的分隔符。与C ++ 不同的是,C#当中声明代码文件(头文件)与实现代码文件(cpp文件)不是独立存在的,所有代码(类声明和类实现)都位于一个扩展名为cs的文件内。
None.gif
None.gif让我们瞧瞧C#当中的 Hello world 程序是怎样的。
None.gif
None.gif
using  System;
None.gif
None.gif
namespace  MyNameSpace
None.gif
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
InBlock.gif
class HelloWorld
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif    
static void Main(string[] args)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        Console.WriteLine (
"Hello World");
ExpandedSubBlockEnd.gif     }

ExpandedSubBlockEnd.gif}

InBlock.gif
ExpandedBlockEnd.gif}

None.gif
None.gif在C#当中的每样东西都被封装到一个类中,C#的类又被封装到一个命名空间当中(就象一个文件夹中的文件)。类似于 C
++ ,main方法是你的程序的入口点。C ++ 的main函数调用名称是 " main " ,而C#的main函数是以大写字母M为起点的名称是 " Main "
None.gif
None.gif没有必要把分号分隔符放在类语句块或者结构定义语句块后。这在C
++ 当中被要求,但在C#当中却不是。
None.gif
None.gif
-------------------
None.gif命名空间
None.gif
-------------------
None.gif每一个类都被包装进一个命名空间。命名空间的概念与C
++ 的完全相同,但在C#当中使用命名空间的频率较C ++ 还高。你可以使用点限定符(dot qulifier)访问一个类。在上面的hello world程序当中MyNameSpace就是一个命名空间。
None.gif
None.gif现在思考这样的一个问题,你想从某些别的类的命名空间当中来访问HelloWorld这个类该如何操作。
None.gif这有一个例子:
None.gif
None.gif
using  System;
None.gif
namespace  AnotherNameSpace
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
class AnotherClass
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
public void Func()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            Console.WriteLine (
"Hello World");
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

None.gif
None.gif现在,从你的HelloWorld类里你能象这样去访问上面的这个AnotherNameSpace的命名空间:
None.gif
None.gif
using  System;
None.gif
using  AnotherNameSpace;     //  you will add this using statement
None.gif
namespace  MyNameSpace
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
class HelloWorld
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif    
static void Main(string[] args)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        AnotherClass obj 
= new AnotherClass();
InBlock.gif        obj.Func();
ExpandedSubBlockEnd.gif    }

ExpandedSubBlockEnd.gif}

ExpandedBlockEnd.gif}

None.gif
None.gif在.NET库当中,System是位于顶层的命名空间,别的命名空间都存在这个命名空间之下。默认状态下,存在一个全局的命名空间,因此一个在命名空间外定义的类将直接在这个全局命名空间之下;因此,你能在没有任何点限定符的情况下访问这个类。
None.gif
None.gif你也可以象下面这样定义嵌套的命名空间。
None.gif
None.gifUsing
None.gifC
++ 当中的 " #include " 指示被C#的 " using " 关键字取代,它后面跟着一个命名空间的名字。正如上面的 " using System " " System " 是别的所有被封装的命名空间和类中最底层的命名空间。所有对象的基类都是System命名空间内的Object类派生的。
None.gif
None.gif
-------------------
None.gif变量
None.gif
-------------------
None.gif除以下并别外,C#当中的变量几乎与C
++ 同:
None.gif
None.gif与C
++ 不同,C#变量被访问之前必须被初始化;否则编译时会报错。因此,访问一个未初始化变量是不可能的事。
None.gifC#中你不会访问到一个不确定的指针。(译者注:严格说起来C#已经把指针概念异化,限制更严格。所以有些资料上会说C#取消了指针概念)
None.gif一个超出数组边界的表达式是不可访问的。
None.gifC#中没有全局的的变量或全局函数,全局方式的操作是通过静态函数和静态变量来实现的。
None.gif
None.gif
None.gif
-------------------
None.gif数据类型
None.gif
-------------------
None.gif所有C#数据类型都派生自基类Object。这里有两类数据类型:
None.gif
None.gif基本型
/ 内置型 用户自定义型
None.gif
None.gif下面一个C#内置类型列表:
None.gif
None.gif类型 字节数 解释
None.gif
byte   1  无符号字节型
None.gif
sbyte   1  有符号字节型
None.gif
short   2  有符号短字节型
None.gif
ushort   2  无符号短字节型
None.gif
int   4  有符号整型
None.gif
uint   4  无符号整型
None.gif
long   8  有符号长整型
None.gif
ulong   8  无符号长整型
None.gif
float   4  浮点数
None.gif
double   8  双精度数
None.gif
decimal   8  固定精度数
None.gif
string  unicode字串型
None.gif
char  unicode字符型
None.gif
bool  真假布尔型
None.gif
None.gif注意:C#当中的类型范围与C
++ 有所不同;例如,C ++ 的long型是4个字节,而在C#当中是8个字节。同样地,bool型和string型都不同于C ++ 。bool型只接受true和false两种值。不接受任何整数类型。
None.gif
None.gif用户定义类型包括:
None.gif
None.gif类类型(
class )
None.gif结构类型(
struct )
None.gif接口类型(
interface )
None.gif
None.gif数据类型的内存分配形式的不同又把它们分成了两种类型:
None.gif
None.gif值类型(value Types)
None.gif引用类型(Reference Types)
None.gif
None.gif值类型:
None.gif值类型数据在栈中分配。他们包括:所有基本或内置类型(不包括string类型)、结构类型、枚举类型(
enum  type)
None.gif
None.gif引用类型:
None.gif引用类型在堆中分配,当它们不再被使用时将被垃圾收集。它们使用new运算符来创建,对这些类型而言,不存在C
++ 当中的delete操作符,根本不同于C ++ 会显式使用delete这个运算符去释放创建的这个类型。C#中,通过垃圾收集器,这些类型会自动被收集处理。
None.gif
None.gif引用类型包括:类类型、接口类型、象数组这样的集合类型类型、字串类型、枚举类型
None.gif
None.gif枚举类型与C
++ 当中的概念非常相似。它们都通过一个enum关键字来定义。
None.gif
None.gif示例:
None.gif
None.gif
enum  Weekdays
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif  Saturday, Sunday, Monday, Tuesday, Wednesday, Thursday, Friday
ExpandedBlockEnd.gif}

None.gif
None.gif类类型与结构类型的比较
None.gif除了在内存分配形式上外,类与结构的概念完全与C
++ 相同。类的对象被分配在堆中,并且通过new来创建,结构也是被new创建但却被分配在栈当中。C#当中,结构型适于快速访问和拥有少量成员的数据类型。如果涉及量较多,你应该创建一个类来实现他。
None.gif(译者注:这与堆和栈内存分配结构的特点有关。简而言之,栈是一种顺序分配的内存;堆是不一定是连续的内存空间。具体内容需要大家参阅相关资料)
None.gif
None.gif示例:
None.gif
None.gif
struct  Date
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
int day;
InBlock.gif    
int month;
InBlock.gif    
int year;
ExpandedBlockEnd.gif}

None.gif
None.gif
class  Date
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
int day;
InBlock.gif    
int month;
InBlock.gif    
int year;
InBlock.gif    
string weekday;
InBlock.gif    
string monthName;
InBlock.gif    
public int GetDay()
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
return day;
ExpandedSubBlockEnd.gif    }

InBlock.gif    
public int GetMonth()
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
return month;
ExpandedSubBlockEnd.gif    }

InBlock.gif    
public int GetYear()
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
return year;
ExpandedSubBlockEnd.gif    }

InBlock.gif    
public void SetDay(int Day)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        day 
= Day ;
ExpandedSubBlockEnd.gif    }

InBlock.gif    
public void SetMonth(int Month)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        month 
= Month;
ExpandedSubBlockEnd.gif    }

InBlock.gif    
public void SetYear(int Year)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        year 
= Year;
ExpandedSubBlockEnd.gif    }

InBlock.gif    
public bool IsLeapYear()
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
return (year/4 == 0);
ExpandedSubBlockEnd.gif    }

InBlock.gif    
public void SetDate (int day, int month, int year)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
ExpandedSubBlockEnd.gif    }

InBlock.gif    dot.gif
ExpandedBlockEnd.gif}

None.gif
None.gif
None.gif
None.gif
-------------------
None.gif属性
None.gif
-------------------
None.gif如果你熟悉C
++ 面象对象的方式,你就一定有一个属性的概念。在上面示例当中,以C ++ 的观点来看,Data类的属性就是day、month和year。用C#方式,你可以把它们写成Get和Set方法。C#提供了一个更方便、简单、直接的方式来访问属性。
None.gif
None.gif因此上面的类可以被写成:
None.gif
None.gif
using  System;
None.gif
class  Date
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
ExpandedSubBlockStart.gifContractedSubBlock.gif    
public int Daydot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif        
get dot.gif{
InBlock.gif            
return day;
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockStart.gifContractedSubBlock.gif        
set dot.gif{
InBlock.gif            day 
= value;
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }

InBlock.gif    
int day;
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
public int Monthdot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif        
get dot.gif{
InBlock.gif            
return month;
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockStart.gifContractedSubBlock.gif        
set dot.gif{
InBlock.gif            month 
= value;
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }

InBlock.gif    
int month;
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
public int Yeardot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif        
get dot.gif{
InBlock.gif            
return year;
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockStart.gifContractedSubBlock.gif        
set dot.gif{
InBlock.gif            year 
= value;
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }

InBlock.gif    
int year;
InBlock.gif
InBlock.gif    
public bool IsLeapYear(int year)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
return year%4== 0 ? truefalse;
ExpandedSubBlockEnd.gif    }

InBlock.gif    
public void SetDate (int day, int month, int year)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
this.day   = day;
InBlock.gif        
this.month = month;
InBlock.gif        
this.year  = year;
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

None.gif
None.gif你可在这里得到并设置这些属性:
None.gif
None.gif
class  User
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif   
public static void Main()
ExpandedSubBlockStart.gifContractedSubBlock.gif   
dot.gif{
InBlock.gif        Date date 
= new Date();
InBlock.gif        date.Day 
= 27;
InBlock.gif        date.Month 
= 6;
InBlock.gif        date.Year 
= 2003;
InBlock.gif        Console.WriteLine(
"Date: {0}/{1}/{2}", date.Day,
InBlock.gif                                               date.Month,
InBlock.gif                                               date.Year);
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

None.gif
None.gif
None.gif
None.gif
None.gif
-------------------
None.gif修饰符
None.gif
-------------------
None.gif你必须已经知道public、
private 、protected这些常在C ++ 当中使用的修饰符。这里我会讨论一些C#引入的新的修饰符。
None.gif
None.gif
readonly (只读)
None.gifreadonly修饰符仅在类的数据成员中使用。正如这名字所提示的,
readonly  数据成员仅能只读,它们只能在构造函数或是直接初始化操作下赋值一次。readonly与const数据成员不同, const  要求你在声明中初始化,这是直接进行的。看下面的示例代码:
None.gif
None.gif
class  MyClass
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
const int constInt = 100;    //直接初始化
InBlock.gif
    readonly int myInt = 5;      //直接初始化
InBlock.gif
    readonly int myInt2;     //译者注:仅做声明,未做初始化
InBlock.gif
    
InBlock.gif    
public MyClass()
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        myInt2 
= 8;              //间接的
ExpandedSubBlockEnd.gif
    }

InBlock.gif    
public Func()
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        myInt 
= 7;               //非法操作(译者注:不得赋值两次)
InBlock.gif
        Console.WriteLine(myInt2.ToString());
ExpandedSubBlockEnd.gif    }

InBlock.gif    
ExpandedBlockEnd.gif}

None.gif
None.gif
sealed (密封)
None.gif密封类不允许任何类继承,它没有派生类。因此,你可以对你不想被继承的类使用sealed关键字。
None.gif
None.gif
sealed   class  CanNotbeTheParent
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
int a = 5;
ExpandedBlockEnd.gif}

None.gif
None.gif
unsafe (不安全)
None.gif你可使用unsafe修饰符来定义一个不安全的上下文。在不安全的上下文里,你能写些如C
++ 指针这样的不安全的代码。看下面的示例代码:
None.gif
None.gif
public   unsafe  MyFunction(  int   *  pInt,  double *  pDouble)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
int* pAnotherInt = new int;
InBlock.gif    
*pAnotherInt  = 10;
InBlock.gif    pInt 
= pAnotherInt;
InBlock.gif    dot.gif
InBlock.gif    
*pDouble = 8.9;
ExpandedBlockEnd.gif}

None.gif
None.gif
None.gif
None.gif
None.gif
-------------------
None.gif
interface (接口)
None.gif
-------------------
None.gif
None.gif如果你有COM方面的概念,你会立亥明白我要谈论的内容。一个接口就是一个抽象的基类,这个基类仅仅包含功能描述,而这些功能的实现则由子类来完成。C#中你要用interface关键字来定义象接口这样的类。.NET就是基于这样的接口上的。C#中你不支持C
++ 所允许的类多继承(译者注:即一个派生类可以从两个或两个以上的父类中派生)。但是多继承方式可以通过接口获得。也就是说你的一个子类可以从多个接口中派生实现。
None.gif
None.gif
using  System;
None.gif
interface  myDrawing
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
int originx
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
get;
InBlock.gif        
set;
ExpandedSubBlockEnd.gif    }

InBlock.gif    
int originy
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
get;
InBlock.gif        
set;
ExpandedSubBlockEnd.gif    }

InBlock.gif    
void Draw(object shape);
ExpandedBlockEnd.gif}

None.gif
None.gif
class  Shape: myDrawing
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
int OriX;
InBlock.gif    
int OriY;
InBlock.gif
InBlock.gif    
public int originx
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif        
getdot.gif{
InBlock.gif            
return OriX;
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockStart.gifContractedSubBlock.gif        
setdot.gif{
InBlock.gif            OriX 
= value;
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }

InBlock.gif    
public int originy
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif        
getdot.gif{
InBlock.gif            
return OriY;
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockStart.gifContractedSubBlock.gif        
setdot.gif{
InBlock.gif            OriY 
= value;
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }

InBlock.gif    
public void Draw(object shape)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        dot.gif    
// do something
ExpandedSubBlockEnd.gif
    }

InBlock.gif    
InBlock.gif    
// class's own method
InBlock.gif
    public void MoveShape(int newX, int newY)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif    dot.gif..
ExpandedSubBlockEnd.gif    }

InBlock.gif    
ExpandedBlockEnd.gif}

None.gif
None.gif
None.gif
None.gif
None.gif
-------------------
None.gifArrays(数组)
None.gif
-------------------
None.gif
None.gifC#中的数组比C
++ 的表现更好。数组被分配在堆中,因此是引用类型。你不可能访问超出一个数组边界的元素。因此,C#会防止这样类型的bug。一些辅助方式可以循环依次访问数组元素的功能也被提供了,foreach就是这样的一个语句。与C ++ 相比,C#在数组语法上的特点如下:
None.gif
None.gif方括号被置于数据类型之后而不是在变量名之后。
None.gif创建数组元素要使用new操作符。
None.gifC#支持一维、多维以及交错数组(数组中的数组)。
None.gif
None.gif示例:
None.gif
None.gif    
int [] array  =   new   int [ 10 ];               //  整型一维数组
None.gif
     for  ( int  i  =   0 ; i  <  array.Length; i ++ )
None.gif        array[i] 
=  i; 
None.gif
None.gif    
int [,] array2  =   new   int [ 5 , 10 ];           //  整型二维数组
None.gif
    array2[ 1 , 2 =   5 ;
None.gif
None.gif    
int [,,] array3  =   new   int [ 5 , 10 , 5 ];        //  整型的三维数组
None.gif
    array3[ 0 , 2 , 4 =   9 ;
None.gif
None.gif    
int [][] arrayOfarray  =   =   new   int [ 2 ];     //  整型交错数组(数组中的数组)
None.gif
    arrayOfarray[ 0 =   new   int [ 4 ]; 
ExpandedBlockStart.gifContractedBlock.gif    arrayOfarray[
0 =   new   int []  dot.gif {1,2,15} ;
None.gif
None.gif
None.gif
None.gif
None.gif
-------------------
None.gif索引器
None.gif
-------------------
None.gif
None.gif索引器被用于写一个访问集合元素的方法,集合使用
" [] " 这样的直接方式,类似于数组。你所要做的就是列出访问实例或元素的索引清单。类的属性带的是输入参数,而索引器带的是元素的索引表,除此而外,他们二者的语法相同。
None.gif
None.gif示例:
None.gif
None.gif注意:CollectionBase是一个制作集合的库类。List是一个protected型的CollectionBase成员,储存着集合清单列表。
None.gif
class  Shapes: CollectionBase
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
public void add(Shape shp)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        List.Add(shp);
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
//indexer
InBlock.gif
    public Shape this[int index]
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif        
get dot.gif{
InBlock.gif            
return (Shape) List[index];
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockStart.gifContractedSubBlock.gif        
set dot.gif{
InBlock.gif            List[index] 
= value ;
ExpandedSubBlockEnd.gif         }

ExpandedSubBlockEnd.gif     }

ExpandedBlockEnd.gif}

None.gif
None.gif
None.gif
None.gif
None.gif
-------------------
None.gif装箱和拆箱操作(Boxing
/ Unboxing)
None.gif
-------------------
None.gif
None.gifC#的装箱思想是全新的。上面提到过所有的数据类型,不论内置或用户自定义,全都从命名空间System的一个基类object派生出来。因此把基本的或者原始类型转换成object类型被称做装箱,反之,这种方式的逆操作被称为拆箱。
None.gif
None.gif示例:
None.gif
None.gif
class  Test
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif   
static void Main()
ExpandedSubBlockStart.gifContractedSubBlock.gif   
dot.gif{
InBlock.gif      
int myInt = 12;
InBlock.gif      
object obj = myInt ;       // 装箱
InBlock.gif
      int myInt2 = (int) obj;    // 拆箱
ExpandedSubBlockEnd.gif
   }

ExpandedBlockEnd.gif}

None.gif
None.gif示例展示了装箱和拆箱操作。一个整型值转换成object类型,然后又转换回整型。当一个值类型的变量需要转换成引用类型时,一个object的箱子会被分配容纳这个值的空间,这个值会被复制进这个箱子。拆箱与此相反,一个object箱子中的数据被转换成它的原始值类型时,这个值将被从箱中复制到适当的存储位置。

转载于:https://www.cnblogs.com/penboy/archive/2005/04/03/131114.html

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值