一、我们什么时候创建strucut?什么时候使用类,参考以下两点:
1)当c#的预定义类型,比如int ,double等不能满足我们的需求的时候,比如我们想定义一个坐标,该坐标有X,Y,Z,并且都是double类型,那我们就可以考虑使用struct或者class,但是由于stuct所占的内存比较小时具有性能的优势,所以定义在小于16字节的类型时,我们使用struct,大于16字节时使用class(参考《c#本质论》);这里还有一个问题,我们如何知道一个结构所占的内存有多大呢?这里使用sizeof
struct Angle
{
public Angle(double degrees, double minutes)
{
this.Degrees = degrees;
this.Minutes = minutes;
}
public double Degrees { get; set; }
public double Minutes { get; set; }
}
调用:
unsafe
{
int size = sizeof(Angle);//sizeof在判断结构体所占内存大小时,sizeof 运算符只能在不安全代码块中使用,并且
//结构体中成员不能有引用类型,如果有引用类型,引用类型所占的内存就不仅仅包含了
//栈中存储的地址(多少位机器就是多少位的地址,比如32位),还包括了堆中存储的
//数据。
}
2)结构还可以包含 构造函数、 常量、 字段、 方法、 属性、 索引器、 运算符、 事件和 嵌套类型,但如果同时需要上述几种成员,则应当考虑改为使用类作为类型(参考《msdn》)。
2、如何使用,参考代码如下:
声明:
struct Angle
{
public Angle(double degrees, double minutes, double seconds)
{
this.Degrees = degrees;
this.Minutes = minutes;
this.Seconds = seconds;
}
public double Degrees { get; set; }
public double Minutes { get; set; }
public double Seconds { get; set; }
}
调用:
Angle angle= new Angle(100, 200, 300);
angle.Degrees = 400;
angle.Minutes = 400;
angle.Seconds = 100;
2、枚举
当我们为了增加代码的可读性时使用枚举,未使用枚举的代码:
int country=0;
switch (country)
{
case 0:
break;
case 1:
break;
case 2:
break;
case 3:
break;
default :
break;
}
使用后:
枚举的定义:
enum Country
{
China,
American,
Japan=4,
France//则这个默认的值就会变成了5
}
枚举的使用:
Country country=Country.China ;
switch (country)
{
case Country.China :
break;
case Country.American :
break;
case Country.Japan :
break;
case Country.France :
break;
default :
break;
}
枚举数组之间的转换
enum Country1
{
China,
American,
Japan=4,
France//则这个默认的值就会变成了5
}
enum Country2
{
China,
American,
Japan = 4,
France//则这个默认的值就会变成了5
}
Country1[] country= (Country1[])(Array) new Country2[10];//必须将一个枚举先转换为Array类型,再仅从转换。
枚举和字符串之间的转换
1)枚举转字符串;
FileStatus fileStatus = FileStatus.Hidden;
string fileStatusStr = fileStatus.ToString();
2)字符串转枚举(使用enum.parse来实现转换)
FileStatus newFileStatu;
newFileStatu = Enum.TryParse(fileStatusStr, out newFileStatu) ? newFileStatu :FileStatus.ReadAndWrite ;
将枚举作为位标志
[Flags]
enum FileStatus
{
ReadOnly = 1 << 0,
WriteOnly = 1 << 1,
Hidden = 1 << 2,
ReadAndWrite = 1 << 4
}