为什么以下代码打印11次?
int i = 10;
Action fn1 = () => Console.WriteLine(i);
i = 11;
Action fn2 = () => Console.WriteLine(i);
fn1();
fn2();
Run Code Online (Sandbox Code Playgroud)
产出11 11
根据这篇文章中的答案 - 如何告诉lambda函数捕获副本而不是C#中的引用? - 将lambda转换为具有捕获变量副本的类.如果是这样的话我的例子不应该打印10和11吗?
现在,当lambda通过引用捕获时它如何影响捕获的变量的生命周期.例如,假设上面的代码片段在函数中,并且Actions的范围对于变量是全局的,如下所示:
class Test
{
Action _fn1;
Action _fn2;
void setActions()
{
int i = 10;
_fn1 = () => Console.WriteLine(i);
i = 11;
_fn2 = () => Console.WriteLine(i);
}
static void Main()
{
setActions();
_fn1();
_fn2();
}
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,当调用操作时,变量i不会超出范围吗?那么,这些动作是否留下悬挂指针的参考?
我只是想了解字段初始化器.我遇到了错误 - 字段初始值设定项不能使用非静态字段,方法或道具.在寻找答案的同时,我发现了这篇文章.
对帖子来说,大部分投票的答案表明,在调用构造函数之前,"this"不存在.有谁知道为什么会这样?为什么在调用字段初始值设定项之前不能存在'this'?
在我看来,来自C/C++背景,'this'只是堆上分配的一块内存.并且必须存在才能为"this"的任何成员分配值.(因此它绝对存在于字段初始化器之前).
是否有 Windows 命令可以列出持有特定 URL 注册的应用程序的进程 ID 和名称?
我正在寻找在以下 URL 命名空间下注册的应用程序。
http://localhost:55987/
Run Code Online (Sandbox Code Playgroud)
我知道可以使用以下方式列出 URL 预订
netsh http show urlacl
保留意见指出
Reserved URL : http://localhost:55987/
User: \Everyone
Listen: Yes
Delegate: No
SDDL: D:(A;;GX;;;WD)
Run Code Online (Sandbox Code Playgroud)
但是如何找到在保留的 URL 命名空间下进行的注册呢?
decimal l = 50.0M;
Run Code Online (Sandbox Code Playgroud)
我已经看到其他答案表明 M 是明确地将类型声明为十进制 - M 在 C# 十进制文字表示法中代表什么?
然而,当变量的类型被专门说明时,为什么要有个后缀呢?当未指定变量类型时,我可以看到后缀的相关性,例如:
var l = 50.0M
Run Code Online (Sandbox Code Playgroud) 该查询只是将相同的值“ hello”插入表中1000次。
当此查询在显式事务中运行时(在begin tran和中包装),commit tran它会立即运行。但是,如果begin tran & commit tran注释已被注释掉,则大约需要8秒钟才能完成!
谁能解释一下?
查看下面的查询和结果:
显式:
/*------------------------
drop table Test
create table Test (Name varchar(10))
begin tran
set nocount on
declare @i int = 1000
select 'START: ', getdate() -- trick to get row title printed
while (@i > 0)
begin
insert into Test (Name)
select 'hello'
set @i = @i - 1
end
select 'END: ', getdate() -- trick to get row title printed
commit tran
------------------------*/ …Run Code Online (Sandbox Code Playgroud)