小编mac*_*nir的帖子

C# - 如何确保我的所有结构都已初始化?

我正在用C#编写一个应用程序,它将进行大量计算.一切都围绕着基本的结构 - 价值.它基本上是一些额外的参数(精度等)的两倍.它必须是一个结构,因为将创建太多的它们来提供堆分配.现在,我需要确保它们都已正确初始化.我不能声明默认的显式构造函数,虽然我提供了默认构造函数,它使用0初始化所有内容,这在我的域中没有意义.

并且没有办法拒绝创建一个实例而不用参数调用我的构造函数...?

基本上我需要的是这个测试通过:

[Test]
public void HowDoesThisStructureInitializeByDefault()
{
   Value v = new Value(); - if this did not compile - it would have been ok!

   Assert.AreEqual(0, v.Val); - passes
   Assert.AreEqual(-1, v.Accuracy); - fails
}
Run Code Online (Sandbox Code Playgroud)

如果没有显式调用构造函数并且仍然访问结构,则抛出异常是可以的,但是检查所有时间都需要花费太多时间.

我现在几乎失去了希望,请帮忙!

c# struct value-type

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

我可以阻止C++/CLI将IDisposable添加到我的ref类吗?

IDisposable当您在ref类上实现析构函数时,C++/CLI可以帮助您生成脚手架.此外,如果您没有实现析构函数,但是您的类具有实现的成员变量IDisposable,那么IDisposable将再次在您的类上自动实现.它比IDisposableC#中的处理方式更有帮助,也更好.

我在实现一个保存在msclr::com::ptr(包含RCW的智能指针)的ref类时遇到了这种行为.

ref class Test /* : IDisposable added by the compiler */
{
  msclr::com::ptr<IWhatever> _aComObject;
}
Run Code Online (Sandbox Code Playgroud)

我的特定情况下,我的类引用的COM对象不"锁定"某些非托管资源,它实际上只占用了CLR无法看到的一些非托管内存.因此,我想通过不实现IDisposable类来避免混淆我的ref类的用户.相反,我想通过使用GC API添加适当的内存压力使CLR知道COM对象的存在.

所以,问题是:有没有办法抑制IDisposable一个没有实现析构函数的ref类的实现,但是是否保存了一个IDisposable成员变量?

注意:这通常是错误的,因为它会阻止类的用户确定地处理底层的COM对象,但是考虑到特定的情况,暴露IDisposable有可能混淆我的ref类的用户,因为它真的没有必要处理有问题的ref类.

我想一个选项是在没有析构函数的情况下实现msclr :: com :: ptr的变体.

任何其他方法来抑制IDisposable的自动添加将是值得赞赏的.谢谢.


回答

声明_aComObject为msclr :: com :: ptr(msclr::com::ptr<IWhatever>^)的句柄.然后,编译器不会将其Test视为com ptr对象的"所有者",并且在删除Test时不会将其置为Dispose.

idisposable c++-cli

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

如何跨多个HttpWebRequests"共享"NTLM身份验证?

我的C#app点击使用NTLM身份验证的Web服务器.

我发现每个向服务器发出的请求(使用新的HttpWebRequest)都是单独验证的.换句话说,每个请求都会产生401响应,然后在我获得实际响应之前发生NTLM握手会话.

例如:

第一个GET请求:

-> GET xyz 
<- 401 error (WWW-Authenticate:NTLM)

-> GET xyz (Authorization:NTLM base64stuff)
<- 401 error (WWW-Authenticate:NTLM base64stuff)

-> GET xyz (Authorization: base64stuff)
<- 200
Run Code Online (Sandbox Code Playgroud)

后续要求:

-> GET xyz (Authorization:NTLM base64stuff)
<- 401 error (WWW-Authenticate:NTLM) //can this request be avoided?

-> GET xyz (Authorization: base64stuff)
<- 200
Run Code Online (Sandbox Code Playgroud)

(最初,在PreAuthenticate设置为false的情况下,后续请求看起来像第一个请求 - 即每个'请求'有三个基础请求)

有没有办法通过后续的HttpWebRequests"共享"第一次请求对服务器执行的身份验证?

我想也许该UnsafeAuthenticatedConnectionSharing属性允许我这样做,但是对于应用程序中使用的所有HttpWebRequest对象将其设置为true都没有效果.

但是,如果我设置PreAuthenticate为true,则在第一个请求之后,每个请求会发生少于401的响应.

c# ntlm httpwebrequest networkcredentials

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

如何"声明性地"填充"树"结构

我想定义一个'node'类/结构,然后在代码中声明这些节点的树,这样代码的格式反映了树的结构,并且没有"太多"的样板.

请注意,这不是关于数据结构的问题,而是关于我可以使用C++的哪些功能来获得与下面示例类似的声明性代码样式.

可能使用C++ 0X,这将更容易,因为它在构建对象和集合方面具有更多功能,但我使用的是Visual Studio 2008.

示例树节点类型:

struct node
{ 
  string name;
  node* children;

  node(const char* name, node* children);
  node(const char* name);
};
Run Code Online (Sandbox Code Playgroud)

我想做的事:

