1.结构体:
在C#中,结构体(struct)是一种用户定义的值类型,用于封装一组相关的数据字段。与类(class)不同,结构体是值类型,而类是引用类型。这意味着结构体的实例在分配给变量、传递给方法或作为函数参数传递时,会被复制,而类的实例则是通过引用传递的。
C# 结构体(Struct)
1.结构体是值类型数据结构。
2.引用类型派生自 System.Object ,而值类型均隐式派生自 System.ValueType
3.struct 关键字用于创建结构体
4.结构可带有方法、字段、属性、运算符,委托和事件。
5.结构可实现一个或多个接口 但是不能继承其他类
6.结构不支持被其他类继承。
7.结构成员不能指定为virtual 或 protected、
8.结构可以使用 New 创建对象 也可以不使用 ,如果结构中有属性 必须使用new 创建对象
数值类型
类 和 结构的区别:
1. 类和结构实际上都是创建对象的模板, 每个对象都包含数据,并提供了处理和访问数据的方法
2. 类是引用类型 对象存于堆中 可以通过GC管理内存 结构是值类型 对象存于栈中
3 结构不能被继承 也不能继承其他类 但是能继承接口
4. 结构和类 都能使用new 创建对象 但是结构也可以不使用
5. 结构作为方法参数 默认是值传递 类类型默认是引用传递
1.结构体的声明: 结构体使用struct
关键字来声明。以下是一个简单的结构体的示例:
struct Point
{
public int X;
public int Y;
}
在上面的示例中,Point
是一个结构体,具有两个整数字段X和Y。
2.默认构造函数:结构体没有隐式的无参数构造函数。因此,你必须为结构体的字段提供初始值。如果没有提供构造函数,字段将被初始化为默认值(通常是零或null,具体取决于字段的数据类型)。
3.自定义构造函数:你可以为结构体定义自己的构造函数,以便在创建实例时提供初始值。例如:
struct Point
{
public int X;
public int Y;
public Point(int x, int y)
{
X = x;
Y = y;
}
}
4.方法:结构体可以包含方法,允许你在结构体上执行操作。方法可以修改结构体的字段的值。但要注意,当你传递结构体作为参数时,它们是按值传递的,因此方法中对结构体的更改不会影响原始实例。
struct Point
{
public int X;
public int Y;
public Point(int x, int y)
{
X = x;
Y = y;
}
public void Move(int deltaX, int deltaY)
{
X += deltaX;
Y += deltaY;
}
}
5.使用结构体: 你可以像使用其他数据类型一样使用结构体。以下是一些使用结构体的示例:
Point p1 = new Point(10, 20);
Point p2 = p1; // p2是p1的副本,而不是引用
p2.Move(5, 5); // 修改p2,不会影响p1
Console.WriteLine($"p1: X={p1.X}, Y={p1.Y}"); // 输出 p1: X=10, Y=20
Console.WriteLine($"p2: X={p2.X}, Y={p2.Y}"); // 输出 p2: X=15, Y=25
总之,结构体在C#中用于创建轻量级的值类型,通常用于表示简单的数据结构。它们适用于在栈上分配内存,而不是在堆上分配内存,这可以提高性能并减少垃圾回收的压力。结构体适用于小型数据对象,而类更适合复杂对象和需要引用语义的情况。
2.枚举:
在C#中,枚举(Enum)是一种用户定义的数据类型,用于表示一组命名的整数常数。枚举类型允许你定义一组相关的常数值,这些值在代码中具有可读性,而不必记住它们的实际整数值。
枚举是描述一组整数值的结构 使数字更具有具体意义
枚举是值类型
枚举类型使用 enum 关键字声明的
枚举是一组整型常量 默认是从 0开始 也可以自己定义范围
枚举本身可以有修饰符,但枚举的成员始终是公共的,
不能有访问修饰符,枚举本身的修饰符仅能使用public和internal
枚举都是隐式密封的,不允许作为基类派生子类
1.枚举的声明: 枚举使用enum
关键字来声明。
enum DaysOfWeek
{
Sunday,
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday
}
在上面的示例中,DaysOfWeek
是一个枚举类型,包含一组表示每周天的常数。
2.枚举的默认基础类型: 枚举的常数值在内部都是整数,并且它们有一个默认的基础整数类型。默认情况下,它是int
,但你可以显式指定其他整数类型,如byte
、short
、long
等。例如:
enum Status : byte
{
Inactive,
Active,
Suspended
}
3.访问枚举成员: 你可以使用枚举类型的成员来访问枚举的常数值,例如:
DaysOfWeek today = DaysOfWeek.Wednesday;
Console.WriteLine(today); // 输出 Wednesday
4.使用枚举的常数值: 枚举的常数值可以用于条件语句、循环和其他代码中,以增加可读性。例如:
DaysOfWeek today = DaysOfWeek.Friday;
if (today == DaysOfWeek.Saturday || today == DaysOfWeek.Sunday)
{
Console.WriteLine("It's the weekend!");
}
else
{
Console.WriteLine("It's a weekday.");
}
5.获取枚举的整数值: 你可以使用枚举成员的ToInt32
方法来获取枚举的整数值,或者使用类型转换。例如:
int sundayValue = (int)DaysOfWeek.Sunday;
int mondayValue = (int)DaysOfWeek.Monday;
Console.WriteLine(sundayValue); // 输出 0
Console.WriteLine(mondayValue); // 输出 1
6.枚举的位标志枚举: 你还可以创建位标志枚举,允许枚举的常数值组合在一起。这对于表示多个选项的标志非常有用。例如:
[Flags]
enum Permissions
{
None = 0,
Read = 1,
Write = 2,
Delete = 4,
Execute = 8
}
Permissions myPermissions = Permissions.Read | Permissions.Write;
总之,枚举是一种有助于增加代码可读性和维护性的数据类型,特别是在需要表示一组相关的常数值时。它们通常用于代表离散的选项或状态。
3.委托:
在C#中,委托(Delegate)是一种类型,它允许你将方法作为参数传递或将方法引用存储在变量中。委托用于实现回调方法、事件处理和委托方法的动态调用,使代码更加灵活和可扩展。
以下是有关C#委托的一些关键概念和示例:
1.委托的声明: 委托是一个类型,它定义了可以引用的方法的签名。委托声明包括返回类型和参数列表。例如,以下是一个委托声明的示例:
delegate void MyDelegate(int x, int y);
这个委托可以引用接受两个整数参数且返回类型为void
的方法。
2.委托的实例化: 你可以实例化委托并将一个方法绑定到它。这样,委托可以调用该方法。例如:
MyDelegate myDelegate = SomeMethod;
在这里,SomeMethod
是一个方法,它的签名与MyDelegate
的签名匹配。
3.委托的调用: 你可以使用委托来调用绑定的方法,就像调用普通方法一样:
myDelegate(10, 20);
这将调用绑定的方法SomeMethod
,传递参数10和20。
4.多播委托: 委托还支持多播,这意味着你可以将多个方法绑定到同一个委托,它们将按照添加的顺序执行。例如:
myDelegate += AnotherMethod; myDelegate(10, 20);
这将首先调用SomeMethod
,然后调用AnotherMethod
。
5.匿名方法和Lambda表达式: C#还引入了匿名方法和Lambda表达式,它们使委托的使用更加方便。例如,使用Lambda表达式创建委托:
MyDelegate add = (x, y) => Console.WriteLine(x + y); add(10, 20);
6.内置委托: C#还提供了一些内置的通用委托,如Action
和Func
,它们分别用于代表没有返回值的方法和具有返回值的方法。这些通用委托可以用于简化代码。
Action<int, int> printSum = (x, y) => Console.WriteLine(x + y); Func<int, int, int> add = (x, y) => x + y;
委托是C#中非常强大和重要的特性,它们使你可以编写更具扩展性和可维护性的代码,特别是在事件处理、回调机制和动态方法调用方面。