Tag: C#的

buildbot vs hudson / jenkins for C ++持续集成

我目前正在使用jenkins / hudson进行持续集成,主要是C ++项目。 我们有单独的项目为主干和每个分支。 另外,Java代码还有一些相关的项目,但是现在对于这些项目的设置是相当基本的(尽pipe我们可能会做更多的工作)。 C ++项目执行以下操作: build立一切与select是否重新configuration,做一个干净的build设,或使用一个新的结帐 有select地构build并运行所有testing 可以使用Valgrind的memcheck运行所有testing 运行cppcheck 生成doxygen文档 发布报告:unit testing,valgrind,cppcheck,编译器警告,SLOC,开放任务和代码覆盖(使用gcov,gcovr和cobertura插件) 每晚或按需部署代码到testing环境和软件包存储库 一切都可以configuration为自动构build和可选的按需构build。 在下面,有一个bash脚本来控制这个,这更多的取决于我们的构build系统,它使用automake和autoconf以及自定义的bash脚本。 我们开始使用Hudson(当时),因为这是Java人使用的,我们只是想每晚构build。 从那以后,我们增加了更多,并继续增加更多。 在某些方面哈德森是伟大的,但肯定是不理想的。 我已经看过其他的解决scheme,唯一看起来可以替代的是buildbot。 在这种情况下可以改善吗? 自从我们已经使用Hudson以来,投资是否值得? 为什么? 编辑 :有人问为什么我没有find哈德森/jenkins是理想的。 简而言之,一切都可以改善。 我只是想知道,如果jenkins是我用例的最佳解决scheme,或者是否有更好的东西(buildbot?),那么从长远来看,即使有新的需求出现,也会更容易维护。

使用和坚持枚举的最佳实践

我在这里看到了几个关于处理和坚持类枚举值的最好方法的问题/讨论(例如持久化数据适合于枚举 , 如何使用NHibernate持久化枚举 ),以及我想问一下这个概念是什么。 尤其是: 代码中应该如何处理这些值? 他们应该如何坚持到数据库(作为文本/数字)? 什么是不同的解决scheme的权衡? 注意:我把原来包含在这个问题中的解释移到了答案上。

运算符在C#中使用基于接口的编程重载

背景 我在当前项目上使用基于接口的编程,并且在重载操作符(特别是Equality和Inequality操作符)时遇到了问题。 假设 我正在使用C#3.0,.NET 3.5和Visual Studio 2008 更新 – 以下假设是错误的! 要求所有的比较使用Equals而不是运算符==不是一个可行的解决scheme,尤其是当您的types传递到库(如集合)。 我担心需要使用Equals而不是运算符==的原因是,我无法在.NET指南中的任何地方find它会使用Equals而不是运算符==甚至提示它。 但是,在重新读取等式和运算符==的指导原则后,我发现: 默认情况下,运算符==通过确定两个引用是否指示相同的对象来testing引用相等性。 因此,引用types不必为了获得这个function而实现operator ==。 当一个types是不可变的,也就是说,实例中包含的数据是不能改变的,重载operator ==来比较值相等而不是引用相等可以是有用的,因为作为不可变对象,它们可以被认为是长因为它们具有相同的价值。 在非不可变types中重写operator ==不是一个好主意。 和这个Equatable接口 当在Contains,IndexOf,LastIndexOf和Remove等方法中testing相等性时,IEquatable接口被generics集合对象(如Dictionary,List和LinkedList)使用。 应该为可能存储在通用集合中的任何对象执行。 约束上 任何解决scheme都不一定需要将对象从接口转换为具体的types。 问题 当运算符==两端都是一个接口时,底层具体types中的operator ==重载方法签名将不匹配,因此将调用默认的Object operator ==方法。 在类上重载运算符时,二元运算符的至less一个参数必须是包含types,否则会生成编译器错误(错误BC33021 http://msdn.microsoft.com/en-us/library/watt39ff .aspx ) 无法在接口上指定实现 请参阅下面的代码和输出以显示问题。 题 在使用基于接口的编程时,如何为您的类提供正确的操作符重载? 参考 ==运算符(C#参考) 对于预定义的值types,如果操作数的值相等,则相等运算符(==)返回true,否则返回false。 对于string以外的引用types,如果其两个操作数引用同一个对象,则==返回true。 对于stringtypes,==比较string的值。 也可以看看 码 using System; namespace OperatorOverloadsWithInterfaces { public interface IAddress : IEquatable<IAddress> […]

如何从ConcurrentBag <>中删除一个特定的对象?

使用.NET 4中新的ConcurrentBag<T> ,当只有TryTake()和TryPeek()可用时,如何从中删除某个特定的对象? 我想使用TryTake() ,然后只是添加结果对象回到列表中,如果我不想删除它,但我觉得我可能会失去一些东西。 这是正确的方法吗?

为什么我必须写std :: cout而不是std :: <<

为什么我必须在这样的代码行中编写std::cout而不是std::<< : #include <iostream> int main() { std::cout << "Hello, world!"; return 0; } cout来自std库,而不是<<通常用于位移的? 那么,为什么我不必在<<之前写作域操作符::因为它也被用于另一个含义? 编译器如何知道在std::cout , <<意味着另一件事情?

