Questions tagged «c#»

C#是Microsoft与.NET平台并行创建的一种多范式,托管的,垃圾回收的面向对象编程语言。

13
我们如何使单元测试快速运行?
在项目中,我们已经进行了将近一千次测试,并且人们花了很长时间才停止在进行检入之前运行它们的麻烦。充其量,他们运行与所更改代码段相关的测试,而最糟糕的是,它们仅在未经测试的情况下检入。 我认为这个问题是由于以下事实导致的:解决方案已增长到120个项目(我们通常会做很多较小的项目,这只是我们第二次正确进行TDD),并且构建+测试时间已增长到大约两三分钟在较小的机器上。 我们如何减少测试的运行时间?有技巧吗?假装更多?少假装?也许在运行所有测试时不应该自动运行较大的集成测试? 编辑:作为对几个答案的回应,我们已经使用CI和构建服务器,这就是我知道测试失败的方式。问题(实际上是一种症状)是我们不断收到有关构建失败的消息。大多数人会执行部分测试,但并非全部。关于测试,它们实际上做得很好,对所有东西都使用伪造品,根本没有IO。
40 c#  unit-testing  tdd  nunit 

8
现代的OO语言可以与C ++的数组存储性能竞争吗?
我只是注意到,我至少有点熟悉的每种现代OO编程语言(基本上只是Java,C#和D)都允许协变量数组。也就是说,字符串数组是对象数组: Object[] arr = new String[2]; // Java, C# and D allow this 协变量数组是静态类型系统中的一个漏洞。它们使得可能在编译时无法检测到的类型错误,因此必须在运行时检查对数组的每次写入: arr[0] = "hello"; // ok arr[1] = new Object(); // ArrayStoreException 如果我进行大量阵列存储,这似乎会降低性能。 C ++没有协变数组,因此不需要进行此类运行时检查,这意味着不会降低性能。 是否进行了任何分析以减少必要的运行时检查次数?例如,如果我说: arr[1] = arr[0]; 有人会说这家商店不可能倒闭。我敢肯定,我还没有想到其他很多可能的优化方法。 现代编译器实际上是在进行这类优化吗?还是我不得不忍受这样一个事实,例如Quicksort总是执行O(n log n)不必要的运行时检查? 现代的OO语言是否可以避免因支持协变量数组而产生的开销?
40 c#  java  c++  d 

5
C#List <>中的.Any()有什么用?
我一直在与同事讨论这个问题,我们无法弄清楚C#中.Any任何给定的用途是什么List&lt;&gt;。 您可以像下面的语句那样检查数组中元素的有效性: if (MyList.Any()){ ...} //Returns true or false 完全一样 if (MyList.Count() != 0) { ... } 并且更加常见,易读并且清楚if声明的意图。 最后,我们陷入了这种想法: .Any() 可以使用,但效果也一样,但是对程序员的意图尚不清楚,因此不应该使用它。 但是我们觉得这是不对的。我们一定缺少一些东西。 是吗
40 c#  array  list 

3
为什么在C样式语言中逻辑NOT运算符是“!”而不是“ ~~”?
对于二进制运算符,我们同时具有按位和逻辑运算符: &amp; bitwise AND | bitwise OR &amp;&amp; logical AND || logical OR 但是,NOT(一元运算符)的行为有所不同。有〜用于按位和!为逻辑。 我认识到与AND和OR相对,NOT是一元运算,但是我无法想到设计师为何选择偏离单数位和双数逻辑的原则,而是改用其他字符的原因。我猜您可能读错了它,就像总是返回操作数值的双按位运算一样。但这对我来说似乎不是一个真正的问题。 我有什么原因想念吗?
39 java  c#  c++  c 

6
使用.dll文件比将.cs文件链接到项目的优势(对于我自己的通用帮助程序类/扩展方法)
我有一个帮助程序项目,可在我创建的所有应用程序中使用。它包含一些扩展方法和一堆通用帮助程序类,控件等。我会不时更新/扩展帮助程序项目。这些通常是小型且无关的项目,而我是唯一从事这些项目的人。 我尝试了两种使用方法 将.cs文件直接添加(添加为链接)到使用它们的每个项目中 将其编译为.dll并将其添加为参考 我看到了这些方法的一些优点和缺点。 第一个: 更简单,因为帮助程序类被编译到exe文件中,所以我经常可以很容易地提供一个可以正常工作的.exe文件。因为我添加为链接,所以我可以肯定的是,每当构建使用该帮助程序的任何项目时,该帮助程序文件都是最新版本。 甚至更简单,因为我可以分开文件,因此可以在.NET 4.0上良好运行的扩展方法与需要.NET 4.5的扩展方法分开引用,这意味着整个应用程序都可以在.NET 4.0上运行 允许通过代码进行调试,并具有断点等的所有优点。 似乎不是“最佳实践” 第二个: 似乎是正确的方法,但是: 需要我提供一个单独的.dll文件,由于某种原因,该文件对用户来说要困难得多(他们倾向于在没有.dll的情况下共享我的程序,然后该文件在启动时崩溃) 当它被编译成一个.dll时,它将需要.NET的最高版本-我的许多用户都没有.NET 4.5,并且只有我的helper类的某些元素需要这样做,这意味着我可以强迫某些人无故更新他们的系统 我还需要确保每当我更新任何程序时,我都还提供.dll文件-即使我不知道自上一个版本以来是否已对其进行过更改(可能已经更改了,但是它最好是同一版本)。在不跟踪程序集版本的情况下,我看不到一种简单的确定方法,这是额外的工作。现在,当我更新程序时,我只提供更新的exe,并且我希望使其保持小巧和低调。 那么,在这里使用.dll文件的实际好处是什么?请注意,我是唯一编辑所有应用程序和帮助文件的代码的人。 另外,需要澄清的是-应用程序通常很少,而helper类中包含的代码对所有应用程序都是完全通用的(一些简单的字符串比较,路径或XML操作等) 实际上,有人让我意识到刚才还有第三种选择。由于我在separte项目中具有帮助程序代码,因此可以将该项目添加到我每个单独应用程序的解决方案中-该工作方式类似于针对单个文件的“添加为链接”,但我只添加了一个项目...但是正如Doc Brown所注意到的,这实质上意味着无论如何都需要将.dll添加到项目中... 另一种有利于不使用dll文件的事情是能够主动地通过helper类进行调试...
38 c#  dll 

5
为什么C#在case块中没有局部作用域?
我在写这段代码: private static Expression&lt;Func&lt;Binding, bool&gt;&gt; ToExpression(BindingCriterion criterion) { switch (criterion.ChangeAction) { case BindingType.Inherited: var action = (byte)ChangeAction.Inherit; return (x =&gt; x.Action == action); case BindingType.ExplicitValue: var action = (byte)ChangeAction.SetValue; return (x =&gt; x.Action == action); default: // TODO: Localize errors throw new InvalidOperationException("Invalid criterion."); } } 惊讶地发现一个编译错误: 此范围中已经定义了一个名为“ action”的局部变量 这个问题很容易解决。只是摆脱第二个var就可以了。 …

5
密码或对象?
在提供用于获取域实体的业务逻辑方法时,该参数应接受对象还是ID?例如,我们应该这样做: public Foo GetItem(int id) {} 或这个: public Foo GetItem(Foo foo) {} 我相信整个传递对象,但是在这种情况下,我们得到一个对象,而我们只知道ID,该怎么办?调用方应该创建一个空的Foo并设置ID,还是应该将ID传递给方法?由于传入的Foo除了ID以外都是空的,因此我看不到调用方必须创建Foo并设置ID的好处,因为它可以将ID发送给GetItem()方法。

4
公共常量是否“不好”?
这是: public MyClass { public const string SomeString = "SomeValue"; } 比这更糟: public MyClass { public static string SomeString { get{ return "SomeValue";}} } 两者可以用相同的方式引用: if (someString == MyClass.SomeString) ... 但是,第二个保护是作为财产的。但是,这真的比const好多少? 我已经学到了遍及公共领域的危险。因此,当我看到一些在公共字段上使用这些常量的代码时,我立即着手将其重构为属性。但是到了一半,我想知道拥有静态属性而不是常量有什么好处。 有任何想法吗?
38 c# 

10
WPF与WinForms-Delphi程序员的观点?
我已经阅读了WPF与WinForms上的大多数主要线程,而我发现自己陷入了不幸的矛盾之中,当您在尝试使用过的和真正的先前技术(Winforms)以及它的后继技术(WPF)之间做出选择时,就会陷入这种矛盾中。 我是多年的资深Delphi程序员,最终终于跳到了C#。我的其他Delphi程序员同伴将了解到,我很高兴知道Delphi闻名的Anders Hejlsberg是C#的架构师。我对Delphi的VCL定制组件非常着迷,尤其是那些涉及制作多步向导和充当子组件容器的组件的组件。 在这种背景下,我希望从Delphi转到C#的那些人可以帮助我完成WinForms vs. WPF决策,以编写初始应用程序。请注意,当我进行编码时,我非常急躁,诸如成熟的自动完成功能和适当的调试器支持之类的东西可能对我来说成败一个项目,包括能够找到有关API功能和调用的随时可用信息,甚至更多的错误解决方法。 。 2009年初日期范围内的SO线程和注释使我非常担心WPF,因为它可能会破坏我的C#UI开发代码。另一方面,花费大量时间来学习即使没有被放弃也即将被替换的API技术(WinForms),同样令人不安,我确实在WPF诱人中发现了GPU支持。 因此,我的矛盾情绪。由于我还没有学过任何一种技术,所以我有一个难得的机会重新开始,而且不必面对巨大的“无学习”曲线,当WinForms程序员转向WPF时,我已经看到人们在各个线程中提到了这一点。另一方面,如果对像我这样的耐心的RAD开发人员来说,使用WPF太令人沮丧或产生其他严重的负面影响,那么我将坚持使用WinForms,直到WPF达到相同的支持水平和易用性。为了给您一个具体的例子说明我作为程序员的心理,我使用了VB,随后又使用了Delphi,以完全避免使用MFC进行编码的真正痛苦,MFC是许多开发人员在开发早期Windows应用程序时都会遇到的Windows UI库。我从未后悔避免使用MFC。 知道Anders Hejlsberg是否参与过WPF和/或WinForms的体系结构,以及这两个代码库中体现的创意视野和易用性方面是否存在差异,也令人感到欣慰。最后,再次让Delphi程序员知道使用WPF而不是WinForms时需要多少“ IDE schock”,尤其是在调试器支持方面。2011年更新的任何就业市场评论也将不胜感激。
38 c#  wpf  winforms  delphi  microsoft 

6
使用TDD的复杂代码的好例子[关闭]
在大型,现实生活中,复杂的项目中使用TDD的一个很好的例子是什么?到目前为止,我所看到的所有示例都是出于书籍或纸张目的的玩具项目... 您能命名一个使用TDD的开源项目吗?最好使用C ++,但我可以阅读Java和C#或其他类似语言。
37 java  c#  open-source  c++  tdd 

5
仅通过参数名称(而不是类型)来区分方法是否足够?
仅通过参数名称(而不是类型)来区分方法就足够了吗?还是更明确地命名呢? 例如T Find&lt;T&gt;(int id)VS T FindById&lt;T&gt;(int id)。 是否有充分的理由更明确地命名(即添加ById)而不是仅保留参数名称? 我能想到的一个原因是方法的签名相同但含义不同。 FindByFirstName(string name) 和 FindByLastName(string name)

3
在业务层缓存与在数据层缓存
我一直在使用DAL进行缓存的项目中工作,基本上只是在您要对数据库进行调用时,它会检查缓存中是否已经有数据,如果存在,它不会进行调用,并且而是返回该数据。 我最近才读到有关在业务层进行缓存的信息,因此基本上可以缓存整个业务对象。我可以立即看到的一个优势是响应时间更快。 您什么时候比另一个更喜欢?并且在业务层缓存是一种常见的做法吗?

6
初始化孩子对其父母的引用的最佳方法是什么?
我正在开发一个对象模型,它具有许多不同的父/子类。每个子对象都有对其父对象的引用。我可以想到(并且已经尝试过)几种初始化父引用的方法,但是我发现每种方法都有明显的缺点。给定以下所述的方法,哪一种是最好的,哪一种是更好的。 我不会确保下面的代码可以编译,因此如果代码在语法上不正确,请尝试查看我的意图。 请注意,尽管我并不总是显示任何参数,但我的一些子类构造函数确实会接受参数(而不是父参数)。 调用方负责设置父级并添加到同一父级。 class Child { public Child(Parent parent) {Parent=parent;} public Parent Parent {get; private set;} } class Parent { // singleton child public Child Child {get; set;} //children private List&lt;Child&gt; _children = new List&lt;Child&gt;(); public List&lt;Child&gt; Children { get {return _children;} } } 缺点:为消费者设置父级过程分为两个步骤。 var child = new …

5
创建另一个类的ClassCollection是一个好习惯吗?
可以说我有一Car堂课: public class Car { public string Engine { get; set; } public string Seat { get; set; } public string Tires { get; set; } } 可以说,我们正在建立一个有关停车场的系统,我将使用很多Car类,因此我们建立了一个CarCollection类,它可能有一些类似的方法FindCarByModel: public class CarCollection { public List&lt;Car&gt; Cars { get; set; } public Car FindCarByModel(string model) { // code here return new Car(); …


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.