C#速成(之四)

原创 2003年08月29日 07:38:00

-------------------

装箱和拆箱操作(Boxing/Unboxing

-------------------

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

C#的装箱思想是全新的。上面提到过所有的数据类型,不论内置或用户自定义,全都从命名空间System的一个基类object派生出来。因此把基本的或者原始类型转换成object类型被称做装箱,反之,这种方式的逆操作被称为拆箱。

 

示例:

 

class Test

{

   static void <?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />Main()

   {

      int myInt = 12;

      object obj = myInt ;       // 装箱

      int myInt2 = (int) obj;    // 拆箱

   }

}

 

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

 

 

 

 

-------------------

方法参数

-------------------

 

C#中有三种类型的参数:

 

值参数/输入型参数

引用型参数/输入输出型参数

Out参数

 

如果你有COM接口和它的参数类型的概念,你会很容易理解C#参数类型。

 

值参数/输入型参数

值概念与C++相同。所要传递的值会被复制到一个位置上并被传递给函数。

 

示例:

 

SetDay(5);

...

void SetDay(int day)

{

    ....

}

 

 

引用型参数/输入输出参数

C#中的引用参数既不是C++中的指针也不是引用操作符(&)来传递的。C#的引用型参数减少了出错的可能。引用型参数也被称作输入输出参数,因为你传递了一个引用地址,因此你可以从函数中传递一个输入值并且可以获得一个输出值。

 

你不能把一个未经初始化的引用型参数传递给函数。C#ref这个关键字来声明引用型参数。当你传递一个变量给函数要求的引用参数时必须使用一个ref关键字说明。

 

示例:

 

    int a= 5;

    FunctionA(ref a);        // 要用ref声明变量,否则你会得到

                             // 一个编译错误

    Console.WriteLine(a);    // 指向地址的值为20

 

    void FunctionA(ref int Val)

    {

        int x= Val;

        Val = x* 4;

    }

 

 

Out参数

Out型参数仅仅从函数当中返回一个值。不要求有输入值。C#用关键字out来描声明这个参数

 

示例:

 

    int Val;

    GetNodeValue(Val);

 

    bool GetNodeValue(out int Val)

    {

        Val = value;

        return true;

    }

 

 

 

可变数量的参数和数组

数组在C#当中是通过关键字params来描述传递的。作为数组类型的变量,你能传递任意数量的元素。从下面示例中你可以理解的更好。

 

示例:

 

    void Func(params int[] array)

    {

        Console.WriteLine("number of elements {0}",array.Length);

    }

 

    Func();                      // prints 0

    Func(5);                     // prints 1

    Func(7,9);                   // prints 2

    Func(new int[] {3,8,10});    // prints 3

    int[] array = new int[8] {1,3,4,5,5,6,7,5};

    Func(array);                 // prints 8

 

 

 

 

-------------------

运算符和表达式

-------------------

运算符和表达式概念与C++完全相同。但是一些新的有用的运算符被填加了进来。我将在这里讨论其中的某些部分。

 

is 运算符

is 运算符被用于检查操作数的类型是否相同或者是否可以转换。is 运算符在多态环境下特别有用。它有两个操作数,运算结果是一个布尔型。看这个示例:

 

void function(object param)

{

    if(param is ClassA)

        //do something

    else if(param is MyStruct)

        //do something

    }

}

 

as 运算符

