小编Ala*_*inD的帖子

禁用特定函数或代码块的编译器优化(C#)

编译器在优化RELEASE构建方面做得很好,但有时候确保为本地函数关闭优化(但不是通过unticking来关闭整个项目Project Options > Optimize code)会很有用.

在C++中,这是使用以下内容实现的(#pragma通常注释掉):

#pragma optimize( "", off )
// Some code such as a function (but not the whole project)
#pragma optimize( "", on )
Run Code Online (Sandbox Code Playgroud)

C#中有等价物吗?

UPDATE

几个很好的答案建议用这个方法装饰MethodImplOptions.NoOptimization.这是在.NET 3.5中实现的,但不是在Compact Framework(CF)版本中.一个相关的后续问题是,是否相当于:

* projects targeting .NET 3.0 or earlier?
* projects deployed to a device such as Windows CE 6.0 using the .NET 3.5 CF?
Run Code Online (Sandbox Code Playgroud)

.net c# optimization compact-framework compiler-optimization

22
推荐指数
3
解决办法
8037
查看次数

清除 Visual Studio Code 的workspaceStorage 文件夹有什么影响?

我在 Windows 10 上使用 Visual Studio Code 进行大量 C++ 开发。我的开发计算机的硬盘容量有限,并且Low disk space经常出现警告。

经过强大的WinDirStat实用程序分析后,%APPDATA%\Code\User\workspaceStorage发现其中包含数百MB。有几十个随机的 32 字符文件夹(例如“9731bc4ee103e04b5a91aff76967e74b”),每个文件夹都包含.\ms-vscode.cpptools\.BROWSE.VC.DB通常大于 30 MB 的文件。

%APPDATA%\Code\User\workspaceStorage能否在 Windows 启动时使用批处理脚本安全删除这些文件,或者更好的是整个文件夹?

windows visual-studio-code

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

获取一个字符串以引用C#中的另一个

我来自C++背景.之前已经问过这个问题,但试着尽可能找不到答案.比方说我有:

string[] ArrayOfReallyVeryLongStringNames = new string[500];
ArrayOfReallyVeryLongStringNames[439] = "Hello world!";
Run Code Online (Sandbox Code Playgroud)

我可以创建一个引用上面的字符串(这些都不会编译):

string a = ref ArrayOfReallyVeryLongStringNames[439];  // no compile
string a = &ArrayOfReallyVeryLongStringNames[439];     // no compile
Run Code Online (Sandbox Code Playgroud)

我确实理解字符串在C#中是不可变的.我也明白你无法获得托管对象的地址.

我想这样做:

a = "Donkey Kong";  // Now ArrayOfReallyVeryLongStringNames[439] = "Donkey Kong";
Run Code Online (Sandbox Code Playgroud)

我已经阅读了Stack Overflow问题在C#中引用了另一个字符串, 它有一个很好的答案,但问题略有不同.我不想通过引用将此参数传递给函数.我知道如何使用"ref"关键字通过引用传递参数.

如果答案是"您不能在C#中执行此操作",是否有方便的解决方法?

编辑:一些答案表明问题不清楚.让我们以不同的方式问它.假设我需要操纵原始长命名数组中具有主要索引的所有项目.我想在Array ... [2],Array ... [3],Array ... [5]等中添加别名到列表中.然后,使用"for"循环修改列表中的项目(可能通过将刚创建的列表传递给函数).

在C#中,"using"关键字为类或命名空间创建别名.从答案来看,似乎无法为变量创建别名.

c# string

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

Delphi中的一元++运算符

我怀疑答案是否定的,但是有没有相当于C++一元前缀和后缀增量运算符"++".例如.

int test = 1;
SomeFunc(test++);    // test is 1 inside SomeFunc and 2 afterwards
test = 1;
Somefunc(++test);    // test is 2 inside SomeFunc and 2 afterwards
Run Code Online (Sandbox Code Playgroud)

我知道Delphi中的Inc(和Dec)运算符,但是你不能将它传递给函数,如:

test: Integer;
//...
SomeFunc(Inc(test));   // compiler error, incompatible types
Run Code Online (Sandbox Code Playgroud)

除了编译错误之外,似乎没有不同的前缀和后缀增量.写这样的代码不是一个大问题:

SomeFunc(test);
test := (test + 1);
SomeFunc(test);
Run Code Online (Sandbox Code Playgroud)

但是C++中的++(和 - )运算符是一个很棒的特性.

delphi

10
推荐指数
1
解决办法
2000
查看次数

模板代码的智能感知弹出窗口 (Visual Studio 2019)

当您定义模板时,VS 2019 会显示一个带有文本的浮动弹出框<T> Provide sample template arguments for Intellisense。您可以提供类似 的模板类型int,但是有没有办法让这个浮动框消失而不完全关闭智能感知?

例子:

template <typename T> // popup box appears here after a few seconds, see image
struct POINT {
    T x, y;
}
Run Code Online (Sandbox Code Playgroud)

显示弹出框的示例

c++ visual-studio-2019

10
推荐指数
1
解决办法
2022
查看次数

Visual Studio Code 和 Visual Studio(但不是 Git Bash)出现“权限被拒绝”错误

使用运行 Windows 10 的新工作笔记本电脑,我安装了gitVisual Studio CodeVisual Studio 2019. 在对我的个人 git 存储库(托管在 )中的代码进行一些测试更改后github,我尝试提交这些更改并将其推送到远程存储库。

我可以执行 中的所有StageCommitPush操作Git Bash。但在 Git Gui、VS Code 和 VS 2019 中,Stage两者Commit都工作正常,但Push失败并显示错误消息。

对于 VS Code,错误是:

git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.
Run Code Online (Sandbox Code Playgroud)

对于 VS 2019,错误类似:

git@github.com: Permission denied (publickey).
Error encountered while pushing to the remote repository: Git failed with a fatal error.
Could …
Run Code Online (Sandbox Code Playgroud)

git visual-studio-code visual-studio-2019

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

替代睡在线程内

各种答案表明睡在线程中是一个坏主意,例如:避免睡眠.为什么呢?经常给出的一个原因是,如果正在休眠,很难优雅地退出线程(通过发信号通知它终止).

假设我想定期检查网络文件夹中的新文件,可能每10秒检查一次.这对于优先级设置为低(或最低)的线程来说似乎是完美的,因为我不希望可能耗时的文件I/O影响我的主线程.

有哪些替代方案?代码在Delphi中给出,但同样适用于任何多线程应用程序:

procedure TNetFilesThrd.Execute();
begin
    try
        while (not Terminated) do
            begin
            // Check for new files
            // ...

            // Rest a little before spinning around again
            if (not Terminated) then
                Sleep(TenSeconds);
            end;
    finally
        // Terminated (or exception) so free all resources...
    end;
end;
Run Code Online (Sandbox Code Playgroud)

一个小修改可能是:

// Rest a little before spinning around again
nSleepCounter := 0;
while (not Terminated) and (nSleepCounter < 500) do
    begin
    Sleep(TwentyMilliseconds);
    Inc(nSleepCounter);
    end;
Run Code Online (Sandbox Code Playgroud)

但这仍然涉及睡眠......

c# c++ delphi multithreading

7
推荐指数
1
解决办法
695
查看次数

Delphi - 与TButton相比,点击TImage的速度较慢

我有一个包含TImage和TButton控件的表单.我注意到响应OnClick事件的速度对于TImage来说似乎有点慢(快速点击!)所以我测量了它.对于100多次点击(并尽可能快地点击,保持每个控件的速率尽可能一致)我得到了指标:TButton:平均~105-116ms图像:平均~220-235ms

我重复了几次,结果相似.为什么TImage处理点击率大约是TButton的一半?处理从WM_LBUTTON_DOWN到OnClick事件的Windows消息队列会更慢吗?如果它们在前一次点击的N ms之内,它可能正在吞咽Clicks?

TImage的属性似乎没有任何影响这一点的东西.

注意:如果相关,请使用Delphi 7和标准VCL控件.

编辑:这是一些示例代码,演示我如何计时:

// Define variables (in class definition)
m_dwBtnClicks, m_dwImgClicks: DWORD;
m_dwLastBtnClickTicks, m_dwLastImgClickTicks: DWORD;
m_fTotalBtnClicksTicks, m_fTotalImgClicksTicks: Single;

// Initialise variables (in form's OnCreate event)
m_dwBtnClicks := 0;
m_dwImgClicks := 0;

m_dwLastBtnClickTicks := 0;
m_dwLastImgClickTicks := 0;

m_fTotalImgClicksTicks := 0.0;
m_fTotalImgClicksTicks := 0.0;

// OnClick events
procedure TfrmQwerty.btnClick(Sender: TObject);
var
    dwTime: DWORD;
begin
    // TButton click!
    Inc(m_dwBtnClicks);
    dwTime := GetTickCount();
    if (m_dwLastBtnClickTicks > 0) then
        m_fTotalBtnClicksTicks := (m_fTotalBtnClicksTicks + (dwTime - m_dwLastBtnClickTicks));

    m_dwLastBtnClickTicks := dwTime;
end; …
Run Code Online (Sandbox Code Playgroud)

delphi delphi-7

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

比整个结构更快地复制个人成员?

我有一个小结构,并发现复制单个成员要比一次复制结构快得多.有这么好的理由吗?

我的节目:

// Some random structure
private struct PackStats
{
    public int nGoodPacks, nBadPacks, nTotalPacks;
}

// ...
PackStats stats1 = new PackStats();
PackStats stats2 = new PackStats();

// Set some random statistics
stats1.nGoodPacks = 55;
stats1.nBadPacks = 3;
stats1.nTotalPacks = (stats1.nGoodPacks + stats1.nBadPacks);

// Now assign stats2 from stats1

// This single line consumes ~190ns...
stats2 = stats1;

// ...but these three lines consume ~100ns (in total)
stats2.nGoodPacks = stats1.nGoodPacks;
stats2.nBadPacks = stats1.nBadPacks;
stats2.nTotalPacks = stats1.nTotalPacks;
Run Code Online (Sandbox Code Playgroud)

为了测量纳秒范围内的时间,我做了数百万次的分配:

uint uStart …
Run Code Online (Sandbox Code Playgroud)

c#

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

使用const boolean时的编译器警告

我使用以下代码偶然发现了令人惊讶的编译器警告:

private const bool DEFAULT_SETTING = false;
//...
string aString = (DEFAULT_SETTING) ? "1" : "0";
Run Code Online (Sandbox Code Playgroud)

它会生成警告warning CS0429: Unreachable expression code detected.

在最初困惑之后,我意识到编译器没有错,因为值DEFAULT_SETTING是常量而且不能改变.因此,? "1"永远无法到达三元运算符的一部分.但编译器也不完全正确,因为我自己或未来的开发人员可能希望(或需要)在不破坏代码的情况下更改默认值.

有没有更好的方法来使用类似于上面的上下文的默认设置,不会产生警告?

注意:您可能想知道我为什么要转换false"0"...它是保存到设置XML文件.当文件丢失时,软件会自动生成带有默认设置的闪亮的新XML文件.

c#

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