C#(01)
和一般的语言一样,c#也有自己的数据类型,在C#中数据类型大概有两类:值类型和引用类型,需要由定义类型的开发人员决定在什么地方分配一个实例。值类型和引用类型在使用原理上也有所不同,值类型在使用时是传递或者得到一个值的副本,而引用类型在使用时是传递或得到一个引用。
值类型特性:
1.变量存储在线程堆栈中;
2.访问值类型变量时,直接访问其实例;
3.每个变量都有自己的数据副本,因此对一个变量的操作不会影响其他变量;
4.复制时,复制的是变量的值,而不是地址;
5.值类型变量不能是NULL,必须有一个确定的值。
值类型的构成就不在这里赘述了,下面说几个常用的数值类型:
1.整数类型
sbyte -128~127
byte 0~255
char U+0000~U+ffff
short -32768~32767
ushort 0~65535
int -2147483648~2147483647
uint 0~4294967295
long -9223372036854775808~9223372036854775807
ulong 0~18446744073709551615
就下来就说下@的用法了,可以有效的简化代码,减少转义字符的使用,使代码更加简洁。在这里举个例子应该就能很明白的说清楚了,不用@的话对于以下字符串“C:\\MyDir\\Myfile.doc”就可以简化成@“C:\Mydir\Myfile.doc”当然使用这种方法也有意外,比如说在字符串里本身存在双引号的话还是必须要转义,以免结束字符串。
下来再说一下一个基本的东西,数据类型的转换:隐式转换和显式转换,所谓隐式转换,就是悄悄的转换,不需要做任何工作,不需要任何的代码,这里就不多说了,以后应该不会在这地方卡壳。重要的是显式转换,在明确要求编译器把数值类型进行转换时,就是在执行显式转换。简单的显示转换格式是<(destinationType)sourceType>,这样就将sourceVal值的数据类型就变成了前面括号里的情况。代码还是要摞起来
byte destinationVar;
short sourceVar = 7;
destinationVal=(byte)sourceVar ;
Console.WriteLine("sourceVar val:{0}",sourceVar );
Console.WriteLine("destinationVar val:{0}",destinationVar );
就可以得到
sourceVar val:7
destinationVar val::7
虽然代码很简单,还是要敲出来,印象能深刻一些,毕竟在打基础。但是如果数据过大就是有溢出的情况,比如说上例中的short类型值是281,结果就会是25,进行了循环,因为byte类型最多能够表达的数就是255.所以在数据类型转换的时候要注意不同数据类型的范围大小。为了防止溢出,可以添加check函数来进行溢出检查,如果溢出就会有程序崩溃的提示。除了这一种方式,还有另一种稍微复杂一点的转换,运用convert进行转换。不说其他,直接上代码:
static void Main(string[] args) //和java很像
{
short shortResult,shortVal=4;
int integerVal=67;
long longResult;
float floatVal=10.5F;
double doubleResult,doubleVal=99.999;
string stringResult,stringVal="17";
bool boolVal=true;
Console.WriteLine("Variable Conversion Examples\n");
doubleResult=floatVal*shortVal;
Console.WriteLine("Implicit,->double:{0}*{1}->{2}",floatVal,shortVal,doubleResult);
shortResult=(short)floatVal;
Console.WriteLine("Explicit,->short:{0}->{1}",floatVal,shortResult);
stringResult=Convert.ToString(boolVal)+Convert.ToString(doubleVal);
Console.Write("Explicit,->string:\"{0}\"+\"{1}\"->{2}",boolVal,doubleVal,stringResult);
longResult=integerVal+Conver.ToInt64(stringVal);
Console.WriteLine("Mixed, ->long: {0}+{1}->{2}",integerVal,stringVal,longResult);
}
码完这段让人吐血的代码,好无聊,但是该练习的还是要练习,这点逃不了。
接下来就说复杂的变量类型之一:枚举。
直接上代码:
enum<typeName> //定义枚举
{
<value1>
<value2>
...
<valuen>
}
<typeName><varName>; //声明新变量
<varName>=<typeName>.<value>; //赋值
还可以添加类型:
enum<typeName> :<underlyingType> //定义枚举,并且在后面设置存储类型
{
<value1>
<value2>
...
<valuen>
}
在默认情况下,每个值都会根据定义的顺序自动赋给对应的基本类型值。也就是说,value1的值是0,value2的值是1等等。也可以重写这个过程:
enum<typeName> :<underlyingType> //定义枚举,并且在后面设置存储类型
{
<value1>=<actualVal1>
<value2>=<actualVal2>
...
<valuen>=<actualValn>
}
还可以使用一个值作为另一个枚举值的基础值,为多个枚举指定相同的值:
enum<typeName> :<underlyingType> //定义枚举,并且在后面设置存储类型
{
<value1>=<actualVal1>
<value2>=<value1>
...
<valuen>=<actualValn>
}
没有赋值的任何职都会自动获得一个初始值,这里使用的值是从比上一个明确声明的值大1开始的序列。例如上例中<value3>的值是<value1>+1.
以循环的方式赋值可能会产生错误,例如:
enum<typeName> :<underlyingType> //定义枚举,并且在后面设置存储类型
{
<value1>=<value2>
<value2>=<value1>
}
枚举的强制数据类型转换:
directionString=MyDirection.ToString(); 等价于
directionString=Convert.ToString(MyDirection);
其中MyDirection是枚举类型的数据变量,directionString是string类型的数据变量。
把string转换为枚举值,有特定的命令Enum.Parse(),用法如下:
(enumrationType)Enum.Parce(typeof(enumrationType),enumrationValueString);
具体的应用如下
string myString="north";
orientation myDirection=(orientation)Enum.Parse(typeof(orientation),myString); //其中orientation为枚举类型
刚才系统崩溃了,吓死宝宝了,幸亏有自动保存。。。。。
下个月见~