小编jpo*_*poh的帖子

使用没有手动分配缓冲区的sprintf

在我正在处理的应用程序中,日志记录工具使用sprintf格式化写入文件的文本.所以,像:

char buffer[512];
sprintf(buffer, ... );
Run Code Online (Sandbox Code Playgroud)

当发送的消息对于手动分配的缓冲区而言变得太大时,这有时会导致问题.

有没有办法获得sprintf行为而无需像这样手动分配内存?

编辑:虽然sprintf是一个C操作,我正在寻找C++类型的解决方案(如果有的话!)让我得到这种行为......

c c++ memory string

7
推荐指数
3
解决办法
6453
查看次数

是一种依赖另一种方法的代码味道吗?

我正在重构一个类,以便代码是可测试的(使用NUnit和RhinoMocks作为测试和隔离框架)并且发现我发现自己的方法依赖于另一个(即它取决于由其他方法创建的东西) ).类似于以下内容:

public class Impersonator
{
    private ImpersonationContext _context;

    public void Impersonate()
    {
        ...
        _context = GetContext();
        ...
    }

    public void UndoImpersonation()
    {
        if (_context != null)
            _someDepend.Undo();
    }
}
Run Code Online (Sandbox Code Playgroud)

这意味着要进行测试UndoImpersonation,我需要通过调用来设置它Impersonate(Impersonate已经有几个单元测试来验证它的行为).这对我来说闻起来很糟糕,但从某种意义上说,从调用此类的代码的角度来看它是有道理的:

public void ExerciseClassToTest(Impersonator c)
{
     try
     {
         if (NeedImpersonation())
         {
             c.Impersonate();
         }
         ...
     }
     finally
     {
         c.UndoImpersonation();
     }
}
Run Code Online (Sandbox Code Playgroud)

如果我没有尝试编写单元测试UndoImpersonation并且发现自己必须通过调用其他公共方法来设置测试,我就不会这样做了.那么,这是一种难闻的气味,如果是这样,我该如何解决呢?

c# tdd unit-testing

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

如何对缓存等实现细节进行单元测试

所以我有一个类的方法如下:

public class SomeClass
{
    ...

    private SomeDependency m_dependency;

    public int DoStuff()
    {
        int result = 0;
        ...
        int someValue = m_dependency.GrabValue();
        ...
        return result;
    }  
}
Run Code Online (Sandbox Code Playgroud)

而且我已经决定m_dependency.GrabValue()每次调用而不是每次调用,我真的想要将值缓存在内存中(即在这个类中),因为我们每次都会获得相同的值(依赖关闭并抓取一些数据)从几乎没有变化的表格.

我遇到了问题,但试图在单元测试中描述这种新行为.我尝试了以下(我正在使用NUnit和RhinoMocks):

[Test]
public void CacheThatValue()
{
    var depend = MockRepository.GeneraMock<SomeDependency>();

    depend.Expect(d => d.GrabValue()).Repeat.Once().Return(1);

    var sut = new SomeCLass(depend);
    int result = sut.DoStuff();
    result = sut.DoStuff();
    depend.VerifyAllExpectations();
}
Run Code Online (Sandbox Code Playgroud)

然而,这不起作用; 即使没有对功能进行任何更改,此测试也会通过.我究竟做错了什么?

c# tdd nunit rhino-mocks

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

多个菜单项以粗体显示

我一直在研究以粗体显示菜单项所需的努力 - 无需自己绘制菜单 - 并MFS_DEFAULT在一些谷歌搜索后发现了菜单项状态。MSDN文档提到

MFS_DEFAULT
指定该菜单项是默认菜单项。一个菜单只能包含一个默认菜单项,该菜单项以粗体显示。

我进行了实验,似乎文档相反,我似乎能够使用此标志以粗体显示多个(或可能全部!)菜单项。有谁有这方面的经验,即多个粗体菜单项是否存在任何陷阱?实现我想要实现的目标确实感觉有点麻烦,而且我有点担心未知的副作用(即在一个菜单中有多个“默认”菜单项)。

