Questions tagged «c#»

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

22
为什么VB如此受欢迎?[关闭]
对我来说,Visual Basic看起来笨拙,丑陋,容易出错并且难以阅读。我让别人解释 原因。尽管就功能而言,VB.net显然是该语言的巨大飞跃,但我仍然不明白为什么有人会选择使用VB而不是C#进行编码。 但是,我仍然看到(似乎是)“ MS商店”中的绝大多数商业Web应用程序都是在VB中构建的。我可以对此进行纠正,但是VB似乎仍然比应有的受欢迎。 任何人都可以帮助回答以下任何(或全部)问题: 我在VB中缺少什么吗?它比C#更容易学习还是“更友好”?有我不知道的功能吗? 为什么今天这么频繁使用VB / VB.net,尤其是在Web项目中?

2
如果在业务逻辑更改时失败,则单元测试是否被认为是脆弱的?
请参见下面的代码;它会测试以查看具有性别的女性是否有资格接受要约1: [Fact] public void ReturnsFalseWhenGivenAPersonWithAGenderOfFemale() { var personId = Guid.NewGuid(); var gender = "F"; var person = new Person(personId, gender); var id = Guid.NewGuid(); var offer1 = new Offer1(id,"Offer1"); Assert.False(offer1.IsEligible(person)); } 此单元测试成功。但是,如果将来向女性提供“ Offer1”,它将失败。 可以接受的说法是-如果围绕报价1的业务逻辑发生了变化,那么单元测试就必须发生变化。请注意,在某些情况下(对于某些商品),业务逻辑会在数据库中更改,如下所示: update Offers set Gender='M' where offer=1; 在某些情况下,在域模型中如下所示: if (Gender=Gender.Male) { //do something } 另请注意,在某些情况下,背后的域逻辑会定期更改,而在某些情况下则不会。

2
纯抽象类和接口的实现
尽管在C ++标准中这不是强制性的,但例如,GCC似乎通过在每个相关类的实例中都包含指向该抽象类的v表的指针来实现父类(包括纯抽象类)的方式。 自然,这通过其具有的每个父类的指针使该类的每个实例的大小膨胀。 但是我注意到许多C#类和结构都有很多父接口,它们基本上是纯抽象类。如果对say的每个实例Decimal都充满了指向所有各种接口的6个指针,我会感到惊讶。 因此,如果C#确实使用不同的接口,至少在典型的实现中,它如何实现它们(我知道标准本身可能没有定义这种实现)?在将纯虚拟父代添加到类时,是否有任何C ++实现都可以避免对象大小膨胀?

5
捕获/抛出异常是否会使原本纯净的方法不纯?
以下代码示例为我的问题提供了上下文。 用委托初始化Room类。在Room类的第一个实现中,没有防范引发异常的委托的措施。此类异常将上升到North属性,在该North属性上评估委托(请注意:Main()方法演示了如何在客户端代码中使用Room实例): public sealed class Room { private readonly Func<Room> north; public Room(Func<Room> north) { this.north = north; } public Room North { get { return this.north(); } } public static void Main(string[] args) { Func<Room> evilDelegate = () => { throw new Exception(); }; var kitchen = new Room(north: …

3
我应该在锁语句中放置多少工作?
我是一名初级开发人员,致力于为从第三方解决方案接收数据,将其存储在数据库中,然后将数据整理以供其他第三方解决方案使用的软件编写更新。我们的软件作为Windows服务运行。 查看以前版本中的代码,我看到以下内容: static Object _workerLocker = new object(); static int _runningWorkers = 0; int MaxSimultaneousThreads = 5; foreach(int SomeObject in ListOfObjects) { lock (_workerLocker) { while (_runningWorkers >= MaxSimultaneousThreads) { Monitor.Wait(_workerLocker); } } // check to see if the service has been stopped. If yes, then exit if (this.IsRunning() == …
27 c#  .net  concurrency  locks 

5
不要为不可变对象声明接口
不要为不可变对象声明接口 [编辑]所涉及的对象代表数据传输对象(DTO)或纯旧数据(POD) 这是一个合理的指导方针吗? 到目前为止,我经常为不可变(无法更改数据)的密封类创建接口。我一直在小心谨慎,不要在我关心不变性的任何地方使用该接口。 不幸的是,界面开始渗透代码(这不仅仅是我担心的代码)。您最终要通过一个接口,然后又想将其传递给某些代码,而这些代码确实想假设要传递给它的东西是不可变的。 由于这个问题,我正在考虑永远不要为不可变对象声明接口。 这可能会对单元测试产生影响,但是除此之外,这似乎是一个合理的指南吗? 还是我应该使用另一种模式来避免出现“扩展接口”问题? (我之所以使用这些不可变的对象,有几个原因:主要是出于线程安全,因为我编写了许多多线程代码;还因为这意味着我可以避免将防御性的对象副本传递给方法。代码变得更加简单在很多情况下,当您知道某事物是不可变的时,如果您已经获得了接口,那么您就不会知道这一点。事实上,如果您不提供通过接口引用的对象的防御性副本,通常情况下您甚至无法克隆操作或序列化的任何方式...) [编辑] 由于我想使对象不可变的原因,为了提供更多上下文,请参阅Eric Lippert的这篇博客文章: http://blogs.msdn.com/b/ericlippert/archive/tags/immutability/ 我还应该指出,我在这里使用一些较低级别的概念,例如在多线程作业队列中正在操纵/传递的项目。这些本质上是DTO。 约书亚·布洛赫(Joshua Bloch)也在他的《有效的Java》一书中建议使用不可变对象。 跟进 谢谢您的反馈。我已经决定继续使用该指导原则,以适用于DTO及其同类。到目前为止,它运行良好,但是只有一个星期了……看起来还不错。 我还想问一些与此有关的其他问题;尤其是我所说的“深层或浅层不变性”(我从深层和浅层克隆中窃取的术语)-但这是另一个问题。
27 c#  immutability 

1
如何选择使用域事件还是让应用程序层协调一切
我正在迈入域驱动设计的第一步,购买了蓝皮书和其他所有书籍,我发现自己看到三种实现特定解决方案的方法。作为记录:我没有使用CQRS或事件源。 假设有一个用户请求进入了应用程序服务层。出于某种原因,该请求的业务逻辑分为实体上的方法和域服务上的方法。我应该如何去调用那些方法? 到目前为止,我收集的选项有: 让应用程序服务调用这两种方法 使用方法注入/双重调度将域服务注入到实体中,让实体来做,然后让它调用域服务的方法(或者反之,让域服务在实体上调用方法) 在实体方法中引发一个域事件,该事件的处理程序调用域服务。(我正在谈论的域事件是:http : //www.udidahan.com/2009/06/14/domain-events-salvation/) 我认为这些都是可行的,但我无法在它们之间进行选择。我已经考虑了很长时间了,直到现在我再也看不到这三者之间的语义差异了。您知道什么时候使用什么准则吗?

7
引发ArgumentNullException有何帮助?
假设我有一个方法: public void DoSomething(ISomeInterface someObject) { if(someObject == null) throw new ArgumentNullException("someObject"); someObject.DoThisOrThat(); } 我受过训练,相信抛出的错误ArgumentNullException是“正确的”,但是“对象引用未设置为对象的实例”错误意味着我有一个错误。 为什么? 我知道,如果我要缓存对引用的引用someObject并在以后使用它,那么最好在传入时检查是否为空,并尽早失败。但是,如果我在下一行取消引用,为什么要进行检查?它将以一种方式或另一种方式引发异常。 编辑: 这只是我想到的...担心被取消引用的null是否来自不检查您的C ++之类的语言(即,它只是尝试在内存位置0 +方法偏移处执行某些方法)?
27 c#  null 

9
人们为什么如此强烈地反对方法中的#region标签?
我听说过很多关于使方法简短的知识,而且我听过很多程序员说,在方法中使用#region标记是一个确定的信号,即它太长了,应该重构为多个方法。但是,在我看来,在许多情况下,在方法中使用#region标签分隔代码是重构为多个方法的绝佳解决方案。 假设我们有一种方法,其计算可以分为三个相当不同的阶段。此外,这些阶段中的每个阶段仅与该方法的计算有关,因此将它们提取到新方法中不会获得代码重用。那么,将每个阶段提取到自己的方法中有什么好处?据我所知,我们获得的是每个阶段都有一定的可读性和单独的变量范围(这将有助于防止对特定阶段的修改意外破坏另一个阶段)。 但是,这两种方法都可以实现,而无需将每个阶段提取到自己的方法中。区域标签使我们可以将代码折叠成可读性强的形式(其附加好处是,如果我们决定扩展和检查代码,则不再需要在该文件中保留位置),并且只需将每个阶段包装在{}创建自己的工作范围。 这样做的好处是,我们不会使用实际上仅与第四个方法的内部工作相关的三个方法来污染类级别的范围。在我看来,立即将长方法重构为一系列短方法似乎是等同于过早优化的代码重用。您正在引入额外的复杂性以解决在许多情况下永远不会出现的问题。如果有出现代码重用的机会,您以后总是可以将阶段之一提取到其自己的方法中。 有什么想法吗?
27 c#  coding-style 

1
调用函数,永远不要在C#中等待它
我的mvc4 Web应用程序中有一个控制器,其中有一个需要调用另一个函数的动作。该函数会发生什么,即返回值对我的操作并不重要。我如何才能调用该函数而从不等待其执行? 我认为可以通过异步完成此操作,但我的意思是不使用资源,只需调用函数就不要等待发生的任何事情。 请给我一些建议。
26 c#  .net  asp.net  asp.net-mvc 

4
库的C#名称空间和类命名约定
我正在用C#构建带有各种小型实用程序函数的库,并尝试确定名称空间和类命名约定。我目前的组织是这样的: Company Company.TextUtils public class TextUtils {...} Company.MathsUtils public class MathsUtils {...} public class ArbitraryPrecisionNumber {...} public class MathsNotation {...} Company.SIUnits public enum SISuffixes {...} public class SIUnits {...} 这是组织名称空间和类的好方法,还是有更好的方法?特别是,在名称空间和类名称(例如,Company.TextUtils名称空间和TextUtils类)中具有相同的名称似乎只是重复,这表明该方案可能会更好。
26 c#  naming  namespace 


5
您是将私有内容内部/公开进行测试,还是使用诸如PrivateObject之类的黑客工具?
我是代码测试的初学者,assert以前是妓女。在单元测试中让我担心的一件事是,通常需要您创建public(或至少internal)private原本应该不是的字段,取消readonly它们,改为创建private方法protected virtual等。 我最近发现,可以通过使用诸如PrivateObject类之类的东西通过反射访问对象中的任何内容来避免这种情况。但是,这会使您的测试难以维护(事情将在执行而不是编译时失败,它会被简单的重命名破坏,更难调试...)。你对此的看法如何 ?关于访问限制的单元测试的最佳实践是什么? 编辑:例如,假设您有一个类,该类在磁盘上的文件中具有缓存,而在测试中您想写入内存。
26 c#  unit-testing 

20
将C#作为第一语言学习是错误的吗?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 4年前关闭。 已锁定。该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。它目前不接受新的答案或互动。 我知道这里也有类似的问题,我已经阅读过,但是最近我读了Joel Spolsky的这篇文章: 如何教一个没有编程经验的聪明人,如何编程? 这让我开始思考自己的学习方式,从长远来看是否真的有害。 我已经涉猎各种语言,但是C#是我的第一个认真的语言,我读过“ Head First C#”并创建了一些项目。但是,在阅读了上面的文章之后,我发现我可能全都错了,这让我有些沮丧,很显然,我尊重乔尔的观点,这让我有些不满。 我已经开始按照阅读清单中的建议阅读“代码”,尽管很难过,但我发现它很难。我觉得它已经摆脱了我在Visual Studio中“愚蠢的骇客”的光芒。 所以现在我不确定应该走什么路?我应该退后一步,按照乔尔的建议开始阅读吗? 我想我的主要目标只是像其他所有人一样成为一名优秀的程序员,但是当我尊重的人认为这是有害的时,我不希望通过学习.NET语言而陷入不良实践。 有什么想法吗?
26 c# 

9
为什么要禁用编译器警告?
此问题是从Stack Overflow 迁移而来的,因为可以在Software Engineering Stack Exchange上回答。 迁移 8年前。 这个答案和添加的注释显示了一种使用#pragma指令禁用多个编译器警告的方法。 为什么要这样做?通常,警告的存在是有原因的,我一直觉得它们是很好的理由。是否有应禁用警告的“有效情况”?现在我什么也想不出来,但也许就是我。
26 c#  c++  c  warnings 

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.