我有一个像这样定义的generics方法: public void MyMethod<T>(T myArgument) 我想要做的第一件事是检查myArgument的值是否为该types的默认值,如下所示: if (myArgument == default(T)) 但是这不会编译,因为我不能保证T将实现==运算符。 所以我把代码切换到这个: if (myArgument.Equals(default(T))) 现在编译,但如果myArgument为null,这将是我testing的一部分,将失败。 我可以像这样添加一个显式的空检查: if (myArgument == null || myArgument.Equals(default(T))) 现在这对我来说是多余的。 ReSharper甚至build议我将myArgument == null部分更改为myArgument == default(T),这是我开始的地方。 有没有更好的方法来解决这个问题? 我需要支持引用types和值types。
()循环的C ++ 11基于范围的常见示例总是如此简单: std::vector<int> numbers = { 1, 2, 3, 4, 5, 6, 7 }; for ( auto xyz : numbers ) { std::cout << xyz << std::endl; } 在这种情况下, xyz是一个int 。 但是,当我们有像地图一样的东西时会发生什么? 这个例子中variables的types是什么: std::map< foo, bar > testing = { /*…blah…*/ }; for ( auto abc : testing ) { std::cout << abc << […]
C#编译器要求每当自定义types定义运算符== ,它也必须定义!= (请参见此处 )。 为什么? 我很想知道为什么devise者认为这是必要的,为什么当编译器只有对方存在的时候,编译器为什么不能默认合理的实现呢? 例如,Lua只允许你定义相等运算符,而你可以免费获得另一个。 C#可以通过要求你定义==或者==和!=然后自动编译缺less的!=运算符为!(left == right) 。 我知道有些奇怪的angular落案例,其中一些实体可能既不平等也不平等(如IEEE-754 NaN's),但是那些看起来是例外而非规则。 所以这并不能解释为什么C#编译器的devise者将这个规则作为例外。 我已经看到平等运算符定义不好的情况下,那么不平等运算符就是一个复制粘贴,每一个比较都是相反的,每一个&&切换到一个||。 (你明白了……基本上(a == b)通过De Morgan规则扩展了)。 这是一个糟糕的做法,编译器可以通过devise来消除,就像Lua一样。 注意:对于运算符<> <=> =也是一样。 我无法想象你需要以非自然的方式来定义这些情况。 Lua让你自然地定义<和<=,并定义> =和>自然地通过前人的否定。 为什么C#不这样做(至less默认是')? 编辑 显然有一些正当理由可以让程序员对他们喜欢的平等和不平等进行检查。 有些答案指出,这可能是很好的情况。 但是,我的问题的核心是为什么这是在C#中强制要求通常不是在逻辑上是必要的? 与Object.Equals , IEquatable.Equals IEqualityComparer.Equals等deviseselect形成鲜明对比的是,缺lessNotEquals对象表明框架认为!Equals()对象是不平等的,就是这样。 而且像Dictionary这样的类和像.Contains()这样的方法完全依赖于前面提到的接口,即使定义了,也不直接使用操作符。 实际上,当ReSharper生成相等成员时,它根据Equals()定义了==和!= ,并且只有在用户select生成运算符的时候。 理解对象平等的框架不需要相等运算符。 基本上,.NET框架并不关心这些操作符,它只关心几个Equals方法。 要求用户同时定义==和!=运算符的决定完全与.NET的语言devise和对象语义有关。
除了 – 有什么其他警告有人认为有用吗? http://gcc.gnu.org/onlinedocs/gcc-4.3.2/gcc/Warning-Options.html
我想进入更多的模板元编程。 我知道SFINAE代表“替代失败不是一个错误”。 但有人可以给我看SFINAE的好用吗?
我开始研究C ++ 11的智能指针,我没有看到任何有用的std::weak_ptr 。 有人可以告诉我什么时候std::weak_ptr是有用的/必要的?
Java具有generics,C ++通过template提供了一个非常强大的编程模型。 那么,C ++和Javagenerics有什么区别呢?
我正在尝试使用WinForms首次实现MVP方法。 我想了解每一层的function。 在我的程序中,我有一个GUIbutton,点击时打开一个openfiledialog窗口。 因此,使用MVP,GUI处理button单击事件,然后调用presenter.openfile(); 在presenter.openfile()中,是否应该将该文件的开放委托给模型层,或者由于没有要处理的数据或逻辑,是否应该简单地处理请求并打开openfiledialog窗口? 更新:我决定提供一个赏金,因为我觉得我需要进一步的帮助,最好是针对我下面的具体要点,以便我有背景。 好吧,在阅读MVP之后,我决定实施被动观点。 实际上,我将在Winform上有一堆控件,由Presenter处理,然后委托给Model(s)。 我的具体观点如下: 当winform加载时,它必须获得一个树形视图。 我认为视图应该调用一个方法,如:presenter.gettree(),这反过来将委托给模型,它将获取树视图的数据,创build并configuration它,返回到主持人,这反过来会传递到视图,然后将其简单地分配给一个面板? 这将是相同的任何数据控件的Winform,因为我也有一个datagridview? 我的应用程序,有相同的程序集的许多模型类。 它还支持插件体系结构,需要在启动时加载插件。 该视图是否会简单地调用一个演示者方法,然后调用一个方法来加载插件并在视图中显示信息? 然后哪个层将控制插件引用。 视图是否会引用他们或主持人? 我是否认为视图应该处理关于表示的每一件事情,从treeview节点的颜色,到datagrid的大小等? 我认为他们是我主要关心的问题,如果我理解这些stream程应该如何,我想我会没事的。
我一直在试图解决这个“并行编程”考试练习(在C#中): 知道Stream类包含int Read(byte[] buffer, int offset, int size)和void Write(byte[] buffer, int offset, int size)方法,在C#中实现NetToFile方法,将所有从NetworkStream net实例添加到FileStream file实例。 要执行传输,请使用asynchronous读取和同步写入,避免在读取操作期间阻塞一个线程。 当net读取操作返回值0时,传输结束。为简化操作,不需要支持受控的取消操作。 void NetToFile(NetworkStream net, FileStream file); 我一直在试图解决这个问题,但是我正在努力解决与问题本身有关的问题。 但首先,这是我的代码: public static void NetToFile(NetworkStream net, FileStream file) { byte[] buffer = new byte[4096]; // buffer with 4 kB dimension int offset = 0; // read/write offset int nBytesRead = 0; […]
C#有免费的OpenGL支持库吗? 如果是这样,我使用哪一个,哪里可以find示例项目? C#提供OpenGL的类吗?