编辑:我还应该补充一点,本文声称该MFS_DEFAULT标志除了以粗体显示菜单项外什么也不做;尽管如此,我对违反“官方”文档还是有点警惕......

EDIT2:这样做的目的是告诉用户有问题的菜单项(即粗体的菜单项)也可以通过双击有问题的控件来调用(菜单项是上下文菜单的一部分)。当我思考这个问题时,我没有考虑这样一个事实:通常只有一个命令可以与双击事件关联(天啊!)。因此我接受了zaphod的回答(它没有直接回答这个问题,但它确实解决了我的“问题”)

c++ windows menu bold

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

在VB6代码中处理VB.NET事件

我有一些VB6代码实例化一个类来处理从VB.NET组件引发的事件.VB6非常简单:

private m_eventHandler as new Collection

...

public sub InitSomething()
  dim handler as EventHandler

  set handler = new EventHandler
  m_eventHandler.Add handler
  ...
  m_engine.Start

end sub 
Run Code Online (Sandbox Code Playgroud)

请注意,事件处理程序对象必须超出init方法的范围(这就是它存储在Collection中的原因).另请注意,这 m_engine.Start表示程序中VB.NET组件将开始引发事件的点.

实际的事件处理程序(根据要求):

Private WithEvents m_SomeClass As SomeClass
Private m_object as Object
...

Private Sub m_SomeClass_SomeEvent(obj As Variant)
    Set obj = m_object
End Sub
Run Code Online (Sandbox Code Playgroud)

请注意,m_objectEventHandler创建实例时会初始化.

引发事件的VB.NET代码更简单:

Public ReadOnly Property SomeProp() As Object
    Get
        Dim obj As Object
        obj = Nothing
        RaiseEvent SomeEvent(obj)
        SomeProp = obj
    End Get
End Property
Run Code Online (Sandbox Code Playgroud)

我的问题是,当我 …

vb.net vb6 debugging events

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

将许多相似的参数封装到一个结构中是否是一个好习惯

基本上,我有类似以下内容:

public string SomeDBMethod(string server, string dbName, string userName, string password,...)
Run Code Online (Sandbox Code Playgroud)

将其重构为以下内容是否是一种好的做法:

public string SomeDbMethod(DBParams parameters, ...)
Run Code Online (Sandbox Code Playgroud)

其中 DBParams 定义如下:

