小编Tri*_*nko的帖子

有人可以解释这几行MSIL吗?

有人可以解释这几行MSIL吗?为什么它会将评估堆栈中的值移动到局部变量,只是立即将其移回并返回?

下面的MSIL代码加载一个参数(一个字符串),调用一个返回bool的方法,然后返回该bool值.我不明白为什么它调用stloc.0将方法的返回值存储在局部变量中,然后执行显式的无条件控制传输到下一个标记的行(似乎没必要),只是将值右移回到返回之前的评估堆栈.

.maxstack 1
.locals init ([0] bool CS$1$0000)
L_0000: nop
L_0001: ldarg.0
L_0002: call bool FuncNameNotImporant::MethodNameNotImporant(string)
L_0007: stloc.0 
L_0008: br.s L_000a
L_000a: ldloc.0 
L_000b: ret 
Run Code Online (Sandbox Code Playgroud)

我最好猜测它为什么这样做是为了确保评估堆栈上的值在返回之前实际上是一个布尔值.但我对明确跳到下一行是无能为力的; 我的意思是,不管怎样它不会去那里?该方法的C#源代码只有一行,它返回方法的结果.

stack branch cil local-variables typechecking

5
推荐指数
1
解决办法
1059
查看次数

内部与另一个表连接时如何保留临时表行的顺序?

SQL Server"join"是否一致地保留任何类型的行顺序(即左表或右表的行)?

伪代码:

create table #p (personid bigint);
foreach (id in personid_list)
    insert into #p (personid) values (id)
select id from users inner join #p on users.personid = #p.id
Run Code Online (Sandbox Code Playgroud)

假设我有一个与人员条目相对应的ID列表.这些ID中的每一个可以对应于零个或多个用户帐户(因为每个人可以具有多个帐户).

要从users表中快速选择列,我使用person ids填充临时表,然后将其与users表内连接.

我正在寻找一种有效的方法来确保连接中结果的顺序与id插入临时表时的顺序相匹配,这样返回的用户列表与人员列表的顺序相同因为它进入了.

我考虑过以下替代方案:

  1. 使用"#p inner join users",以防保留左表的顺序
  2. 使用"#p left join users where id is not null",以防左连接保留顺序而内连接不保留
  3. 使用"create table(rownum int,personid bigint)",插入一个递增的行号作为临时表,因此结果可以通过rownum在连接中排序
  4. 使用与DB2中提供的"按顺序排序[tablename]"子句相同的SQL Server

我目前正在使用选项3,它可以工作......但我讨厌使用order by子句来处理已经订购的东西.我只是不知道临时表是否保留了插入行的顺序或连接的操作方式以及结果的输出顺序.

编辑:

假设我使用选项3,那么有一个要订购的字段...是否有任何形式的连接将帮助SQL Server在维护订单方面做最少量的工作.我的意思是,它是否足够智能,例如,查看order by子句中的哪些表的字段,并在进行连接时首先处理该表,以便结果集的顺序大致或完全与该表的顺序一致,只是万一它已经按照预期的顺序?

join sql-server-2008

5
推荐指数
1
解决办法
3353
查看次数

对于 .NET DateTime 类型,为什么推断的数据库类型是 SqlDbTypes.DateTime 而不是 SqlDbTypes.DateTime2?

