C#传智:枚举结构数组(第六天)
Posted dzweather
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#传智:枚举结构数组(第六天)相关的知识,希望对你有一定的参考价值。
一、常量
定义:永远不能变化的量。不能再次赋值。而变量可以多次赋值。
声明: const 变量类型 变量名=值;
何时用常量:不希望随意改变的值,方便程序维护和一次性改变。
二、枚举
定义:列出某些有穷序列的成员的数据结构
例:大学生管理系统,有姓名、性别、年龄、系别等中表示性别时
有gender='男';s1="female";ss1="ss1";即数据结构不一致的定义
造成使用的不便,故用枚举来规范数据结构,大家统一使用方便。
语法:
[public] enum 枚举名
值1;
值2;
...
public/private 访问修饰符,公开公共的/私有的
enum 声明枚举的关键字。一般用在namespace与class之间,方便所有类能使用。
即在命名空间之下。
enum 是一个变量类型,声明赋值使用有区别。
声明时成员用逗号隔开,最后一个成员可以不用逗号,一般不用表示成员结束。
声明时与int相同,赋值时带成员。
public enum Sesons 春,夏,秋,冬
Sesons s = Sesons.秋;
Console.WriteLine(s);//秋
Console.WriteLine(Sesons.春);//春
Console.WriteLine((int)Sesons.春);//0
Console.WriteLine((int)s);//2
Console.WriteLine((int)(s + 1));//3
Console.WriteLine(s + 1);//冬
enum与string及int的转换
enum->int
枚举类型默认可以和int类型互相转换,两者兼容。默认成员从0开始.
也可人为设置起始点,甚至在中间再设起始点。例:
public enum QQstate
OnLine = 2, //2
OffLine, //3
Leave = 5, //5
busy, //6
Qme //7
int->enum
按序号对应输出enum的成员,若无法转换则原样输出。
public enum Sesons 春,夏,秋,冬
int n1 = 2, n2 = 5;
Sesons a = (Sesons)n1;
Sesons b = (Sesons)n2;
Console.WriteLine(a);//秋
Console.WriteLine(b);//5 不报错
enum->string
所有的类型都可以转换成string,调用ToString()方法。
int a = 3;
double b = 4.6;
decimal c = 22m;
Sesons s = Sesons.春;
Console.WriteLine("0,1,2", a.ToString(), b.ToString(), c.ToString());
Console.WriteLine("0,1", s, s.ToString());//春,春
注意:ToString()最后面的()不能省略。
将字符串转为整形的三种方式:
1.Convert.ToInt32(); 2.int.parse() ; 3.int.Tryparse()
Convert.ToInt32与int.Parse较为类似,实际上Convert.ToInt32内部调用了int.Parse:
Convert.ToInt32 参数为null时,返回 0;
int.Parse 参数为null时,抛出异常。
Convert.ToInt32 参数为""时,抛出异常;
int.Parse 参数为""时,抛出异常。
Convert.ToInt32 可以转换的类型较多;
int.Parse 只能转换数字类型的字符串。
int.TryParse与int.Parse 又较为类似,但它不会产生异常,转换成功返回 true,转换失败返回 false。最后一个参数为输出值,如果转换失败,输出值为 0。
int m;
if(int.TryParse("2"),out m)
...
返回true ,运行内,并给m赋值为2;
if(int.TryParse("ddd"),out m)
...
返回false,不运行if内,并给m赋值为0;
int m;
string a = "3", b = "", c = null, d = "3kk";
Console.WriteLine(Convert.ToInt32(c));//0
Console.WriteLine(int.Parse(c));//异常
Console.WriteLine(Convert.ToInt32(b));//异常
Console.WriteLine(int.Parse(b));//异常
Console.WriteLine(Convert.ToInt32(d));//异常
Console.WriteLine(int.Parse(d));//异常
if (int.TryParse(a, out m)) Console.WriteLine(m);//3
if (int.TryParse(b, out m)) Console.WriteLine(m);//为假
if (int.TryParse(c, out m)) Console.WriteLine(m);//为假
if (int.TryParse(d, out m)) Console.WriteLine(m);//为假
(int) 属cast转换,只能将其它数字类型转换成int类型,它不能转换字符串,比如下例就会失败:
string v = "1";
int n = (int)v;
类似有double.parse(),bool.parse(),Enum.parse()
enum->string
没有Convert.toEnum,因为无法预知自定义的Enum类型。
Enum.parse()首字母必须大写,这点与int,double等转换有区别。
例:Enum.parse(typeof(Sesons),s)
上面typeof(Sesons)表明是取某枚举的类型,利用反射原理。
s为要转换的字符串。
string s1 = "春", s2 = "0",s3="ABC";
Sesons state1 = (Sesons)Enum.Parse(typeof(Sesons), s1);
Sesons state2 = (Sesons)Enum.Parse(typeof(Sesons), s2);
Sesons state3 = (Sesons)Enum.Parse(typeof(Sesons), s3);//异常
Console.WriteLine(state1);//春
Console.WriteLine(state2);//春
总结:Enum可向int和string进行转换。
1.Enum与int兼容,可相互强制转换.当转换到Enum中没有的值时,不会异常,直接显示数字。
2.Enum可与string互相转换。Enum->string 直接调用ToString().
string->Enum 时,需要:(枚举类型)Enum.parse(typeof(枚举类型),要转的字符串)
若字符串是数字,即使枚举中无,也不会异常。
若字符串是字母,如果枚举中无,则抛出异常。
三、结构
一次性声明多个不同类型的变量。用结构.
F12查看定义,例:int后再按F12查看定义有struct
1.语法
[public] struct 结构名
成员;//字段,不叫变量。不同的结构变量对应不同的值。
变量仅能存储一人值,字段取决于结构变量的多少。
注意:一般字段开始以_下线线为开始。例如:
public struct Person
public string _name;
public int _age;
public Gender _gender;
public enum Gender
男,
女
四、数组
一次性存储多个相同的变量,用数组.
语法: 数组类型[] 数组名=new 数组类型[数组长度];
int[] nums=new int[10];
程序进入后,根据声明知道有nums值为null,然后由初始赋值开辟连续
的int类型存储空间10个,初始值为0.
null与“”的区别:
null 还没有开辟空间,无值;
“”变量已经开辟了空间,有值值为""。
数组中的每一个称为元素,根据索引或下标去访问.索引不能超限,异常.
元素由0到length-1。即上面10的长度为10,索引为0-9。
数组一旦固定不能更改索引。
数组中,int/double/decimal初值为0,bool为false,string为null,
数组的4种声明方式:
int[] n1 = new int[6];//推荐
int[] n2 = 0, 1, 2, 3, 4, 5 ;//推荐
int[] n3 = new int[6] 0, 1, 2, 3, 4, 5 ;
int[] n4 = new int[] 0, 1, 2, 3, 4, 5 ;
应用:
int[] n = 22, 33, 44, 23, 54, 112, 45, 2 ;
int max = n[0], min = n[0];//必须取数组中某一元素值
//int max = int.MinValue, min = int.MaxValue;//或者取整数对应的上下限值
int sum = 0;
for (int i = 0; i < n.Length; i++)
if (n[i] > max)
max = n[i];
if (n[i] < min)
min = n[i];
sum += n[i];
倒序数组:
string[] names = "我", "是", "好", "人" ;
string temp = "";
for (int i = 0; i < names.Length / 2; i++)
temp = names[i];
names[i] = names[names.Length - 1 - i];
names[names.Length - 1 - i] = temp;
冒泡排序:
int[] n = 9, 7, 6, 2, 8, 5, 4, 0, 1, 3 ;
int temp;
for (int i = 0; i < n.Length - 1; i++)
for (int j = i + 1; j < n.Length; j++)
if (n[i] > n[j])
temp = n[i];//最小在前
n[i] = n[j];
n[j] = temp;
不用冒泡法,直接用Array:
Array.Sort(n);//从小到大排列,升序
Array.Reverse(n);//对当前数组反转,即将上面变成从大到小。
五、方法
方法(函数),参数,返回值。代码重用的一种机制。
语法:
[public] static 返回值类型 方法名([参数列表])
方法体;
public公共的,static静态的.
static修饰类,属性,方法。使用static后不需要创建实例对象就可以直接通过类名点使用。
三种用法:
1.用在变量前。表示该变量在类、方法等中,变量一直为最后一次修改的值。
2.用在方法时。表示为类所拥有,而不是所有实例所有(静态方法)。
故不用实例即可使用,通过类名引用:类名.静态方法;
3.用于类前.说明该类无法创建实例,类中全是静态方法,类中非静态方法是不能使用的。
此类又称为静态类。
以上是关于C#传智:枚举结构数组(第六天)的主要内容,如果未能解决你的问题,请参考以下文章
黑马程序员C语言基础(第八天)复合类型(自定义类型)共用体(联合体)枚举 typedef