声明一棵树,使其结构反映在源代码中

node root =
  node("foo",
  [
    node("child1"),
    node("child2", 
    [
      node("grand_child1"),
      node("grand_child2"),
      node("grand_child3"
    ]),
    node("child3")
  ]);
Run Code Online (Sandbox Code Playgroud)

NB:我不想做的事情:

声明一大堆临时对象/ colls并构造树'向后'

node grandkids[] = node[3] 
{
  node("grand_child1"),
  node("grand_child2"),
  node("grand_child3"
};

node kids[] = node[3]
{
  node("child1"),
  node("child2", grandkids) 
  node("child3")
};

node root = node("foo", kids);
Run Code Online (Sandbox Code Playgroud)

c++ tree visual-studio-2008 data-structures

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

如何取消CancellationToken时运行代码?

给定CancellationToken,我想在取消CancellationToken时对代表异步操作的对象调用'cancel'方法.这可能吗?

背景:我正在通过以下方式(或多或少)与代表异步操作的API进行交互:

class AsyncOp
{
    void Start(Action callback);//returns 'immediately', while beginning an async op. Callback is called when the operation completes.
    void Cancel();//aborts async operation and calls callback
}
Run Code Online (Sandbox Code Playgroud)

我可以Task DoAsyncOp()很容易地将它包装在一个方法中,但我想支持取消,例如Task DoAsyncOp(CancellationToken cancellationToken).在我的情况下,取消CancellationToken时,在AsyncOp对象上调用Cancel.

c# task cancellation-token

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

如何在模板中使用嵌套的typedef?

我想Test从模板化类型派生一个类型Base,我专门研究派生类型(即Base<Test>).

在模板化类型中,我想使用派生类型(模板参数)中定义的typedef.

但是,我收到此编译错误:

error C2039: 'X' : is not a member of 'Test'
Run Code Online (Sandbox Code Playgroud)

这是代码片段:

template <typename T>
class Base
{
protected:
  void func(typename T::X x) {}
};


class Test : public Base<Test>
{
public:
  typedef int X;
};
Run Code Online (Sandbox Code Playgroud)

这是可行的,如果是这样,我需要做什么修复?

(我看到了这类问题的几个答案,但看起来我的方案没有通过前缀typename来修复 - 它是否与从派生类型专用的模板派生有关?)

c++ templates

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

为什么运行我的Java应用程序时proxyHost/proxyPort不起作用?

我有一个与一些REST服务对话的Java应用程序,我想看看使用Fiddler的HTTP流量.

Fiddler充当localhost:8888的代理,因此以下Java VM选项应该配置java以使用此代理:

-Dhttp.proxyHost=localhost -Dhttp.proxyPort=8888
Run Code Online (Sandbox Code Playgroud)

但是,如果我在运行我要调试的java应用程序时传递这些参数,我看不到Fiddler中没有流量.

我编写了一个测试Java应用程序,它只使用HttpURLConnection执行HTTP GET.

如果我在从Eclipse调试它时指定上述命令行参数,我可以在fiddler中查看来自此应用程序的HTTP流量.

http.proxyHost/Port可能不适用于所有Java HTTP操作的原因是什么?

java fiddler

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

是否有任何工具可以重构C++以符合编码标准?

我需要处理一个大的C++代码库,重命名几乎所有东西(类,参数,字段,方法等).你知道有什么工具可以帮助我完成这项工作(除了文本编辑器和咖啡机)吗?

c++ refactoring parsing naming-conventions

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

有没有办法将通过TaskCompletionSource驱动的任务设置为状态'正在运行'?

我正在使用TaskCompletionSource提供和驱动一个实例Task.我希望能够设置Task到状态,Running以指示任务是......'正在运行'但是我无法看到实现此目的的方法TaskCompletionSource.

有没有办法做到这一点?

c# task-parallel-library

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

Visual Studio:如何仅在必要时运行自定义生成步骤

我正在使用“ 自定义构建”步骤将C ++项目的构建DLL(即$(TargetPath))复制到磁盘上的其他位置。

我已将Output“自定义生成步骤”的设置为目标DLL路径,并将其设置Additional Dependencies$(TargetPath)-我要复制的文件,希望VS仅在源DLL比目标DLL更新时才运行该步骤。

但是,每次我构建项目时,VS都会运行自定义的构建步骤-因此似乎无法告诉您不需要执行复制(源DLL $(TargetPath)并未更改)。我必须将步骤配置错误。

哪些设置可以使我获得想要的行为(即,如果VS构建成功并且自定义构建步骤成功,则VS会将其视为最新项目)?

在VS Output窗口中,我看到这一行,这似乎暗示Visual Studio将vcxproj作为触发构建步骤的文件。我希望它使用$(TargetPath)

Input file "MyProject.vcxproj" is newer than output file "c:\custom\build\step\copies\the\dll\here.dll".
Run Code Online (Sandbox Code Playgroud)

(PS:我应该补充,我最初使用的是Post Build Step,但是如果失败,VS会认为该项目已成功构建,并且在第二次构建时不再运行该项目)

msbuild custom-build-step vcproj visual-studio-2012

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