分享
 
 
 

C#速成(之四)

王朝c#·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

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

装箱和拆箱操作(Boxing/Unboxing)

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

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

示例:

class Test

{

static void 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;

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有