Tag: C#的

性能:从generics派生的types

我遇到了一个我不能理解的性能问题。 我知道如何解决,但我不明白为什么会发生。 这只是为了好玩! 让我们来谈谈代码。 我尽可能简化代码来重现问题。 假设我们有一个generics类。 它里面有一个空的列表,在构造函数中用T做一些事情。 它有Run方法调用列表上的IEnumerable<T>方法,例如Any() 。 public class BaseClass<T> { private List<T> _list = new List<T>(); public BaseClass() { Enumerable.Empty<T>(); // or Enumerable.Repeat(new T(), 10); // or even new T(); // or foreach (var item in _list) {} } public void Run() { for (var i = 0; i < 8000000; i++) […]

应该将C ++ 11中的所有/大多数setter函数写成接受通用引用的函数模板吗?

考虑一个具有N成员variables的类X ,每个variables都是可 复制的和可移动的 ,以及N相应的设置函数。 在C ++ 98中, X的定义可能如下所示: class X { public: void set_a(A const& a) { _a = a; } void set_b(B const& b) { _b = b; } … private: A _a; B _b; … }; 上面的类X Setter函数可以绑定到左值和右值参数。 根据实际的参数,这可能会导致创build一个临时的,最终会导致一个副本分配; 由于这个原因,这种devise不支持不可复制的types。 使用C ++ 11,我们可以移动语义,完美转发和通用引用(Scott Meyers的术语),通过以这种方式重写它们,可以更有效地使用setter函数: class X { public: template<typename T> void set_a(T&& a) […]

如何诊断错误SEHException – 外部组件已引发exception

每当用户报告错误如 System.Runtime.InteropServices.SEHException – 外部组件已引发exception? 有什么我作为程序员可以做,以确定原因? 情景:一个用户(使用我公司写的程序)报告了这个错误。 这可能是也可能不是一个错误。 他们提到,在上个月,电脑有两次“停止工作”。 我从经验中学到了,不要太直接地去描述,因为这通常意味着有关计算机的人不能按预期工作。 他们无法给我更多的细节,我找不到任何logging的错误。 因此,它可能或可能不是这个错误。 从堆栈跟踪中,实际的错误是构build一个不直接调用任何interop代码的类,但可能由于该对象可能是一个绑定到DevExpress Grid的列表的一部分而变得复杂。 错误被一个未处理的exception例程“捕获”,通常会closures程序,但是可以忽略和继续。 如果他们select忽略这个错误,那么这个程序继续工作,但是当这个例程下一次运行的时候,错误会重新发生。 但是,在closures并重新启动我们的应用程序后,它不再发生。 有问题的电脑似乎没有压力。 它运行Vista商业,有2GB的内存,根据任务pipe理器只用了大约一半,我们的应用程序只有大约200Mb。 还有另外一条信息可能相关,也可能不相关。 同一个程序的另一部分使用了第三方组件,它实际上是一个本地dll的dotnet包装,而且这个组件确实有一个已知的问题,偶尔你会得到 尝试读取或写入受保护的内存。 这通常表示其他内存已损坏 这些组件制造商说,这已经在我们正在使用的最新版本的组件中得到修复,但是这还没有给客户。 由于错误的后果是很低的(没有工作丢失,重新启动程序并返回到最多只需要一分钟),并且客户很快就会得到一个新的版本(更新的第三版本,党的组成部分),我可以明显地跨过我的手指,并希望错误不会再发生。 但还有什么我可以做的吗?

移动vector是否使迭代器无效?

如果我有一个向量的迭代器,那么我移动构造或移动 – 从该向量分配另一个向量,该迭代器是否仍然指向新向量中的有效元素? 这是一个简单的例子: #include <vector> #include <iostream> int main(int argc, char *argv[]) { std::vector<int>::iterator a_iter; std::vector<int> b; { std::vector<int> a{1, 2, 3, 4, 5}; a_iter = a.begin() + 2; b = std::move(a); } std::cout << *a_iter << std::endl; return 0; } 是a_iter仍然是有效的,因为a被移入b ,或者被移动无效的迭代器? 作为参考, std::vector::swap 不会使迭代器失效 。

]属性是什么意思?

有人能用一种凡人能理解的语言来解释吗?

通过测验了解C#中的嵌套generics类

在和同事谈论C#时,他向我展示了一些C#代码,我必须预测它的输出。 这看起来很简单,但事实并非如此。 我真的不明白为什么C#这样做。 代码: public class A<T1> { public T1 a; public class B<T2> : A<T2> { public T1 b; public class C<T3> : B<T3> { public T1 c; } } } class Program { static void Main(string[] args) { A<int>.B<char>.C<bool> o = new A<int>.B<char>.C<bool>(); Console.WriteLine(oaGetType()); Console.WriteLine(obGetType()); Console.WriteLine(ocGetType()); Console.ReadKey(); } } 输出是: System.Boolean System.Char System.Int32 […]

比较使用不同分配器的STLstring

我想比较使用不同的分配器分配的STLstring,例如普通的std::string与使用自定义STL分配器的string。 不幸的是,似乎通常的operator==()在这种情况下不起作用: // Custom STL allocator to allocate char's for string class typedef MyAllocator<char> MyCharAllocator; // Define an instance of this allocator MyCharAllocator myAlloc; // An STL string with custom allocator typedef std::basic_string < char, std::char_traits<char>, MyCharAllocator > CustomAllocString; std::string s1("Hello"); CustomAllocString s2("Hello", myAlloc); if (s1 == s2) // <— ERROR: doesn't compile … 特别是,MSVC10(VS2010 […]

联锁和易变

我有一个variables,我用来代表状态。 它可以从多个线程读取和写入。 我正在使用Interlocked.Exchange和Interlocked.CompareExchange来更改它。 不过,我正在从多个线程阅读它。 我知道volatile可以用来确保variables不被本地caching,但是总是直接从内存中读取。 但是,如果我将该variables设置为volatile,那么它会生成关于使用volatile的警告,并将ref传递给Interlocked方法。 我想确保每个线程正在读取variables的最新值,而不是一些caching版本,但我不能使用volatile。 有一个Interlocked.Read但它是64位types,并不是在紧凑的框架。 它的文档说,它是不需要的32位types,因为它们已经在一个单一的操作中执行。 在互联网上发表的声明表明,如果您使用互锁方法进行所有访问,则不需要变化。 但是,您无法使用联锁方法读取32位variables,因此您无法使用联锁方法进行所有访问。 有没有办法实现线程安全读写我的variables,而不使用locking?

如何在NuGet包中为类库包含Xml文档?

我正在为一个C#类库创build一个NuGet包,并且我希望在库中包含生成的Xml文档。 这是我的nuspec文件: <?xml version="1.0" encoding="utf-8"?> <package> <metadata> <id>MyLibrary</id> <version>1.0.0.0</version> <authors>John Nelson</authors> <language>en-US</language> <description>AC# class library</description> </metadata> <files> <file src="..\..\build\MyLibrary.dll" target="lib\Net40" /> <file src="..\..\build\MyLibrary.xml" target="lib\Net40" /> </files> </package> 当我用这个命令构build包时 : nuget pack MyLibrary.nuspec 它会产生一个错误。 如果我删除该行: <file src="..\..\build\MyLibrary.xml" target="lib\Net40" /> NuGet.exe成功创buildnupkg。 我甚至可以解压缩包,并validation内容是否正确。 我究竟做错了什么? 如果xml文件进入不同的目标目录?

你会在你的应用程序中embedded哪个Javascript引擎?

我想在我的爱好游戏引擎中embeddedJavascript。 现在我们已经拥有了第五代Javascript引擎(所有的引擎都很快),我很好奇你会select在C ++框架中embedded什么引擎(包括embedded它的实际简易性)? 注意:为了清楚起见,我对DOM脚本或在浏览器中编写JavaScript不感兴趣。 这里有一个到目前为止的链接汇编和线程的一些技巧 蜘蛛猴 tracemonkey (注意:向后兼容spidermonkey): V8 金鳞 为了logging,我喜欢Lua,并且已经在游戏引擎中embedded了大约5次。 但是现在这是一个嗜好项目,我认为JavaScript被大多数Web开发人员所熟知,而且由于其ECMA,Flash和Flex开发人员,使用Javascript和XML进行脚本编写的游戏引擎将更加方便用户,迎合更大用户群(还有一个到目前为止还没有机会使用他们的游戏技能)比拥有Lua的用户群(还有很多其他的用户群)。 另外对于这个logging,我将与V8一起去,主要是因为我喜欢它的C ++风格。