枚举是一组命名整型常量。枚举类型是使用 enum 关键字声明的。
C# 枚举是值类型,存放在栈中。枚举包含自己的值,且不能继承或传递继承。
枚举的优点:
枚举的种类:
枚举的定义和使用:
enum Week
{
Monday = 1,
Tuesday = 2,
Wednesday = 3,
Sunday = 0,
Everyday = 1 // 成员的值可以设置成一样的,但是成员不行
}
Console.WriteLine((int)Week.Monday); // 获取值
显式指定枚举类型:枚举值默认从0开始,逐个递增。
enum sex : byte // 显式指定枚举的底层数据类型
{
male, // 0
female // 1
}
枚举的各种使用方法:
class Program
{
static void Main(string[] args)
{
Console.WriteLine(Enum.GetName(typeof(Man),1)); // 刘备 (由值获取成员名)
string[] array1 = Enum.GetNames(typeof(Man));
Console.WriteLine(array1[1]); // 关羽(按数组下标取成员名)
Array array2 = Enum.GetValues(typeof(Man));
Console.WriteLine(array2.GetValue(1)); // 关羽(按数组下标获取枚举值)
Type t = Enum.GetUnderlyingType(typeof(Man));
Console.WriteLine(t); // 输出 Int32(获取枚举类型)
Console.WriteLine(Man.刘备.ToString());// 获取成员名
// 由值获取内容
int i = 1;
string Name = Enum.Parse(typeof(Man), i.ToString()).ToString(); //此时 Name="刘备"
Console.WriteLine(Name);
// 由值获取内容
string Name2 = "关羽";
int j = Convert.ToInt32(Enum.Parse(typeof(Man), Name2)); //此时 j=2
Console.WriteLine(j);
Console.ReadKey();
}
}
enum Man
{
刘备 = 1,
关羽 = 2,
张飞 = 3
}
标志枚举(多选枚举)使枚举可以实现多选,写法是要在顶部加[System.Flags]特性进行声明。
class Program
{
static void Main(string[] args)
{
var man = Week.White | Week.Rich; //赋值为011 计算方法001或上010,结果是011
Console.WriteLine((int)man);
if ((man & Week.White) == Week.White) // 011 按位与 001,每个位对比,当两边都为1时结果为1,所以结果为 001
{
Console.WriteLine("此人白");
}
else
{
Console.WriteLine("此人黑");
}
Console.ReadKey();
}
}
[System.Flags]
public enum Week
{
White = 1, //001
Rich = 2, //010
Beauty = 4 //100
}
C#允许一个对象可以像数组一样使用下标的方式访问,下标可以是int,也可以是string,使用方法为在类中写一个this属性。索引器又称为带参属性。当被封装的字段是一个数组的时候,可以考虑使用索引器,操作方便且相对安全。
public string this[int index]
{
get
{
string tmp = myList[index];
return tmp;
}
set
{
myList[index] = value;
}
}
// 正常的new,使用下标获取内容
ClassX x = new ClassX();
a[1] = "asdfasdf";
class SampleCollection<T>
{
private T[] arr = new T[100];
public T this[int i]
{
get
{
return arr[i];
}
set
{
arr[i] = value;
}
}
}
// 如何使用这个索引器
class Program
{
static void Main(string[] args)
{
SampleCollection<string> stringCollection = new SampleCollection<string>();
stringCollection[0] = "Hello, World";
System.Console.WriteLine(stringCollection[0]);// Hello, World
}
}
索引器与数组的比较:
索引器与属性的比较:
在 C# 中,结构体是值类型数据结构。它使得一个单一变量可以存储各种数据类型的相关数据。struct 关键字用于创建结构体。
为了定义一个结构体,您必须使用 struct 语句。struct 语句为程序定义了一个带有多个成员的新的数据类型。
例如,您可以按照如下的方式声明 Book 结构:
struct Books
{
public string title;
public string author;
public string subject;
public int book_id;
};
下面的程序演示了结构的用法:
using System;
using System.Text;
struct Books
{
public string title;
public string author;
public string subject;
public int book_id;
};
public class testStructure
{
public static void Main(string[] args)
{
Books Book1; /* 声明 Book1,类型为 Books */
Books Book2; /* 声明 Book2,类型为 Books */
/* book 1 详述 */
Book1.title = "C Programming";
Book1.author = "Nuha Ali";
Book1.subject = "C Programming Tutorial";
Book1.book_id = 6495407;
/* book 2 详述 */
Book2.title = "Telecom Billing";
Book2.author = "Zara Ali";
Book2.subject = "Telecom Billing Tutorial";
Book2.book_id = 6495700;
/* 打印 Book1 信息 */
Console.WriteLine( "Book 1 title : {0}", Book1.title);
Console.WriteLine("Book 1 author : {0}", Book1.author);
Console.WriteLine("Book 1 subject : {0}", Book1.subject);
Console.WriteLine("Book 1 book_id :{0}", Book1.book_id);
/* 打印 Book2 信息 */
Console.WriteLine("Book 2 title : {0}", Book2.title);
Console.WriteLine("Book 2 author : {0}", Book2.author);
Console.WriteLine("Book 2 subject : {0}", Book2.subject);
Console.WriteLine("Book 2 book_id : {0}", Book2.book_id);
Console.ReadKey();
}
}
C# 中的结构有以下特点:
类和结构有以下几个基本的不同点:
在C#中,我们用struct/class来声明一个类型为值类型/引用类型。考虑下面的例子:
SomeType[] oneTypes = new SomeType[100];
如果在Update不停实例化一个类,会发生什么?如果在Update不停实例化一个结构体,会发生什么?
class:
就会不断申请堆内存,导致内存碎片不断增多,频繁触发GC,造成掉帧,发热等问题。
struct:
结构体是值类型,程序离开Update这个方法的时候,栈上为变量所分配的内存空间都会被清除。
using System;
using System.Text;
struct Books
{
private string title;
private string author;
private string subject;
private int book_id;
public void setValues(string t, string a, string s, int id)
{
title = t;
author = a;
subject = s;
book_id =id;
}
public void display()
{
Console.WriteLine("Title : {0}", title);
Console.WriteLine("Author : {0}", author);
Console.WriteLine("Subject : {0}", subject);
Console.WriteLine("Book_id :{0}", book_id);
}
};
public class testStructure
{
public static void Main(string[] args)
{
Books Book1 = new Books(); /* 声明 Book1,类型为 Books */
Books Book2 = new Books(); /* 声明 Book2,类型为 Books */
/* book 1 详述 */
Book1.setValues("C Programming",
"Nuha Ali", "C Programming Tutorial",6495407);
/* book 2 详述 */
Book2.setValues("Telecom Billing",
"Zara Ali", "Telecom Billing Tutorial", 6495700);
/* 打印 Book1 信息 */
Book1.display();
/* 打印 Book2 信息 */
Book2.display();
Console.ReadKey();
}
}
通常情况下,枚举是最常用的,首先它是值类型,不会导致堆溢出,降低了程序运行风险。且枚举多数用于键值对应,在尽量少占用内存的情况下又能够充分解耦,是最值得使用的类型。
其次是同为值类型的结构体,也是可以使用的,但使用场景其实并不算多。
最后是索引器,一般只在类的属性需要声明为数组的时候使用,是否适用于Unity还有待商榷,毕竟涉及到动态类型,IOS端支持情况尚不确定。
以上是个人对于这三种语法的理解,如有不对的地方,欢迎大家给予指正。
本文部分内容引自:
https://www.cnblogs.com/kissdodog/archive/2013/01/16/2863515.html
https://www.cnblogs.com/promise-7/archive/2012/01/12/2320401.html
https://www.cnblogs.com/seanbrucexxl/p/3878760.html
https://www.runoob.com/csharp/csharp-struct.html
https://zhuanlan.zhihu.com/p/358825256
感谢分享~
更多内容请查看总目录【Unity】Unity学习笔记目录整理