在C#中,静态方法和普通方法(也称为实例方法)具有几个关键的区别:
ClassName.StaticMethodName()
。instanceName.InstanceMethodName()
。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表达式是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表达式可以捕获并操作其定义作用域中的变量。