目录
C# 结构体(Struct)
定义结构体
C# 结构的特点
类 vs 结构
C# 枚举(Enum)
声明 enum 变量
实例
在 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# 中的结构(Struct)与传统的 C 或 C++ 中的结构有一些显著的不同,下面是结构在 C# 中的特点:
总的来说,C# 中的结构体具有更丰富的功能和行为,允许包含方法、实现接口等特性,同时也有一些与类不同的限制和特点。
类和结构的主要区别包括:
类是引用类型,而结构是值类型。这意味着当你操作类对象时,你实际上操作的是引用,而当你操作结构对象时,你操作的是对象的实际值。
类支持继承和多态,而结构不支持继承。
结构不能声明默认的无参构造函数。这意味着如果你想在创建结构实例时使用无参构造函数,你必须显式地定义一个。
这些区别决定了在不同的情况下应该选择类还是结构。
在选择类(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坐标值
}
}
枚举是一组命名整型常量。枚举类型是使用 enum 关键字声明的。C# 枚举是值类型。换句话说,枚举包含自己的值,且不能继承或传递继承。
声明枚举的一般语法:
enum
{
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 来获取枚举成员的描述值。当我们需要显示枚举成员对应的中文季节名称时,我们可以通过该方法来实现。