public struct DBParams
{
  string Server {get;set;}
  string DbName {get;set;}
  string UserName {get;set;}
  string Password {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

我的观点是真正能够传递更少的参数,因为我发现具有长参数列表的函数确实非常难看。

我还发现这种方法有一些限制:如果 SomeDbMethod 要作为 Web 服务方法公开,我不能使用 DBParams 结构作为参数(据我对 Web 服务主题的理解...不是很远)。

那么,这是否太麻烦而没有什么好处,还是我在这里做了一些事情?

c# parameters struct

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

使用RhinoMocks模拟内部类

所以我有一堆内部类,我试图用RhinoMocks模拟.我在assemblyinfo.cs中添加了以下行:

[assembly:InternalsVisibleTo(RhinoMocks.StrongName)]
Run Code Online (Sandbox Code Playgroud)

但是,这仍然不允许我模拟内部类; 我从NUnit收到以下错误消息:

MyTests.SomeTest:System.TypeLoadException:来自程序集'DynamicProxyGenAssembly2,Version = 0.0.0.0,Culture = neutral,PublicKeyToken = null'的类型'SomeType504cf40be6b444abfd417dccf5d6752'上的方法'SomeMethod'正在覆盖从该程序集中看不到的方法.

请注意,我使用的是RhinoMocks的"合并"版本(而不是使用Castle assembly'的下载选项).我不知道Castle是如何合并到RhinoMocks中的,但是不应该让我的内部对RhinoMocks可见,同样让它可以看到Castle(它是Rhino.Mocks.dll的一部分)?

rhino-mocks castle internalsvisibleto

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

如果using语句抛出异常,我如何处置IDisposable对象?

IDataReader如果ExecuteReader抛出异常,我如何确保在下面的代码片段中被丢弃?

using (IDataReader rdr = cmd.ExecuteReader())
{
    // use it
}
Run Code Online (Sandbox Code Playgroud)

我觉得using合成糖不会调用Dispose(因为没有实例可以调用它).但是,我怎样才能确定通常由实现IDisposable的类分配的稀缺资源将被释放?

c# dispose idisposable exception

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

如何禁止在.NET项目中使用COM引用来抑制编译器警告

我们正在使用Windows COM +服务类型库(位于C:\ Windows \ system32 \ COMSVCS.dll)来跟踪使用C#3.0 / .NET 3.5编写的服务的远程计算机上的COM +进程。我遇到的问题是,我从编译器中收到了很多警告,这些警告看起来类似于以下内容:

运行时封送程序无法封送“ IGetAppData.GetApps”的参数之一。因此,此类参数将作为指针传递,并且可能需要使用不安全的代码进行操作。

为上述方法生成的互操作函数签名为:

void IGetAppData.GetApps(out uint nApps, IntPtr aAppData)
Run Code Online (Sandbox Code Playgroud)

由于输出已经在调用代码中被手动编组(即使用Marshall.ReadInt32Marshall.PtrToStructure),有没有办法抑制这些类型的警告?

c# interop marshalling

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

在确定应该定义枚举和结构的位置时,有什么好的做法?

假设嵌套在特定类中enum或者struct不嵌套在特定类中,即它属于项目命名空间,是否应该在以下位置定义:

  • 它自己的文件
  • 调用通用文件Enums.cs或定义属于项目命名空间的Structs.cs所有enums/的文件structs
  • 别的地方...

c#

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

VB6中的动态内存分配

有这样的事吗?

我说的是类似C++ new命令的东西,即内存分配,这需要显式释放内存(或冒险内存泄漏).

我问,因为我记得以前必须通过设置表单/控件/其他对象来解决一些GDI泄漏问题,Nothing但现在不记得是什么或为什么......

在VB6中开发时,我们是否需要担心内存管理?

vb6 memory-management

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

程序终止时LoaderLock错误

我最近将.NET NLog日志记录组件集成到我们的一个应用程序中,这些应用程序纯粹是在非托管代码(在Visual Studio 6中编译的C++和VB6组件)中开发的.我们有一堆C++应用程序通过COM接口与NLog通信.

目前一切正常,但我注意到在程序终止期间弹出以下消息(在输出窗口中调试VS6中的C++组件;如果在IDE中调试NLog,则通过VS 2005调试NLog):

检测到LoaderLock消息:尝试在OS Loader锁定内执行托管执行.不要尝试在DllMain或图像初始化函数中运行托管代码,因为这样做会导致应用程序挂起.

DllMain如下:

extern "C"
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpReserved*/)
{
    if (dwReason == DLL_PROCESS_ATTACH)
    {
        _Module.Init(ObjectMap, hInstance);
        DisableThreadLibraryCalls(hInstance);
    }
    else if (dwReason == DLL_PROCESS_DETACH)
        _Module.Term();
    return TRUE;    // ok
}
Run Code Online (Sandbox Code Playgroud)

我的猜测_Module.Term();现在包括释放一些.NET引用(我在我的一个C++类中保留对NLog对象的引用,以避免每次都必须实例化和释放),这会导致弹出此警告.

我的问题:这可以安全地忽略吗?如果不是,那么什么是好的解决方法?(我能想到的最好的方法是实例化对该NLog对象的引用,并在每次要写入日志文件时释放它...不是最优雅的解决方案)

.net c++ unmanaged loaderlock

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

在.NET中学习WMI的好资源?

我正在寻找有关良好资源的建议,那里有学习WMI.对所有类型感兴趣; 书籍,在线,网络广播等

.net wmi resources

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