【static 与 lambda表达式 生命周期】

static 生命周期

作用域差异

int a = 0: 如果 a 是在函数内部声明的,那么 a 是一个局部变量,其作用域仅限于该函数内部。
static int a = 0: 如果 a 是在函数内部声明的,那么 a 仍然是一个局部变量,但其作用域被限制在声明它的源文件中,即它对其他源文件不可见。

生命周期变化

int a = 0: 局部变量的生命周期仅限于函数执行期间。每次函数调用时,a 都会被重新初始化为0,函数执行完毕后,a 就会被销毁。
static int a = 0: 静态局部变量的生命周期是整个程序的运行期间。第一次执行到 static int a = 0 时,a 会被初始化为0,之后即使函数执行完毕,a 的值也会被保留,下次函数调用时,a 会保持上次的值。

#include<stdio.h>
 
void example() { 
    int a = 0; // 局部变量 
    a++; 
    printf("a = %d\n", a); 
} 
 
void static_example() { 
    static int a = 0; // 静态局部变量 
    a++; 
    printf("static a = %d\n", a); 
} 
 
int main() { 
    example(); // 输出 a = 1 
    example(); // 输出 a = 1 
 
    static_example(); // 输出 static a = 1 
    static_example(); // 输出 static a = 2 
 
    return 0; 
} 

lambda表达式

int main(){
    int a = 0; //非静态 
    auto pfn = [=]() mutable{ //值捕获
        a++; //实际操作的只是a的一个副本 并非main函数中的a
    };
    pfn();
    std::cout << a << std::endl; // 0 结果不会改变
}

int main() {
    static int a = 0; // 静态局部变量 在函数的调用期间a的值会继续保持
    auto pfn = [=]() mutable { // 值捕获
        a++; 
    };
    pfn(); // 调用 lambda 函数
    std::cout << a << std::endl; // 1

    pfn(); // 调用 lambda 函数
    std::cout << a << std::endl; // 2
}

int main(){
    static int a = 0;
    // [a = a] 表示通过值捕获外部变量a的值并赋给了当前lamada内的a 
    //  Lambda 表达式内部的 a 是外部 a 的一个拷贝
    auto pfn = [a = a]() mutable{ 
        a++; //不会影响外部的a
    };
    pfn();
    std::cout << a << std::endl; // 0
}

//引用捕获会影响到lamada函数的外部
int main(){
    int a = 0;
    // [&] 捕获所有外部变量的引用 mutable关键字表示可以修改被捕获的变量的值
    auto pfn = [&]() mutable{ 
        a++;
    };
    pfn();
    std::cout << a << std::endl; // 1
}

int main(){
    static int a = 0;
    auto pfn = [&]() mutable{ 
        a++;
    };
    pfn();
    std::cout << a << std::endl; // 1
}

int main(){
    static int a = 0;
    // [&a = a] 表示通过引用捕获外部变量a并赋给了当前lamada内的a 
    //  Lambda 表达式内部的 a 是外部 a 的一个引用
    auto pfn = [&a = a]() mutable{ 
        a++; //影响外部的a
    };
    pfn();
    std::cout << a << std::endl; // 1
}
### 如何在 C# 中使用 Lambda 表达式生成随机数 Lambda 表达式本身并不直接提供生成随机数的功能,但它可以作为函数的一部分来实现这一目标。可以通过结合 `Random` 类和 Lambda 表达式完成此操作。 以下是具体示例: #### 示例代码 ```csharp using System; class Program { static void Main() { Func<int> generateRandom = () => new Random().Next(1, 100); // 定义一个无参的 Lambda 表达式[^2] Console.WriteLine($"Generated random number: {generateRandom()}"); // 调用 Lambda 表达式并打印结果 } } ``` 上述代码定义了一个返回整数值的 Lambda 表达式 `generateRandom`,其功能是从范围 `[1, 100)` 内生成一个随机数。这里需要注意的是,每次调用 `new Random()` 可能会因为时间间隔过短而生成相同的种子值,从而导致重复的结果。为了避免这种情况,建议将 `Random` 对象实例化一次,并在整个程序生命周期中重用它。 改进后的版本如下所示: #### 改进版代码 ```csharp using System; class Program { private static readonly Random _random = new Random(); // 创建单例 Random 实例 static void Main() { Func<int> generateRandom = () => _random.Next(1, 100); // 使用已有的 Random 实例[^3] Console.WriteLine($"Generated random number: {generateRandom()}"); } } ``` 在这个改写版本中,`_random` 是一个静态字段,在整个应用程序运行期间只初始化一次。这样能够有效减少因频繁创建新对象而导致的潜在问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值