as 运算符检查操作数的类型是否可被转换或者是否相等(这些 as通过 is 运算符来完成。如果结果是可转换的,则结果将被转换或者被装箱,成object(关于as运算符进行装箱成目标类型的操作请看前面的装箱/拆箱操作)。如果不可转换或者装箱,则返回值是null。瞧一瞧下面的例子我们会更好地理解这个概念。

 

Shape shp = new Shape();

Vehicle veh = shp as Vehicle;   // 结果是null, 类型不可转换

 

Circle cir = new Circle();

Shape shp = cir;

Circle cir2 = shp as Circle;    //会被转换

 

object[] objects = new object[2];

objects[0] = "Aisha";

object[1] = new Shape();

 

string str;

for(int i=0; i&< objects.Length; i++)

{

    str = objects[i] as string;

    if(str == null)

        Console.WriteLine("can not be converted");

    else

        Console.WriteLine("{0}",str);

}

 

输出:

Aisha

can not be converted

 

 

 

 

-------------------

语句

-------------------

 

除了对某些新增语句和对某些语句的修改以外,C#语句与C++非常相象。

 

下面是新增的语句:

 

foreach

用于循环依次访问集合元素,比如象数组等。

 

示例:

 

    foreach (string s in array)

        Console.WriteLine(s);

 

 

lock

用于锁住代码块,使线程在临界争区内,别的线程无法进入锁定的临界区。

 

 

checked/unchecked

用于数值运算中的溢出检测。

 

示例:

 

int x = Int32.MaxValue; x++;    // 溢出检测

{

x++;                            // 异常

}

unchecked

{

x++;                            // 溢出}

}

 

 

下面的语句在C#当中已经被修改:

 

 

Switch

执行一个case语句后,程序流程不允许跳到下一个相邻case语句。这在C++当中是被允许的。

 

示例:

int var = 100;

switch (var)

{

    case 100: Console.WriteLine("<Value is 100>");

        // 没有break语句

    case 200: Console.WriteLine("<Value is 200>"); break;

}

C++编译后的输出:

    <Value is 100><Value is 200>

 

C#下,编译时会报错:

error CS0163: Control cannot fall through from one case label

('case 100:') to another

 

但是你仍然能做C++类似的事

switch (var)

{

    case 100:

    case 200: Console.WriteLine("100 or 200<VALUE is 200>");

              break;

}

 

你也可以常数变量作为case 的值:

示例:

 

const string WeekEnd  = "Sunday";

const string WeekDay1 = "Monday";

 

....

 

string WeekDay = Console.ReadLine();

switch (WeekDay )

{

case WeekEnd: Console.WriteLine("It's weekend!!"); break;

case WeekDay1: Console.WriteLine("It's Monday"); break;

 

}

C#速成(之四)

 -------------------装箱和拆箱操作(Boxing/Unboxing)------------------- C#的装箱思想是全新的。上面提到过所有的数据类型,不论内置或用户自定义,...
  • ailincn
  • ailincn
  • 2005年09月02日 17:17
  • 717

C#速成(之四)

  • zgqtxwd
  • zgqtxwd
  • 2008年04月24日 11:33
  • 109

C#游戏编程:《控制台小游戏系列》之《三、游戏输入模块》

一、输入模块结构      游戏输入模块包括对鼠标和键盘两种输入设备的处理,此模块主要为游戏框架提供鼠标操作和键盘操作能力,这些功能均以事件形式提供从而达到模块间消息传递的目的。 ...
  • fa6507
  • fa6507
  • 2013年01月26日 20:30
  • 3074

【恶补】之python一天速成

python一天速成都是骗纸~怎么可能一天~只是快速了解一些基本的 首先我是个python新手,只在网上搜例子然后用python写过一些分析文件的脚本,现在工作需要,要短时间进一步了解pyth...
  • u013207660
  • u013207660
  • 2014年08月20日 16:17
  • 3839

JAVA基础18天速成学习笔记之第10天

JAVA基础18天速成学习笔记之第10天 这是我在csdn下载的.觉得有助于复习Java所以贴了出来.感谢作者.下面附有下载地址. http://download.csdn.net/detail/...
  • thanklife
  • thanklife
  • 2013年11月08日 10:47
  • 1120

数据结构实验之排序四:寻找大富翁

数据结构实验之排序四:寻找大富翁 Time Limit: 150MS Memory limit: 512K 题目描述 2015胡润全球财富榜调查显示,个人资产在1000万以上的高净值人群...
  • guoqingshuang
  • guoqingshuang
  • 2015年12月23日 22:17
  • 2205

SDUT 3401 数据结构实验之排序四:寻找大富翁 堆排序

题目链接: http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=3401 数据结构实验之排序四:寻找大富...
  • Autii
  • Autii
  • 2016年05月05日 22:22
  • 965

sdut 2134 数据结构实验之栈与队列四:括号匹配

数据结构实验之栈与队列四:括号匹配 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem...
  • sxy201658506207
  • sxy201658506207
  • 2017年10月10日 18:40
  • 124

数据结构实验之查找四:二分查找

数据结构实验之查找四:二分查找 Time Limit: 20ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 在一个给定的无重复元素的递增...
  • guoqingshuang
  • guoqingshuang
  • 2015年12月04日 09:51
  • 967

“Ceph浅析”系列之四Ceph的结构

本文将从逻辑结构的角度对Ceph进行分析。 4.1    Ceph系统的层次结构         Ceph存储系统的逻辑层次结构如下图所示[1]。         自下向上,可以将Ceph系统...
  • qq_24916117
  • qq_24916117
  • 2015年12月30日 20:42
  • 541
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#速成(之四)
举报原因:
原因补充:

(最多只允许输入30个字)