C#中静态方法与普通方法的区别、Lambda表达式

文章目录

  • 一、静态方法与普通方法的区别
      • 1.1 静态方法(Static Methods):
      • 1.2普通方法(Instance Methods):
  • 二、实例
  • 三、Lambda表达式
      • 输入参数
      • 表达式或语句块
      • 示例
      • 使用场景
      • 闭包
      • 总结

一、静态方法与普通方法的区别

在C#中,静态方法和普通方法(也称为实例方法)具有几个关键的区别:

1.1 静态方法(Static Methods):

  1. 属于类:静态方法属于类本身,而不是类的实例。这意味着它们可以在没有创建类的实例的情况下调用。
  2. 调用方式:静态方法通过类名直接调用,例如 ClassName.StaticMethodName()
  3. 存储位置:在内存中通常只有一份静态方法的副本,无论你创建了多少个类的实例。
  4. 访问实例成员:静态方法不能直接访问类的实例成员(字段、属性、方法等),因为它们不依赖于任何特定的实例。
  5. 使用场景:当一个方法与类的实例无关时,它应该被声明为静态的。例如,工具方法或数学计算方法通常是静态的,因为它们不依赖于对象的状态。

1.2普通方法(Instance Methods):

  1. 属于实例:普通方法属于类的一个实例,必须在创建类的对象后才能被调用。
  2. 调用方式:普通方法通过类的实例调用,例如 instanceName.InstanceMethodName()
  3. 存储位置:每个类的实例都有自己的普通方法的副本。
  4. 访问实例成员:普通方法可以访问类中的其他实例成员和静态成员。
  5. 使用场景:当一个方法操作或依赖于类的实例状态时,它应该被声明为普通方法。

二、实例

public class MyClass
{
    private static int staticValue = 10;
    private int instanceValue = 5;

    public static void StaticMethod()
    {
        // 静态方法可以访问静态成员
        Console.WriteLine(staticValue);
    }

    public void InstanceMethod()
    {
        // 实例方法可以访问静态成员和实例成员
        Console.WriteLine(staticValue);
        Console.WriteLine(instanceValue);
    }
}

在上面的示例中:

  • StaticMethod是一个静态方法,它可以通过MyClass.StaticMethod()调用,并且只能访问静态成员staticValue
  • InstanceMethod是一个普通方法,它需要一个MyClass的实例来调用,例如:
MyClass myInstance = new MyClass();
myInstance.InstanceMethod();

并且,它可以访问类的实例成员instanceValue和静态成员staticValue

总的来说,静态方法和普通方法的使用取决于它们是否需要访问类的实例状态。如果一个方法不需要访问实例状态,将其声明为静态可以减少内存使用并提高性能。

三、Lambda表达式

Lambda表达式是C#中的一个强大特性,它允许我们定义匿名函数(即没有名称的函数)。Lambda表达式通常用于创建简短的、可以作为参数传递的方法。它们特别适用于编写LINQ查询表达式和处理事件或回调。

Lambda表达式的基本语法如下:

(input-parameters) => expression-or-statement-block

这里的 => 符号被称为 lambda 运算符,可以被读作 “goes to” 或 “转换为”。

输入参数

Lambda表达式可以有零个、一个或多个输入参数:

  • 无参数:() => 表达式/语句块
  • 一个参数:param => 表达式/语句块(对于单个参数,括号是可选的)
  • 多个参数:(param1, param2, ...) => 表达式/语句块

表达式或语句块

Lambda可以是一个表达式,也可以是一个语句块:

  • 表达式:返回表达式的计算结果,不需要return关键字。
    • 例如:x => x * x(返回 x 的平方)
  • 语句块:使用大括号 {} 包围的一系列语句,需要使用return关键字(如果需要返回值)。
    • 例如:(x, y) => { return x == y; }(返回两个参数是否相等的比较结果)

示例

以下是Lambda表达式的一些示例:

// 无参数的Lambda表达式
Action myAction = () => Console.WriteLine("Hello, World!");

// 带有一个参数的Lambda表达式
Func<int, int> square = x => x * x;

// 带有多个参数的Lambda表达式
Func<int, int, bool> areEqual = (x, y) => x == y;

// 带有语句块的Lambda表达式
Func<int, int, int> sum = (x, y) =>
{
    int temp = x + y;
    return temp;
};

使用场景

Lambda表达式最常见的使用场景是作为委托或表达式树的一种简洁的定义方式。例如,在LINQ查询中:

var evenNumbers = numbers.Where(n => n % 2 == 0);

这里,Where 方法接受一个 Func 类型的委托参数,n => n % 2 == 0 就是一个Lambda表达式,它定义了这个委托的实现。

Lambda表达式也常用于事件处理和异步编程中,例如:

button.Click += (sender, args) => MessageBox.Show("Button clicked!");

在这里,我们为按钮的 Click 事件订阅了一个Lambda表达式,当点击按钮时,会显示一个消息框。

闭包

Lambda表达式可以捕获它们所在作用域中的变量,这种特性称为闭包。Lambda表达式对捕获的变量有访问和修改的能力:

int factor = 2;
Func<int, int> multiplier = n => n * factor;
factor = 10;
Console.WriteLine(multiplier(3)); // 输出 30,而不是 6

在上面的例子中,Lambda表达式捕获了变量 factor,即使 factor 的值在后面被改变,该Lambda表达式仍然使用最新的值。

总结

Lambda表达式是C#中一个非常灵活和强大的功能,它简化了委托的使用,使得代码更加简洁易读。通过Lambda表达式,编写LINQ查询和事件处理逻辑变得更加方便快捷。在闭包的帮助下,Lambda表达式可以捕获并操作其定义作用域中的变量。

你可能感兴趣的:(c#,开发语言)