C#速成(Quick C#)
-------------------
装箱和拆箱操作(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
- 转载请注明来源:IT学习网 网址:http://www.t086.com/ 向您的朋友推荐此文章
- 特别声明: 本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系我们,我们会尽快予以更正。