目录
C# 结构体(Struct)
定义结构体
C# 结构的特点
类 vs 结构
C# 枚举(Enum)
声明 enum 变量
实例
C# 结构体(Struct)
定义结构体
在 C# 中,定义结构体使用关键字 struct。下面是一个简单的例子:
public struct Point
{public int X;public int Y;public Point(int x, int y){X = x;Y = y;}
}
在这个例子中,我们定义了一个名为 Point 的结构体,它有两个公共的整型成员变量 X 和 Y。此外,我们还定义了一个带有两个参数的构造函数来初始化 X 和 Y 的值。
在 C# 中,结构体是一种值类型,与类不同,它们是按值进行分配和传递的,而不是按引用。结构体通常用于表示轻量级的数据结构,比如坐标、颜色、矩形等简单的数据类型。
使用结构体可以避免创建对象实例时引发的开销,并且在某些情况下有助于提高性能。在 C# 中,结构体经常用于创建小型不可变的数据结构,以及在需要高性能的场景中使用。
C# 结构的特点
C# 中的结构(Struct)与传统的 C 或 C++ 中的结构有一些显著的不同,下面是结构在 C# 中的特点:
- 包含方法、字段等成员: 结构体可以包含方法、字段、索引器、属性、运算符方法和事件等成员,使得结构体可以拥有丰富的功能和行为。
- 可定义构造函数: 结构体可以定义构造函数来初始化实例,但不能定义析构函数。此外,不能为结构体定义无参构造函数,因为默认的无参构造函数是自动定义的且不可改变的。
- 不支持继承: 与类不同,结构体不能继承其他结构或类,也不能作为其他结构或类的基础结构。
- 可实现接口: 结构体可以实现一个或多个接口,从而获得接口的所有特性和行为。
- 成员限制: 结构体的成员不能指定为 abstract、virtual 或 protected。
- 实例化: 当使用 new 操作符创建一个结构对象时,会调用适当的构造函数来创建结构。与类不同,结构可以不使用 new 操作符即可被实例化。如果不使用 new 操作符,只有在所有的字段都被初始化之后,字段才被赋值,对象才能被使用。
总的来说,C# 中的结构体具有更丰富的功能和行为,允许包含方法、实现接口等特性,同时也有一些与类不同的限制和特点。
类 vs 结构
类和结构的主要区别包括:
-
类是引用类型,而结构是值类型。这意味着当你操作类对象时,你实际上操作的是引用,而当你操作结构对象时,你操作的是对象的实际值。
-
类支持继承和多态,而结构不支持继承。
-
结构不能声明默认的无参构造函数。这意味着如果你想在创建结构实例时使用无参构造函数,你必须显式地定义一个。
这些区别决定了在不同的情况下应该选择类还是结构。
在选择类(class)和结构(struct)时,需要根据具体的需求来进行权衡。
- 当需要表示一个轻量级的数据结构时,结构是一个不错的选择,因为它们可以在栈上分配内存,访问速度较快,而且相对较小的结构也更容易复制。通常情况下,结构适合用于描述简单的数据类型,比如坐标、颜色等。
- 另一方面,类通常用于表示更复杂的对象,这些对象可能有更多的行为和状态,而且通常会被分配到堆上。使用类可以方便地进行引用传递,这意味着对象的引用地址可以被传递,而不是对象的拷贝。这对于需要共享数据或者需要对同一份数据进行修改的情况非常有用。
因此,在选择类还是结构时,需要考虑到数据的复杂性、大小、生命周期以及是否需要进行引用传递等因素。
代码示例
using System;public class Person
{public string Name { get; set; } // 姓名属性public int Age { get; set; } // 年龄属性public void SayHello(){Console.WriteLine("你好,我的名字是 " + Name + ",而我今年 " + Age + " 岁了。"); // 打印问候语}
}public struct Point
{public int X { get; set; } // X 坐标属性public int Y { get; set; } // Y 坐标属性public Point(int x, int y){X = x;Y = y;}
}class Program
{static void Main(){// 使用类的实例Person person = new Person();person.Name = "John"; // 设置姓名person.Age = 25; // 设置年龄person.SayHello(); // 调用方法进行打招呼// 使用结构的实例Point point = new Point(10, 20); // 创建点对象,传入坐标值Console.WriteLine("X 坐标: " + point.X); // 打印X坐标值Console.WriteLine("Y 坐标: " + point.Y); // 打印Y坐标值}
}
C# 枚举(Enum)
枚举是一组命名整型常量。枚举类型是使用 enum 关键字声明的。C# 枚举是值类型。换句话说,枚举包含自己的值,且不能继承或传递继承。
声明 enum 变量
声明枚举的一般语法:
enum <enum_name>
{ enumeration list
};
其中,
- enum_name 指定枚举的类型名称。
- enumeration list 是一个用逗号分隔的标识符列表。
枚举列表中的每个符号代表一个整数值,一个比它前面的符号大的整数值。默认情况下,第一个枚举符号的值是 0.例如:
enum Days { Sun, Mon, tue, Wed, thu, Fri, Sat };
注意:
枚举类型是一种用于定义常量集合的数据类型,适用于那些取值范围有限的数据。枚举类型能够帮助我们固定取值范围,并且易于阅读和使用。
在 C# 中,枚举的默认访问权限修饰符是 internal,枚举名遵循大驼峰命名法,而且枚举的每个值都是整型,默认从 0 开始。此外,枚举中元素的值可以设置为相同,但并不推荐这样做,因为这可能会导致代码可读性下降,增加混淆。
默认情况下,C#中的枚举元素的基础类型是int型。但可以通过指定其他整型类型来修改枚举的基础类型。合法的整型基础类型包括 byte、sbyte、short、ushort、int、uint、long 和 ulong。例如,可以使用以下语法将枚举的基础类型设置为byte:
enum MyEnum : byte
{Value1,Value2,Value3
}
在此示例中,MyEnum 枚举的基础类型被显式设置为 byte。
实例
using System;
using System.ComponentModel;public enum Season
{[Description("春天")]Spring,[Description("夏天")]Summer,[Description("秋天")]Autumn,[Description("冬天")]Winter
}class Program
{static void Main(){Season currentSeason = Season.Winter;string seasonName = GetEnumDescription(currentSeason);Console.WriteLine("当前季节是:" + seasonName);}// 获取枚举成员的描述值static string GetEnumDescription(Enum value){var fieldInfo = value.GetType().GetField(value.ToString());var attributes = (DescriptionAttribute[])fieldInfo.GetCustomAttributes(typeof(DescriptionAttribute), false);return attributes.Length > 0 ? attributes[0].Description : value.ToString();}
}
在这个示例中,我们使用 Description 特性为枚举成员定义了中文名称,并编写了一个辅助方法 GetEnumDescription 来获取枚举成员的描述值。当我们需要显示枚举成员对应的中文季节名称时,我们可以通过该方法来实现。