Tag: C#的

你应该实现IDisposable.Dispose(),使它永远不会抛出?

对于C ++(析构函数)中的等价机制,build议是通常不应抛出任何exception 。 这主要是因为这样做,你可能会终止你的过程,这只是一个很好的策略。 在.NET中的等效scheme… 抛出第一个exception 作为第一个exception的结果,finally块被执行 finally块调用一个Dispose()方法 Dispose()方法会抛出第二个exception …你的过程不会立即终止。 但是,您将失去信息,因为.NET不会将第一个exceptionreplace为第二个exception。 因此调用堆栈上的catch块将永远不会看到第一个exception。 但是,人们通常对第一个例外更感兴趣,因为这通常会给出更好的线索,说明为什么事情会出错。 由于.NET缺乏一种机制来检测是否正在执行代码,而exception处于挂起状态,所以IDisposable可以实现的实际上只有两种select: 始终吞下Dispose()中发生的所有exception。 不好,因为你最终可能会吞下OutOfMemoryException,ExecutionEngineException等,我通常宁愿让它们在没有另一个exception已经挂起的情况下拆除进程。 让所有exception传播出Dispose()。 不好,因为您可能会失去有关问题根源的信息,请参阅上文。 那么,这两个邪恶中的哪一个呢? 有没有更好的办法? 编辑 :澄清,我不是主动抛出exception从Dispose()或不,我正在谈论让由Dispose()调用的方法抛出的exception传播出来的Dispose()或不,例如: using System; using System.Net.Sockets; public sealed class NntpClient : IDisposable { private TcpClient tcpClient; public NntpClient(string hostname, int port) { this.tcpClient = new TcpClient(hostname, port); } public void Dispose() { // Should we […]

在switch语句中继续使用

我想从switch语句的中间跳转到以下代码中的循环语句: while (something = get_something()) { switch (something) { case A: case B: break; default: // get another something and try again continue; } // do something for a handled something do_something(); } 这是continue使用的有效方法吗? switch语句忽略了continue语句吗? C和C ++在这里的行为有所不同吗?

如何编码单声道守护进程?

我正在尝试为Linux编写一个Mono C#守护进程。 我想在完成处理时做一个启动和停止操作,而不是仅仅杀死进程。 有没有人有这样的例子? 编辑:我想出了如何在debian中使用start-stop-daemon –background,所以我想我现在就使用它。 编辑:我在java中实现这一点,他们有这个不错的addShutdownHook捕获终止应用程序。 我需要多花一点时间来整理单声道服务的依赖关系,或者find一种方法来捕获应用程序终止。 有SessionEnd事件,但那只适用于服务而不是控制台应用程序 答: 使用mono-service在Linux上打包一个windows服务

乘法比浮点除法更快吗?

在C / C ++中,可以设置以下代码: double a, b, c; … c = (a + b) / 2; 这完全一样的事情: c = (a + b) * 0.5; 我想知道哪个更好用。 一个操作比另一个操作更快吗?

如何创buildtypes安全的枚举?

在C中使用枚举来实现types安全是有问题的,因为它们实质上只是整数。 枚举常量实际上被定义为由标准的inttypes。 为了达到某种types的安全性,我使用这样的指针做技巧: typedef enum { BLUE, RED } color_t; void color_assign (color_t* var, color_t val) { *var = val; } 因为指针比值更严格的types规则,所以这可以防止这样的代码: int x; color_assign(&x, BLUE); // compiler error 但是这并不妨碍这样的代码: color_t color; color_assign(&color, 123); // garbage value 这是因为枚举常量本质上只是一个int并可以隐式地分配给一个枚举variables。 有没有办法写这样一个函数或macroscolor_assign ,甚至可以实现完整的types安全枚举常量?

Lambda作为函数参数

声明一个lambdavariables或函数参数,而不使用auto或模板的符号是什么? 有没有办法做到这一点? 或者编译器在编译之前为程序员未知的每个lambda定义一个唯一的类对象? 如果是这样,为什么? 他们不能只是作为某种函数指针传递? 如果这是不可能的,这将是一个主要的失望。

如何最小化索引属性

我试图嘲笑一个索引属性的调用。 即我想moq以下内容: object result = myDictionaryCollection["SomeKeyValue"]; 也是制定者的价值 myDictionaryCollection["SomeKeyValue"] = myNewValue; 我这样做是因为我需要模拟我的应用程序使用的类的function。 有谁知道如何用最小起订量做到这一点? 我已经尝试了以下变体: Dictionary<string, object> MyContainer = new Dictionary<string, object>(); mock.ExpectGet<object>( p => p[It.IsAny<string>()]).Returns(MyContainer[(string s)]); 但是这不能编译。 我试图用最小起订量来实现,有没有人有我可以做到这一点的任何例子?

Valgrind尽pipe使用-g标志(在Ubuntu 11.10 / VirtualBox上)仍然没有显示行号,

我正在关注“学习艰苦之路”,特别是关于Valgrind的一章 。 本章给你一个故意错误的程序来展示Valgrind如何工作。 当我在Valgrind下运行练习时,我的堆栈跟踪中没有find行号,只是错误的“(main)”。 我肯定用-g标志编译。 我的Valgrind输出如下: djb@twin:~/projects/Learning/C$ valgrind ./ex4 ==5190== Memcheck, a memory error detector ==5190== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al. ==5190== Using Valgrind-3.6.1-Debian and LibVEX; rerun with -h for copyright info ==5190== Command: ./ex4 ==5190== ==5190== Use of uninitialised value of size 4 ==5190== at 0x4078B2B: _itoa_word (_itoa.c:195) […]

C中setjmp和longjmp的实际用法

任何人都可以解释我在哪里可以在embedded式编程中使用setjmp()和longjmp()函数? 我知道这些是为了处理错误。 但是我想知道一些用例。

在'auto f(params) – > decltype(…,void())'中的'void()'是做什么的?

我在这里find的代码看起来像这样: auto f(T& t, size_t n) -> decltype(t.reserve(n), void()) { .. } 在我读的所有文档中,我被告知decltype被签名为: decltype( entity ) 要么 decltype( expression ) 而且在任何地方都没有第二个论点。 至less这是cppreference指向的内容。 这是decltype的第二个参数吗? 如果是这样,它是做什么的?