Tag: C#的

理解C ++ 11中的std :: atomic :: compare_exchange_weak()

bool compare_exchange_weak (T& expected, T val, ..); compare_exchange_weak()是C ++ 11中提供的比较交换原语之一。 即使对象的值等于expected ,它也会返回错误,因此它是弱的 。 这是由于某些平台上伪指令(而不是x86上的指令)被用来实现伪故障 。 在这样的平台上,上下文切换,由另一个线程重新加载相同地址(或caching行)等可能会使原语失败。 这是spurious因为它不是操作失败的对象的价值(不等于expected )。 相反,这是时间问题。 但是让我感到困惑的是C ++ 11标准(ISO / IEC 14882)中所说的, 29.6.5 ..虚假失败的后果是几乎所有弱比较交换的使用都将在一个循环中。 为什么在几乎所有用途中都必须处于循环状态? 这是否意味着当虚假故障导致失败时我们会循环? 如果是这样的话,为什么我们打扰使用compare_exchange_weak()并自己写循环呢? 我们可以使用compare_exchange_strong() ,我认为应该为我们摆脱虚假的失败。 compare_exchange_weak()的常见用例是什么? 另一个问题有关。 Anthony在他的书“C ++ Concurrency In Action”中说: //Because compare_exchange_weak() can fail spuriously, it must typically //be used in a loop: bool expected=false; extern […]

如何使用log4netlogging跟踪消息?

我正在使用log4net将写入日志消息logging到滚动日志文件。 现在我也将所有跟踪消息从System.Diagnostics.Traceredirect到该日志文件。 我如何configuration? 我试图在log4net文档中find任何有关这方面的信息,但没有成功。 有没有可能? 我想这样做的原因是因为我对第三方库的跟踪消息感兴趣。 <log4net> <appender name="R1" type="log4net.Appender.RollingFileAppender"> <file value="C:\Logs\MyService.log" /> <appendToFile value="true" /> <rollingStyle value="Date" /> <maxSizeRollBackups value="10" /> <datePattern value="yyyyMMdd" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] – %message%newline" /> </layout> </appender> </log4net>

cc1plus:错误:无法识别的命令行选项“-std = c ++ 11”与g ++

我正在尝试使用g++和-std=c++11或c++0x标志进行编译。 但是,我得到这个错误 cc1plus: error: unrecognized command line option "-std=c++11" g ++ –version g++ (GCC) 4.1.2 20080704 (Red Hat 4.1.2-54) Copyright (C) 2006 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

容易检查共享库中的未解决的符号?

我正在编写一个相当大的C ++共享对象库,并遇到一个小问题,使debugging变得很痛苦: 如果我在头文件中定义一个函数/方法,而忘记为它创build一个存根(在开发过程中),因为我正在构build一个共享对象库而不是一个可执行文件,所以编译时不会出现错误,告诉我我有忘记执行该function。 我发现错误的唯一方法是在运行时,最终一个链接到这个库的应用程序会因为'未定义的符号'错误而崩溃。 我正在寻找一种简单的方法来检查编译时是否有所需的所有符号,也许我可以将其添加到我的Makefile中。 我提出的一个解决scheme是通过nm -C -U运行编译的库,以获取所有未定义引用的demangled列表。 问题是这也出现在其他库中的所有引用的列表,如GLibC,当最终应用程序放在一起时,这些链接当然会与这个库链接。 有可能使用nm的输出grep通过我所有的头文件,看看是否有任何相应的名称..但这似乎是疯了。 这当然不是一个不常见的问题,有更好的解决办法吗?

AddRange添加到集合

一位同事今天问我如何添加范围到一个集合。 他有一个inheritance自Collection<T> 。 这种types的只读属性已经包含了一些项目。 他希望将另一个集合中的项目添加到属性集合中。 他如何以一种C#3友好的方式来做到这一点? (请注意关于只读属性的约束,这会阻止像联合和重新分配这样的解决scheme。) 当然,与财产的foreach。 添加将工作。 但是一个List<T>风格的AddRange会更加优雅。 写一个扩展方法很简单: public static class CollectionHelpers { public static void AddRange<T>(this ICollection<T> destination, IEnumerable<T> source) { foreach (T item in source) { destination.Add(item); } } } 但是我有一种感觉,我正在重新发明轮子。 我在System.Linq或morelinq中找不到类似的东西。 糟糕的devise? 只是打电话添加? 缺less显而易见的?

String.Format参数为空例外

下面的代码将抛出参数空exception var test = string.Format("{0}", null); 但是,这将返回一个空string string something = null; var test = string.Format("{0}", something); 只是好奇,知道为什么第二块代码不抛出exception。 这是一个错误?

如何正确注销一个事件处理程序

在代码审查中,我偶然发现了这个(简化的)代码片段来取消注册一个事件处理程序: Fire -= new MyDelegate(OnFire); 我以为这不会取消注册事件处理程序,因为它创build了一个以前从未注册过的新代理。 但是searchMSDN我发现了几个使用这个习惯用法的代码示例。 所以我开始了一个实验: internal class Program { public delegate void MyDelegate(string msg); public static event MyDelegate Fire; private static void Main(string[] args) { Fire += new MyDelegate(OnFire); Fire += new MyDelegate(OnFire); Fire("Hello 1"); Fire -= new MyDelegate(OnFire); Fire("Hello 2"); Fire -= new MyDelegate(OnFire); Fire("Hello 3"); } private static void OnFire(string […]

为什么C#编译器允许在IEnumerable <T>和TAlmostAnything之间进行显式转换?

下面的代码给你一个编译器错误,如你所期望的那样: List<Banana> aBunchOfBananas = new List<Banana>(); Banana justOneBanana = (Banana)aBunchOfBananas; 但是,使用IEnumerable<Banana> ,您只会得到一个运行时错误。 IEnumerable<Banana> aBunchOfBananas = new List<Banana>(); Banana justOneBanana = (Banana)aBunchOfBananas; 为什么C#编译器允许这样做?

如何dynamic地为Dapper查询创build参数

我有一个值的字典例如“名字”:“亚历克斯” 有没有办法将这个传递给Dapper作为查询的参数? 这是一个显示我想要做什么的例子。 IDictionary<string, string> args = GetArgsFromSomewhere(); string query = "select * from people where Name = @Name"; var stuff = connection.Query<ExtractionRecord>(query, args);

课后申报括号后的半冒号

提前道歉可能是一个愚蠢的问题,但在C + +类,为什么在分号后的分号? 我经常忘记它,并得到编译器错误,从而失去了时间。 对我来说似乎有点多余,这是不太可能的。 人们是否真的这样做 class MyClass { . . . } MyInstance; 编辑:我从C兼容的angular度来看它的结构和枚举,但由于类不是C语言的一部分,我猜它主要是在类似的声明结构之间保持一致。 我一直在寻找更多的devise原理,而不是能够改变任何东西,尽pipe一个好的代码完成IDE可能会在编译之前对其进行修改。