小编jak*_*sch的帖子

LEA或ADD指令?

当我手写组装时,我通常会选择表格

lea eax, [eax+4]
Run Code Online (Sandbox Code Playgroud)

在表格上..

add eax, 4
Run Code Online (Sandbox Code Playgroud)

我听说lea是一个"0时钟"指令(如NOP),而'add'则不是.但是,当我看到编译器生成的程序集时,我经常看到后一种形式而不是第一种.我足够聪明地相信编译器,所以任何人都可以了解哪一个更好?哪一个更快?为什么编译器选择后一种形式呢?

x86 assembly

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

当你可以在lambda中使用await时,为什么不能在lambda中使用yield?

根据Eric Lippert的说法,匿名迭代器没有被添加到语言中,因为实现它会过于复杂.

这对我来说没关系,在他们继续实施匿名异步方法之前,它并没有打扰我.编译器必须对异步方法执行与迭代器相同的操作(将它们转换为状态机),所以我很困惑为什么匿名迭代器也不允许,当匿名异步方法时.

有人可以对此有所了解吗?

c# iterator yield-return async-await

25
推荐指数
2
解决办法
1252
查看次数

为什么固定大小的缓冲区只能是原始类型?

我们必须与本机代码交互很多,在这种情况下,使用不需要封送的不安全结构会快得多.但是,当结构包含非原始类型的固定大小缓冲区时,我们无法执行此操作.为什么C#编译器要求固定大小的缓冲区只是原始类型?为什么固定大小的缓冲区不能由结构组成,例如:

[StructLayout(LayoutKind.Sequential)]
struct SomeType
{
  int Number1;
  int Number2;
}
Run Code Online (Sandbox Code Playgroud)

c# unsafe

20
推荐指数
2
解决办法
1419
查看次数

异步/等待作为协同程序的替代品

我使用C#迭代器作为协同程序的替代品,它一直很好用.我想切换到async/await,因为我认为语法更清晰,它给了我类型安全. 在这篇(过时的)博客文章中,Jon Skeet展示了实现它的可能方式.

我选择采用略有不同的方式(通过实现我自己SynchronizationContext和使用Task.Yield).这很好.

然后我意识到会有问题; 目前协程不必完成运行.它可以在任何产生的点上优雅地停止.我们可能有这样的代码:

private IEnumerator Sleep(int milliseconds)
{
    Stopwatch timer = Stopwatch.StartNew();
    do
    {
        yield return null;
    }
    while (timer.ElapsedMilliseconds < milliseconds);
}

private IEnumerator CoroutineMain()
{
    try
    {
        // Do something that runs over several frames
        yield return Coroutine.Sleep(5000);
    }
    finally
    {
        Log("Coroutine finished, either after 5 seconds, or because it was stopped");
    }
}
Run Code Online (Sandbox Code Playgroud)

协程通过跟踪堆栈中的所有枚举器来工作.C#编译器生成一个Dispose函数,可以调用该函数以确保正确调用'finally'块CoroutineMain,即使枚举未完成.这样我们就可以优雅地停止协程,并通过调用堆栈Dispose上的所有IEnumerator对象来确保最终调用块.这基本上是手动展开.

当我用async/await编写我的实现时,我意识到我们会失去这个功能,除非我弄错了.然后我查找了其他协同解决方案,看起来Jon Skeet的版本看起来也没有任何处理方式.

我能想到处理这个问题的唯一方法就是拥有我们自己的自定义'Yield'函数,它会检查协程是否被停止,然后引发一个表明这个的异常.这将传播,执行finally块,然后被捕获到根附近的某处.我不觉得这很漂亮,因为第三方代码可能会捕获异常.

我误解了什么,这是否可以更容易地做到?或者我需要以异常方式执行此操作吗?

编辑:已请求更多信息/代码,所以这里有一些.我可以保证这只会在一个线程上运行,所以这里没有涉及线程.我们当前的协程实现看起来有点像这样(这是简化的,但它适用于这个简单的情况):

public sealed …
Run Code Online (Sandbox Code Playgroud)

c# asynchronous coroutine async-await

14
推荐指数
2
解决办法
7022
查看次数

反转已经溢出的乘法运算

鉴于代码:

uint Function(uint value)
{
  return value * 0x123456D;
}
Run Code Online (Sandbox Code Playgroud)

输入值0x300会产生结果0x69D04700.这只是结果的低32位.给定结果0x69D04700和因子0x123456D,是否可以快速检索所有数字(值*0x123456D)和0xFFFFFFFF = 0x69D04700?

