相关疑难解决方法(0)

为什么编译错误"使用未分配的局部变量"?

我的代码如下

int tmpCnt;  
if (name == "Dude")  
   tmpCnt++;  
Run Code Online (Sandbox Code Playgroud)

为什么会出错Use of unassigned local variable tmpCnt?我知道我没有明确初始化它,但由于默认值表,0无论如何都会初始化值类型.该参考文献也提醒我:

请记住,不允许在C#中使用未初始化的变量.

但是,如果它已经默认完成,为什么我必须明确地这样做?如果我不必这样做,它会不会获得性能?就是想...

.net c#

62
推荐指数
3
解决办法
21万
查看次数

闭包如何在幕后工作?(C#)

我觉得我对闭包有很好的理解,如何使用它们,以及它们什么时候有用.但我不明白的是他们实际上是如何在幕后的幕后工作的.一些示例代码:

public Action Counter()
{
    int count = 0;
    Action counter = () =>
    {
        count++;
    };

    return counter;
}
Run Code Online (Sandbox Code Playgroud)

通常,如果闭包没有捕获{count},它的生命周期将被限定为Counter()方法,并且在它完成之后它将消除Counter()的其余堆栈分配.什么时候关闭会发生什么?这个Counter()调用的整个堆栈分配是否存在?它会将{count}复制到堆中吗?它是否从未真正在堆栈上分配,但被编译器识别为关闭,因此总是存在于堆上?

对于这个特殊的问题,我主要关注它在C#中是如何工作的,但是不反对与支持闭包的其他语言进行比较.

.net c# closures

45
推荐指数
2
解决办法
3415
查看次数

C#未初始化的变量是危险的吗?

我熟悉C#规范,第5.3节,它说在使用之前必须分配一个变量.

在C和非托管C++中,这是有道理的,因为堆栈没有被清除,并且用于指针的内存位置可能在任何地方(导致难以追踪错误).

但我的印象是运行时不允许真正的"未分配"值.特别是未初始化的引用类型将始终具有空值,而不是先前调用方法或随机值所遗留的值.

这是正确的,还是我错误地假设这些年来检查null是否足够?你可以在C#中使用非真实的变量,或者CLR是否会处理这个变量并且总是设置了一些值.

c# clr

36
推荐指数
3
解决办法
5081
查看次数

标签 统计

c# ×3

.net ×2

closures ×1

clr ×1