小编Sam*_*uel的帖子

C#中的某些内容可以在运行时更改浮点比较行为吗?[64]

我在Windows 7 64位的商业产品中使用我们的测试代码遇到了一个非常奇怪的问题,VS 2012 .net 4.5编译为64位.

以下测试代码在单独项目中执行时表现如预期(使用NUnit测试运行器):

[Test]
public void Test()
{
    float x = 0.0f;
    float y = 0.0f;
    float z = 0.0f;

    if ((x * x + y * y + z * z) < (float.Epsilon))
    {
        return;
    }
    throw new Exception("This is totally bad");
}
Run Code Online (Sandbox Code Playgroud)

测试返回,因为与<float.Epsilon的比较对于x,y和z始终为true,为0.0f.

现在这里是奇怪的部分.当我在商业产品的上下文中运行此代码时,此测试失败.我知道这听起来多么愚蠢,但我得到了异常抛出.我调试了这个问题,当我评估条件时,它总是正确但编译后的可执行文件仍然没有进入条件的真正分支并抛出异常.

在商业产品中,当我的测试用例执行额外的设置代码(专为集成测试而设计)时,这个测试用例只会失败,其中一个非常大的系统被初始化(C#,CLI和一个非常大的C++部分).我无法在这个设置调用中进一步挖掘,因为它几乎可以引导一切.

我不知道C#中会有任何影响评估的内容.

额外的怪异:当我与float.Epsilon的较小或相等比较时:

if ((x * x + y * y + z * z) <= (float.Epsilon)) // this works!
Run Code Online (Sandbox Code Playgroud)

然后测试成功.我试过比较只有less-than和float.Epsilon*10,但这不起作用:

if ((x * x + y * y + …
Run Code Online (Sandbox Code Playgroud)

.net c#

25
推荐指数
1
解决办法
960
查看次数

在TeamCity构建配置中使用/ p每个构建步骤的正确方法是什么?

在TeamCity中,我创建了一个带有两个msbuild构建步骤的构建配置,它应构建一个Solution .sln文件.

我将目标定义为"Build",当我运行构建时,两个步骤显然都执行标准配置,并且两次构建Debug或Release配置.

现在我进入构建步骤设置并找到了CommandLine参数,因为Debug我补充说/p:Configuration=Debug,因为Release我补充说/p:Configuration=Release.

构建此结果会导致TeamCity的警告:

MSBuild command line parameters contain "/property:" or "/p:". It is recommended to define System Property on Build Parameters instead.
Run Code Online (Sandbox Code Playgroud)

虽然已经构建了一个调试版和一个版本.

我用Google搜索了这条消息并创建了两个System Parameters:/p:Configuration=Debug/p:Configuration=Release.如果我现在将我的命令行更改为调试到%system.DebugConfig%和释放到%system.ReleaseConfig%我得到相同的错误.只有这样,我才真正明白,这些系统参数永远不会自动传递给每个构建步骤.

好的,但是如何正确定义两个不同的构建步骤,使用系统参数构建调试和发布,或者没有团队城市抱怨/p在命令行中找到?

msbuild teamcity

14
推荐指数
1
解决办法
4074
查看次数

在单元测试期间无法模拟admin.firestore()

我正在阅读如何为firebase模拟谷歌云功能,并且有正确模拟以下代码的问题:

const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
var db = admin.firestore();
Run Code Online (Sandbox Code Playgroud)

链接中的示例使用以下代码来模拟initializeApp哪些工作正常

admin = require('firebase-admin');
adminInitStub = sinon.stub(admin, 'initializeApp');
Run Code Online (Sandbox Code Playgroud)

现在admin.firestore在firebase-namespace.js中定义如下:

Object.defineProperty(FirebaseNamespace.prototype, "firestore", {
    get: function () {
        var ns = this;
        var fn = function (app) {
            return ns.ensureApp(app).firestore();
        };
        return Object.assign(fn, require('@google-cloud/firestore'));
    },
    enumerable: true,
    configurable: true
});
Run Code Online (Sandbox Code Playgroud)

我已经尝试了各种各样的东西来存根,但我失败了

  1. 结果firestore is not a function:

        Object.defineProperty(admin, "firestore", {
            get: function () {
                return 32;
            }
        });
    
    Run Code Online (Sandbox Code Playgroud)
  2. 根本不模拟firestore()并调用失败的原始函数:

        sinon.stub(admin, 'firestore').returns({get() { }});
    
    Run Code Online (Sandbox Code Playgroud)
  3. TypeError:不能存根不存在的自有属性get

       firestoreStub …
    Run Code Online (Sandbox Code Playgroud)

javascript unit-testing sinon firebase-admin google-cloud-firestore

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

msvcrt是否使用不同的堆进行分配(vs2012/2010/2013)

我已经读过很久以前但是无法在msdn或网络上的任何其他地方找到对crt的更改.

我认为msvcrt已经在VS2012的VC++版本中进行了更改,它不再使用private heapfor分配和使用process heap.

Afaik它针对多个库中分配的内存问题,这些库静态地链接到crt,然后在另一个分配了lib的内存中释放内存.

这是我观点的一个重大变化,我想知道为什么我找不到任何提及它的文件.无论是我还是我做了(我怀疑,因为我前段时间与同事讨论过这个话题)

c++ msvcrt

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

使用 ForEach-Object 而不是 foreach 时语法错误位置不精确

大多数时候,powershell 中的错误报告非常有用。我看到错误,看到起源,但我注意到 ForEach-Object 管道中的任何错误都会丢失其起源行,并且错误堆栈仅指向带有ForEach-Object.

错误位置示例

Set-StrictMode -Version Latest
$ErrorActionPreference = "Stop"

[cultureinfo]::CurrentUICulture = 'en-US'

function Test-Something($val)
{
    # var is not defined here
    Write-Host($undefined_variable)
}

@("a","b") | ForEach-Object{
    $entry = $_

    Test-Something $entry
}
Run Code Online (Sandbox Code Playgroud)

结果是

ForEach-Object : The variable '$undefined_variable' cannot be retrieved because it has not been set.
In D:\dummy.ps1:12 Line:14
+ @("a","b") | ForEach-Object{
+              ~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (undefined_variable:String) [ForEach-Object], RuntimeException
    + FullyQualifiedErrorId : VariableIsUndefined,Microsoft.PowerShell.Commands.ForEachObjectCommand
Run Code Online (Sandbox Code Playgroud)

该线12指向@("a","b") | ForEach-Object{,这显然不是错误位置。

foreach 的更有用的示例 …

error-handling powershell

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

为什么OPENFILENAME lpstrFileTitle是LPSTR而不是LPCSTR?

我正在创建一些文件打开对话框,偶然发现WinAPI中的一些不一致的东西(呵呵).

我完全理解为什么lpstrFileLPSTR作为条路径写入该变量.

很好,但为什么lpstrFileTitleLPCSTR呢?我已经阅读了MSDN上的文档,然后用Google搜索并发现没有令人满意的解释,因为它看起来并没有以任何方式进行修改.

这是兼容性残余还是什么?

传递std :: string时会导致烦人的变通方法,因为我无法使用c_str()和诉诸&str[0].

c++ winapi visual-c++

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

msbuild Directory.build.props 每个项目级联?

执行摘要:我想根据仅在构建管道后期出现的条件来设置属性组中的属性,并且正在寻找一种方法来更早地解决此问题。

\n\n

我有一个相当简单的Directory.build.props文件

\n\n
<Project>\n\n  <PropertyGroup>\n    <MyMode>Default</MyMode>\n  </PropertyGroup>\n\n  <!-- This one overrides the default group above -->\n  <PropertyGroup Condition=" \'$(Configuration)\' == \'Debug\' ">\n    <MyMode>Changed to Debug</MyMode>\n  </PropertyGroup>\n\n  <!-- This one is not applied -->\n  <PropertyGroup Condition=" \'$(TargetFrameworkVersion)\' == \'v4.7.2\' ">\n    <MyMode>Framework</MyMode>\n  </PropertyGroup>\n\n\n  <Target Name="Stats" AfterTargets="Build">\n    <Message Importance="High" Text="::::: Mode set to $(MyMode)" />\n    <Message Importance="High" Text="::::: Target Framework set to $(TargetFrameworkVersion)" />\n  </Target>\n\n</Project>\n
Run Code Online (Sandbox Code Playgroud)\n\n

和一个简单的项目结构

\n\n
E:.\n\xe2\x94\x82   Directory.build.props\n\xe2\x94\x82   MSBuild_Test.sln\n\xe2\x94\x82\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80ConsoleAppNet\n\xe2\x94\x82       App.config\n\xe2\x94\x82       ConsoleAppNet.csproj\n\xe2\x94\x82       Program.cs\n\xe2\x94\x82\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80MSBuild_Test\n        Class1.cs\n        LibStandard.csproj\n\n
Run Code Online (Sandbox Code Playgroud)\n\n

LibStandard是一个 .net …

msbuild

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

为什么继承System.ComponentModel.Component会阻止对象被垃圾回收(根本)

我最初的问题是,在从例如Component继承的类中取消注册自引用事件处理程序是否很重要.他们提供一个Disposed活动,曾经可以去除东西.

但是我正在玩它并意识到一些奇怪的事情:从中导出System.ComponentModel.Component确实会阻止析构函数被调用(即使在应用程序结束时也是如此).

下面是一个显式使用GC.Collect强制收集的示例(仅测试,从不在prod代码中使用它)

using System;
using System.ComponentModel;

namespace CSharpEventHandlerLifetime
{
    public class LongLiving : Component
    {

        public LongLiving()
        {
            Console.WriteLine("Creating object");
            // Disposed += (sender, args) => Console.WriteLine("Disposed");
        }

        ~LongLiving()
        {
            Console.WriteLine("Destructor called");
        }

    }

    class Program
    {
        public static void _create()
        {
            using (var l = new LongLiving())
            {
                Console.WriteLine("Generation is {0}", GC.GetGeneration(l));
            }
        }

        static void Main(string[] args)
        {
            _create();

            GC.Collect(); // this should call dtor of LongLiving


            Console.ReadKey(); // wait before end
        }
    }
} …
Run Code Online (Sandbox Code Playgroud)

c# garbage-collection

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

"Ü"的UTF编码返回3个字节​​而不是"真实"unicode

我正在玩下面提到的代码:https: //stackoverflow.com/a/21575607/2416394因为我在使用TinyXML编写正确的utf8 xml时遇到了问题.

好吧,我需要对"带有DIAERESIS的LATIN CAPITAL LETTER U"进行编码,这Ü要写入XML等.

以下是上述帖子中的代码:

std::string codepage_str = "Ü";
int size = MultiByteToWideChar( CP_ACP, MB_COMPOSITE, codepage_str.c_str(),
                                codepage_str.length(), nullptr, 0 );
std::wstring utf16_str( size, '\0' );
MultiByteToWideChar( CP_ACP, MB_COMPOSITE, codepage_str.c_str(),
                     codepage_str.length(), &utf16_str[ 0 ], size );

int utf8_size = WideCharToMultiByte( CP_UTF8, 0, utf16_str.c_str(),
                                     utf16_str.length(), nullptr, 0,
                                     nullptr, nullptr );
std::string utf8_str( utf8_size, '\0' );
WideCharToMultiByte( CP_UTF8, 0, utf16_str.c_str(),
                     utf16_str.length(), &utf8_str[ 0 ], utf8_size,
                     nullptr, nullptr );
Run Code Online (Sandbox Code Playgroud)

结果是一个std :: string,其大小为3,具有以下字节:

-       utf8_str    "Ü"   std::basic_string<char,std::char_traits<char>,std::allocator<char> …
Run Code Online (Sandbox Code Playgroud)

c++ unicode encoding utf-8

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