结构和枚举
Struct是封装一个或几个简单类型来构成一个复杂的类型。
结构不能从另一个结构或类继承,而且不能做为一个类的基类。但结构可以实现接口。所以struct的访问修饰符不可以是protected和private,它的默认修饰符为internal。
下面我们再来看看结构成员:
结构成员的访问修饰符可以是private,public,但不可以是protected.
结构成员的字段有两种:普通字段和静态字段、常量字段。
普通字段:在struct中,我们不能给实例字段初始化,如果想给实例字段赋值,只能通过构造函数。如果没有构造函数,那么不能给普通字段显式赋值,系统会自动 给普通字段一个默认值。如果有构造函数,则必需在构造函数中给普通字段初始化,至于静态字段可赋值可不赋值。
静态字段、常量字段:不需要在构造函数中初始化,在结构中,静态字段和常量用结构名调用。如果我们在结构体内定义静态字段时给它赋值,那么系统会自动生成一个静态构造函数,完成静态字段的初始化。如果只定义了静态字段而没给它赋值的话那么不会自动生成一个静态构造函数。
结构体与类的区别:
1:结构体是值类型,而类是引用类型。
2:与类不同,结构的实例化可以不使用new关键字。
Struct MyPoint
{
Public folat x;
}
Class Program
{
Static void Main(string[] args)
{
MyPoint mp=new MyPoint();
Console.WriteLine(mp.x);
//MyPoint mp;
//Mp.x=10;
//Console.WriteLine(mp.x);
}
}
结构的实例化有两种方式:一种用new,一种不用new。用new这种方式的话,我们可以不给x赋值而直接用它,因为当我们new MyPoint()时,系统会把MyPoint里的实例字段装入内存并给它一个默认的初始值,但是如果我们不用new的话,则必须给x赋一个值才能去用x,否则会报错。
3:结构体可以声明构造函数,但必须带参数(结构体有一个默认的无参构造函数,我们不能覆盖它,也不能替换)
Struct MyPoint
{
Public MyPoint(){}//报错,结构不能包含显式的无参构造函数;
Public MyPoint(int i)
{
Console.WriteLine(i.ToString());
}
}
4:一个结构体不能从另一个结构体或类继承,而且不能做为一个类的基类,所有结构都直接继承自System.ValueType,后者继承自System.Object.
5:结构体可以实现接口。(接口中的方法定义前不能有修饰符)
6:结构体可用作为null的类型,因而可向其赋null值。
MyPoint mp=new MyPoint();
mp=null;//报错
MyPoint? mp=new MyPoint();
mp=null;
枚举(enum ):每种枚举类型都有基础类型,该类型可以是除 char 以外的任何整型。枚举元素的默认基础类型为int,默认情况下,第一个枚举数的值为0,后面每个枚举的值依次递增1,
Enum MyEnum
{
早上=0;//不写的话默认是从0开始的,也可以写早上=5,晚上和中午会自动加1
晚上=1;
中午=2;
}
Static void Main(string[] args)
{
MyEnum.早上;//(供用户去选择时只能选择我们列举的值,早上,中午,晚上,其它的不能选,选了会报错)
}
属性枚举(位标志)
将 System.FlagsAttribute 应用于某个枚举时,如果该枚举包含一些使用按位“或”运算组合的元素。
[Flags]
enum Menu
{
文件=1,
编辑=2,
视图=4
}
Menu m = Menu.编辑|Menu .文件;
Console.WriteLine(m); //输出“编辑,文件”。
foreach ( string str in Enum.GetNames(typeof(ConsoleColor)))
{
Console.WriteLine(str); //将枚举转换为string类型
}
Console.BackgroundColor = ( ConsoleColor)Enum.Parse(typeof(ConsoleColor), "green", true); //将一个string类型转换为枚举类型
数组
数组就是存放一系列数据类型相同的一个序列或集合。
//这种方法增加系统开销,不推荐使用
//Array是个抽象类,不能用来创建实例化
Array arr = Array.CreateInstance(typeof(int), 10);//创建一个长度为10的int数组,数组类型都是继承Array下来的,Array不可以定义数组类型
for (int i = 0; i < 10; i++)
{
arr.SetValue(i * 2, i);//这是一个装箱操作
}
//foreach (int s in arr)
//{
// Console.WriteLine(s);
//}
for (int i = 0; i < 10; i++)
{
Console.WriteLine(arr.GetValue(i));//这是一个拆箱操作
}
//给数组排序
int[] arrint = new int[] { 23, 4, 53, 6, 3, 7, 4, 123, 42 };
Array.Sort(arrint);
Array.Reverse(arrint);
foreach (int i in arrint)
{
Console.WriteLine(i);
}
//二维数组
int[,] arrint = new int[,] { { 1, 2, 3, 4 }, { 5, 6, 7, 8 } };
int rlen = arrint.GetLength(0);//零表示行的维度
int clen = arrint.GetLength(1);//一表示列的维度
for (int r = 0; r < rlen; r++)
{
for (int c = 0; c < clen; c++)
{
Console.Write(arrint[r,c]+" ");
}
Console.WriteLine();
}
//交错数组,数组中的数组¦
int[][] arri = new int[3][];//第二个方括号里的数不能定义,第一个括号里的数必须给
arri[0] = new int[] { 1, 2 };
arri[1] = new int[] { 3, 4, 5 };
arri[2] = new int[] { 6 };
int rlen = arri.Length;
for (int r = 0; r < rlen; r++)
{
int clen = arri[r].Length;
for (int c = 0; c < clen; c++)
{
Console.Write(arri[r][c]+" ");
}
Console.WriteLine();
}
foreach (int[] i in arri)
{
foreach (int s in i)
{
Console.WriteLine(s);
}
}