对于 .NET DateTime 类型,为什么推断的数据库类型是 SqlDbTypes.DateTime 而不是 SqlDbTypes.DateTime2?(见http://msdn.microsoft.com/en-us/library/yy6y35y8.aspx

背景

通过默认为不太精确的 SQL DateTime 类型,.NET 框架保证,默认情况下,您通过具有未指定 SqlDbType 的 SqlParameter 对象传递的任何 .NET DateTime 值肯定会因精度降低损坏。这是一个糟糕的设计决定,IMO,考虑到仅仅保留全部价值不会有更糟糕的后果。

例如,我不能使用 SqlParameterCollection.AddWithValue 方法,因为在传递 DateTime 值时,该值会被截断为范围非常有限的 SQL DateTime 值。结果是:

  • .NET DateTime 值超出 SQL DateTime 值的允许范围,并且发生错误,或
  • 截断的值不会匹配数据库中更精确的值,并且不会正确匹配更新操作的记录,更糟糕的是,IMO,因为它很微妙并且不会产生错误。

由于 .NET DateTime 在精度和范围上最接近于 SQL Server 2008 数据类型“datetime2(7)”,为什么框架将 SqlParameter 值转换为 SQL DateTime,以及有什么方法可以更改默认行为所以我仍然可以使用类型推断功能吗?

我能看到的唯一建议是该功能已损坏,我应该始终明确指定数据类型,这将需要大量代码更改。我想如果框架只是保留 .NET DateTime 值的原始值,问题会更少。如果数据库字段类型恰好是不太精确的 SQL DateTime 类型,那么传递给查询的日期/时间字符串值将被数据库引擎截断。如果超出范围,您将如预期的那样收到错误消息。更重要的是,如果数据库字段类型是datetime2,那么一切都会顺利进行,记录也会正确匹配。

.net datetime type-inference datetime2 sql-server-2008

5
推荐指数
1
解决办法
1313
查看次数

如何避免进程终止通知和标准输出重定向事件之间的竞争条件?

以非常受控制的方式,我ProcessJobManager将作业排队,一次处理多达X个并发进程.

在开始每个进程之后,我将它添加到a List<ActiveProcessJob>并通过构造a 并将其属性分配给WaitHandleActiveProcessJobCompleteEvent属性来存储进程.new ManualResetEvent( false )SafeWaitHandlenew SafeWaitHandle( my_process.Handle, false )

我通过以下代码等待进程完成(以及任何'new_jobs_queued'):

WaitHandle[] wait_handles =
    active_jobs
    .Select<ActiveProcessJob,WaitHandle>( j => j.CompleteEvent )
    .Union( new WaitHandle[]{ new_jobs_queued} ).ToArray();
WaitHandle.WaitAny( wait_handles );
Run Code Online (Sandbox Code Playgroud)

这可以正确检测一个或多个进程(或添加到队列中的项目)的终止; 但是,我还重定向标准输出流并调用Process.BeginOutputReadLine以确保Process.OutputDataReceived触发事件.

问题是经常检测和处理进程终止(active_jobs在事件的事件处理程序Process.OutputDataReceived最后一次触发之前将其从列表中删除.在这种情况下,处理程序无法引用进程,因为它已被删除从队列中.

我几乎需要知道一个进程何时"即将退出",因为否则我不知道何时期望最后一个OutputDataReceived事件,它显然在我的WaitAny调用的一个单独的线程上运行,等待进程终止.

也许保证在最后一个Process.OutputDataReceived事件之后和Process.HasExited方法返回true之前调用Process.Exit?我需要这样的确定性.

.net stdout race-condition io-redirection

5
推荐指数
1
解决办法
1082
查看次数

在变基和挤压时,"作者"如何确定git提交?

我重新安排了一个有2个提交的同事分支,并将第二个提交压缩到第一个提交.它保留了原作者(即不是我).

假设我想修复一行代码,所以我反转一个大块并进行新的提交.

在这一点上,我回到了我开始的地方,有两个我想要挤在一起的提交,并希望保留原作者.但是,在早先的情况下,两个提交都有相同的作者.在后一种情况下,被压扁的提交有不同的作者.哪位作者将git分配给新的重新定位/压缩提交?

git author rebase squash

5
推荐指数
1
解决办法
183
查看次数

为什么C#编译器不认为这种泛型类型推断是不明确的?

鉴于以下课程:

public static class EnumHelper
{
    //Overload 1
    public static List<string> GetStrings<TEnum>(TEnum value)
    {
        return EnumHelper<TEnum>.GetStrings(value);
    }

    //Overload 2
    public static List<string> GetStrings<TEnum>(IEnumerable<TEnum> value)
    {
        return EnumHelper<TEnum>.GetStrings(value);
    }
}
Run Code Online (Sandbox Code Playgroud)

选择两种通用方法之一应用哪些规则?例如,在以下代码中:

List<MyEnum> list;
EnumHelper.GetStrings(list);
Run Code Online (Sandbox Code Playgroud)

它最终调用EnumHelper.GetStrings<List<MyEnum>>(List<MyEnum>)(即Overload 1),即使它看起来同样有效EnumHelper.GetStrings<MyEnum>(IEnumerable<MyEnum>)(即Overload 2).

例如,如果我完全删除了重载1,那么调用仍然编译正常,而是选择标记为重载2的方法.这似乎使通用类型推断有点危险,因为它调用的方法直观地看起来像是更糟糕的匹配.我将List/Enumerable作为类型传递,这似乎非常具体,看起来它应该与具有类似参数的方法匹配(IEnumerable<TEnum>),但是它选择具有更通用的泛型参数的方法(TEnum value).

c# generics type-inference generic-type-argument

5
推荐指数
1
解决办法
99
查看次数

我可以克隆一个IQueryable以便在另一个DbContext的DbSet上运行吗?

假设我已经通过许多步骤中的一些条件逻辑构建了一个IQueryable<T>我们称为的实例query

我想获取总记录数和一页数据,因此我想致电query.CountAsync()query.Skip(0).Take(10).ToListAsync()。我不能连续调用它们,因为发生竞争情况时,它们都试图同时DbContext在同一时间运行查询。这是不允许的:

“在先前的异步操作完成之前,第二个操作在此上下文上开始。使用'await'确保在此上下文上调用另一个方法之前所有异步操作都已完成。不保证任何实例成员都是线程安全的。”

我不想在开始第二个之前就先“等待”。我想尽快取消这两个查询。唯一的方法是从单独的DbContext运行它们。我可能不得不从的不同实例开始并排构建整个查询(或2或3),这似乎很荒谬DbSet。是否有任何方法可以克隆或更改IQueryable<T>(不一定是该接口,但它是基础实现),这样我可以有一个副本在DbContext“ A” 上运行,而另一个副本可以在DbContext“ B” 上运行,以便两个查询都可以同时执行?我只是想避免从头开始将查询X重组一次,仅在X上下文上运行它。

c# async-await dbcontext entity-framework-6

5
推荐指数
2
解决办法
300
查看次数

在 Windows dockerfile 中,如何将 ARG 值传递给 RUN 命令?

我找不到任何有效的语法。即使 stackoverflow 上建议的解决方案也不起作用。运行它们会在预期值处显示空白输出。

ENV 变量不会保留在构建的映像中(即,从正在运行的容器中的命令行运行“set”显示该变量未设置)。

ARG 和 ENV 值似乎都无法在发送到 powershell 的 RUN 命令中访问。

“testdockerfile”的内容:

ARG TEST_ARG=value_to_insert_in_debug_txt_file

FROM mcr.microsoft.com/dotnet/framework/aspnet:4.7.2-windowsservercore-ltsc2016

ENV MyEnvVar ${TEST_ARG}
ENV MyEnvVar2 $TEST_ARG
ENV MyEnvVar3 TEST_ARG

SHELL ["powershell","-Command"]

RUN "\"baseline\" | Out-File c:\debug.txt"

RUN "\"%TEST_ARG%\" | Out-File c:\debug1.txt"
RUN "\"$TEST_ARG\" | Out-File c:\debug2.txt"
RUN "\"${TEST_ARG}\" | Out-File c:\debug3.txt"
RUN "\"${Env:TEST_ARG}\" | Out-File c:\debug4.txt"

RUN "\"%MyEnvVar%\" | Out-File c:\debug5.txt"
RUN "\"$MyEnvVar\" | Out-File c:\debug6.txt"
RUN "\"${MyEnvVar}\" | Out-File c:\debug7.txt"
RUN "\"${Env:MyEnvVar}\" | Out-File c:\debug8.txt"
RUN "\"$Env:MyEnvVar\" | Out-File c:\debug9.txt"

RUN …
Run Code Online (Sandbox Code Playgroud)

windows environment-variables args docker

5
推荐指数
1
解决办法
1380
查看次数

为什么在 JavaScript 中,'3 instanceof Number' == false,但 '3..method()' 会调用 Number.prototype.method?

鉴于文字数字不是严格意义上的 实例Number,为什么我可以在相应的文字对象上调用Number(or String, or Boolean) 对象的原型方法?这是跨浏览器的标准行为吗?

发生这种情况时究竟发生了什么?我怀疑它在调用方法之前将文字强制转换为相应的类型,因为当我检查typeof this方法时,它返回'object'而不是'number'.

javascript type-coercion

4
推荐指数
1
解决办法
1363
查看次数

如何在调试时(或停止调试时)运行Application_End?

我想在停止调试或停止IIS Express网站时优雅地处理应用程序关闭,但我似乎无法运行Application_End.

application-end visual-studio-debugging iis-express visual-studio-2013

3
推荐指数
2
解决办法
777
查看次数