线上服务咨询
C#学习日志之数据类型
发表时间:2018-07-12 17:59:45
文章来源:未知
浏览次数:0次
数据类型:
一、值类型
1、整数类型:sbyte(有符号8位)、byte(无符号8位)、short(有符号16位)、ushort(无符号16位)、int(有符号32位)、uint(无符号32位)、long(有符号64位)、ulong(无符号64位)。
2、浮点类型:float(单精度)、double(双精度)。
3、小数类型:decimal(128位)。在定义时,需在数字后加"m"或"M",如decimal d=1.255m。
4、布尔类型:bool(true/false)。
5、字符类型:char(16位)。
6、枚举类型:enum(与c++中类似)。
7、结构类型:struct(与c++中类似)
注:在c#中,这些数据类型被定义在不同的命名空间。如"sbyte",即有别名"System.Sbyte",意味着在命名空间System中有对该数据类型的定义,所以要使用这些数据类型必须在文件开头声明"using System",即把该命名空间引入。其中,小数类型与浮点类型的不同之处在于它的精度 更高,float的精度为7位数,double的精度为15~16位,而decimal有29位的精度。并且,decimal与float、double之间没有隐式转换。
二、引用类型
1、类
关键词:class
类的数据成员:常量、域、事件。
类的函数成员:方法、属性、索引指示器、运算符、构造函数,析构函数。
c#类的一些特性:
属性——这里的含义与c++或java中的略有不同,在c++或java中,这是数据成员的另一种称呼,在c#中却有另外的含义。有过c++或者java等编程经历的同学可能会遇到一种情况,类中某个数据成员既允许被访问又允许被修改(即有自定义的set和get两种成员函数去修改或访问它),其实在编程中这样的情况还是常见的,因此c#专门设计了类的属性简化操作。如下:
class A{
private int aa;
public int Aa{
get{
return aa;
}
set{
aa=value;
}
}
}
定义完成后,我们就可以通过下面操作get或set aa:
class option
{
public static void Main(){
A a=new A();
p.Aa=125; //set aa的值为125
Console.WriteLine(p.Aa); //get到aa
}
}
属性的声明可以只包含set或get中的任一个。
一些特殊的类:
object类:object类是所有类型的基类,c#中所有类型都是直接或间接从object类继承而来的。它被定义在命名空间System中,因此有别名System.Object。有如此特性:对于任何一个object变量,均可以赋以任何类型的值。
string类:专门用于对字符串进行操作。
注:关于类的具体内容留待后面学习中另做文章补充。
2、委托
关键词:delegate
委托也称代表,相当于c#中的指针原型,与指针不同,委托是安全的。在声明委托时,只需要指定委托指向的原型类型即可。如果我们声明了一个委托,即对System.delegate做了一个扩展。如实例中,既可以委托静态方法,也可以委托非静态方法。
委托声明原型举例: delegate string MyDelegate();
实例:
delegate string MyDelegate();
class Person
{
public string Mydg_Normal()
{
return "非静态委托调用";
}
public static string Mydg_Static()
{
return "静态委托调用";
}
}
class Program
{
static void Main(string[] args)
{
Person p = new Person();
MyDelegate myDelegate = new MyDelegate(p.Mydg_Normal);
Console.WriteLine(myDelegate());
myDelegate = new MyDelegate(Person.Mydg_Static);
Console.WriteLine(myDelegate());
Console.ReadKey(); //使控制台在按任意键后退出
}
}
输出:
非静态委托调用
静态委托调用
3、数组
数组的声明
一维数组:int[] numners=new int[5];
多维数组:string[,] names=new string[5,4]; //可以理解为5行4列二维数组
数组的数组(交错数组):
byte[][] scores=new byte[5][];
for(int x=0;x<scores.Length;x++)
{
score[x]=new byte[x+1];
} //byte类型数组的默认值为0
注:每种类型的数组基本上都有默认值,引用类型的数组默认值为null,可以声明为不分配内存的形式,但使用前必须初始化。
数组初始化
一维数组:int[] numbers=new int[5]{1,2,3,4,5};
或者不指定数组大小——int[] numbers=new int[]{1,2,3,4,5};
或者省略new——int[] numbers={1,2,3,4,5};
多维数组:int[,] numbers=new int[3,2]{{1,2},{3,4},{5,6}};
或者不指定数组大小——int[,] numbers=new int[,]{{1,2},{3,4},{5,6}};
或者省略new——int[,] numbers={{1,2},{3,4},{5,6}};
交错数组:int[][] numbers=new int[2][]{new int[]{2,3,4},new int[]{5,6,7,8,9}};
或者不指定数组大小——int[][] numbers=new int[][]{new int[]{2,3,4},new int[]{5,6,7,8,9}};
或者省略new——int[][] numbers={new int[]{2,3,4},new int[]{5,6,7,8,9}};
三、装箱和拆箱
int i=123;
object box=i; //装箱完毕
int j=(int)box; //拆箱完毕
用途:与"is"条件判断关键词连用,可以依据对象类型,作出不同的操作。如下:
public void function(object obj)
{
if(obj is int)
{
Console.WriteLine("obj是整型的");
}
else if (obj is char)
{
Console.WriteLine("obj是整型的");
}
else if (obj is long)
{
Console.WriteLine("obj是长整型的");
}
else if (obj is Person) //Person是自定义类型
{
Console.WriteLine("obj是Person类型的");
}
}
四、数据类型转换
隐式转换——一种安全的类型转换。在值类型中,由低字节的类型向相同字节或高字节的类型转换,且一般遵循“有符号向有符号转换,无符号既可以转换为有符号又可以转换为无符号”的规则。
举例:
byte b = 1;
short us = b; //无符号字节类型转换为有符号短整型
float f = 1.0f;
double d = f; //单精度转换为双精度
显示转换——又叫强制类型转换。可强制使高字节类型向低字节类型转换,有可能会产生溢出。
举例:
int ii = 2000;
byte ib = (byte)ii; //4字节的整数类型向1字节的字节类型(最大值255)转换,发生溢出,最后结果为208。
float f = 1.0f;
decimal d = (decimal)f; //单精度浮点数向小数类型转换