2023/11/8——C#——结构体、枚举、委托...

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,但你可以显式指定其他整数类型,如byteshortlong等。例如:

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#还提供了一些内置的通用委托,如ActionFunc,它们分别用于代表没有返回值的方法和具有返回值的方法。这些通用委托可以用于简化代码。

Action<int, int> printSum = (x, y) => Console.WriteLine(x + y); Func<int, int, int> add = (x, y) => x + y;

委托是C#中非常强大和重要的特性,它们使你可以编写更具扩展性和可维护性的代码,特别是在事件处理、回调机制和动态方法调用方面。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值