.NET – 什么是实现“捕获所有exception处理程序”的最佳方式

我想知道什么是最好的办法是“如果一切都失败了”。 我的意思是,在应用程序中尽可能多地处理exception,但仍然一定会出现错误,所以我需要有一些能够捕获所有未处理的exception的东西,以便我可以收集信息并将它们存储在数据库中或提交它们到networking服务。 AppDomain.CurrentDomain.UnhandledException事件是否捕获所有内容? 即使应用程序是multithreading的? 附注:Windows Vista公开了原生API函数,允许任何应用程序在崩溃后自行恢复…现在不能想到名称…但我宁愿不使用它,因为许多用户仍在使用Windows XP。

覆盖单个文件的编译标志

我想使用全局标志来编译一个项目,这意味着在我指定的顶层CMakeLists.txt文件中: ADD_DEFINITIONS ( -Wall -Weffc++ -pedantic -std=c++0x ) 但是,对于一个子目录中的特定文件(比如说“foo.cpp”),我希望将编译标志切换为不应用-Weffc ++(包含商业库,我无法更改)。 为了简化这个情况,只使用-Wall,我试过了: SET_SOURCE_FILES_PROPERTIES( foo.cpp PROPERTIES COMPILE_FLAGS -Wall ) ADD_EXECUTABLE( foo foo.cpp ) ,没有工作。 我也试过了 SET_PROPERTY( SOURCE foo.cpp PROPERTY COMPILE_FLAGS -Wall ) ADD_EXECUTABLE( foo foo.cpp ) 和 ADD_EXECUTABLE( foo foo.cpp ) SET_TARGET_PROPERTIES( foo PROPERTIES COMPILE_FLAGS -Wall ) ,其中既没有工作。 最后,我尝试删除这个定义: REMOVE_DEFINITIONS( -Weffc++ ) ADD_EXECUTABLE( foo foo.cpp ) ADD_DEFINITIONS( […]

log4net层次结构和日志级别

这个网站说 logging仪可能被分配级别。 级别是log4net.Core.Level类的实例。 以下级别按优先顺序排列 : 所有 DEBUG 信息 警告 错误 致命 closures DEBUG似乎具有最低的优先级,ERROR较高。 题 如果我设置最小和最大的例子DEBUG和错误,它打印everthing DEBUG,信息,警告和错误。 不使用最小和最大的filter。 如果我指定错误(logging级别=错误)它将包括debugging,信息和警告 <filter type="log4net.Filter.LevelRangeFilter"> <param name="LevelMin" value="ERROR"/> <param name="LevelMax" value="ERROR"/> </filter> 而不是最小和最大的filter。 是否可以configuration一个级别,并包括其下的所有其他级别的日志logging。 示例 – 将级别设置为错误,它将包括DEBUG,INFO,WARN和ERROR。 这可能与log4net? 根据以下其中一条注释发布log4netconfiguration: <?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" /> </configSections > <log4net debug="true"> <appender name="LogFileAppender" type="log4net.Appender.FileAppender"> <layout type="log4net.Layout.XMLLayout" /> –> […]

C#属性和ref参数,为什么不加糖?

我只是遇到了这个错误消息,而在C# 属性或索引器不能作为out或refparameter passing 我知道是什么导致了这一点,做了一个快速的解决scheme,创build一个正确的types的本地variables,调用该函数作为out / ref参数,然后将其分配回属性: RefFn(ref obj.prop); 变成 { var t = obj.prop; RefFn(ref t); obj.prop = t; } 很明显,如果该属性不支持在当前上下文中获取和设置,则会失败。 为什么C#没有为我做这个? 我可以想到这可能会导致问题的唯一情况是: 穿线 例外 对于线程来说,转换会影响到写入的时间(在函数调用之后),但是我更怀疑任何代码都可能会在中断的时候得不到同情。 例外情况是, 如果函数分配给几个参数之一而不是抛出? 任何微不足道的解决scheme都会导致所有参数或者一些参数不被分配给某些应该有的而有些不应该被分配的参数。 我再次认为这不会被支持使用该语言。 注意:我理解为什么会生成此错误消息的机制。 我在寻找的是为什么C#不会自动实现微不足道的解决方法。

正确的使用log4net(logging器命名)

有两种configuration和使用log4net的方法。 首先是我可以configuration我自己的appender和关联的logging器: <!– language: xml –> <appender name="myLogAppender" type="log4net.Appender.RollingFileAppender" > <file value="Logs\myLog.log" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date %level – %message%n" /> </layout> </appender> <logger name="myLog"> <level value="All"></level> <appender-ref ref="myLogAppender" /> </logger> 然后当我想在日志中写一些东西时,我可以做到以下几点: ILog log = LogManager.GetLogger("myLog"); log.Info("message"); 使用它的另一种方法是将rootconfiguration为尽可能详细: <!– language: xml –> <root> <level value="Error" /> <appender-ref ref="myLogAppender" /> </root> 在这种情况下,我可以logging这样的消息: ILog log = LogManager.GetLogger(typeof(Bar)); […]