编辑:我显示的代码是伪代码 - 我无法扩大返回类型.

c# security math reverse overflow

6
推荐指数
1
解决办法
273
查看次数

检查Windows窗体滚动条是否一直向下滚动?

我有一个富文本框作为日志.当附加新消息时,日志会自动向下滚动,这很好.唯一的问题是当用户想要从之前查看日志中的内容时; 如果添加了新消息,该框会自动向下滚动并阻止用户看到任何内容.我希望能够检查富文本框是否一直向下滚动,如果它不是向下滚动.

目前我可以在虚拟文本空间中获取滚动位置(SendMessage with EM_GETSCROLLPOS).我还可以使用GetScrollBarInfo pinvoke获取滚动条信息.但是我如何弄清楚虚拟文本空间的底部是什么?

谢谢!

.net c# windows winforms

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

每个表单/其他字符串仅使用1个资源文件而不是1个资源文件

我们正在将项目中的表单和字符串本地化并遇到问题; 将Localizable设置为true时,Visual Studio会为每个表单创建一个资源文件.

它只不过是将所有资源文件发送给翻译者的小麻烦,但是有可能让VS使用全局资源文件吗?

谢谢!

c# resources localization

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

Marshal.GetFunctionPointerForDelegate如何在实例成员上工作?

我想知道Marshal.GetFunctionPointerForDelegate.即我想知道它如何将委托转换为非静态函数到函数指针.

它是否动态生成以某种方式附加实例的代码存根?如果是这样,这不是泄密记忆吗?也许代表在终结器中解放了它?

它看起来不像System.Delegate有一个终结器,所以我对这个机制的工作原理非常感兴趣.我假设函数指针需要4个字节,实例需要4个字节(32位),但它返回一个简单的IntPtr.

.net c# clr unsafe marshalling

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

将主干合并到具有本地更改的分支中

我在SVN中有一个分支,我想通过主干的新变化进行更新.我也有一些文件在这个分支中有本地更改.我还不想提交一些这些更改.

如果我尝试将trunk中的更改合并到此分支中,则会给出错误:

Error: Cannot merge into a working copy that has local modifications
Run Code Online (Sandbox Code Playgroud)

有没有办法在服务器上远程将主干合并到分支中,所以我可以在以后正常更新分支?

svn

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

获取非通用任务的结果

有没有办法得到a的结果,Task<T>当它被转发为非泛型Task?我知道这可以用Reflection做,但有没有办法在没有它的情况下做到这一点?也许是通过使用Expression?这是我想要做的一个例子:

RunResult RunTask(Task task)
{
    task.Wait();

    object result = ???;

    if (result is RunResult)
        return (RunResult)result;

    return RunResult.Success;
}
Run Code Online (Sandbox Code Playgroud)

我知道我可以通过具有不同的重载来实现这一点,但我不喜欢行为根据选择的重载而改变.

如果任务没有结果,那么在这种情况下null就可以了.

.net c#

3
推荐指数
1
解决办法
1852
查看次数

使用WinDbg转储STL字符串

我不能再用WinDbg转储STL字符串了 - 我曾经能够使用命令转储STL字符串:dt -r (MSVCP90!string) address或者用于宽字符串dt -r (MSVCP90!wstring) address.不幸的是我不能再这样了 - 我有一个符号路径,当我列出模块时,它显示为MSVCP90加载了符号:

74110000 7419e000 MSVCP90 (pdb symbols) x:\symbols\msvcp90.i386.pdb\A23D796E66BB430B891568A6EF0C750C1\msvcp90.i386.pdb

当我执行命令时,我得到的输出是这样的:

0:025> dt -r (MSVCP90!string)
*************************************************************************
***                                                                   ***
***                                                                   ***
***    Your debugger is not using the correct symbols                 ***
***                                                                   ***
***    In order for this command to work properly, your symbol path   ***
***    must point to .pdb files that have full type information.      ***
***                                                                   ***
***    Certain .pdb files (such as the public OS symbols) …
Run Code Online (Sandbox Code Playgroud)

windbg

2
推荐指数
1
解决办法
5679
查看次数

使用应用于每个元素的操作创建新列表?

我有一个包含元素的列表:

数据= {{1,2},{2,7},{3,14}}

这是X和Y坐标的列表,稍后用于ListPlot.

对于所有Y坐标,我基本上想要做Y = 1/Y,所以新的列表变为:

DataNew = {{1,1/2},{2,1/7},{3,1/14}}

我该怎么办?

wolfram-mathematica

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