Questions tagged «c#»

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

6
何时在.Net中使用弱引用?
我个人没有遇到过需要在.Net中使用WeakReference类型的情况,但是普遍的看法似乎是应该在缓存中使用它。乔恩·哈罗普博士给了反对缓存使用在WeakReferences在他的一个很好的案例回答到这个问题。 我也经常听到AS3开发人员谈论使用弱引用来节省内存占用,但是根据我的交谈,似乎增加了复杂性,而不一定实现预期的目标,并且运行时行为是不可预测的。如此之多,以至于许多人只是放弃了,而是更加谨慎地管理内存使用/优化其代码以减少内存占用(或权衡更多的CPU周期和较小的内存占用)。 乔恩·哈罗普(Jon Harrop)博士在回答中也指出.NET弱引用不是软的,并且在gen0上有激进的弱引用集合。根据MSDN,较长的弱引用使您有可能重新创建对象but the state of the object remains unpredictable.! 考虑到这些特征,我想不出弱引用有用的情况,也许有人可以启发我?

12
捕获一般异常真的是一件坏事吗?
我通常同意大多数代码分析警告,并且我会坚持遵守。但是,我在这方面遇到了困难: CA1031:不捕获常规异常类型 我了解此规则的理由。但是,在实践中,如果无论是否引发异常,我都想采取相同的措施,为什么我要专门处理每一个?此外,如果我处理特定的异常,如果我正在调用的代码发生更改以在将来引发新的异常,该怎么办?现在,我必须更改代码以处理该新异常。而如果我只是抓住了Exception我的代码就不必更改。 例如,如果Foo调用Bar,并且Foo不管Bar抛出的异常类型如何都需要停止处理,那么具体确定我要捕获的异常类型是否有任何优势? 也许是一个更好的例子: public void Foo() { // Some logic here. LogUtility.Log("some message"); } public static void Log() { try { // Actual logging here. } catch (Exception ex) { // Eat it. Logging failures shouldn't stop us from processing. } } 如果您在此处未捕获到一般异常,则必须捕获所有可能的异常类型。帕特里克(Patrick)有一个优点,OutOfMemoryException不应以这种方式处理。那么,如果我想忽略所有例外情况OutOfMemoryException呢?
56 c#  design  exceptions 

7
单一责任原则-如何避免代码碎片化?
我正在一个团队中,团队负责人是SOLID开发原则的坚决拥护者。但是,他缺乏将复杂软件发布出去的大量经验。 在某种情况下,他将SRP应用于本来已经很复杂的代码库中,而现在该代码库变得非常分散,难以理解和调试。 现在,我们不仅遇到代码碎片问题,而且遇到封装问题,因为某个类中可能是私有或受保护的方法被判断为代表“更改原因”,并已提取到公共或内部类和接口中,与应用程序的封装目标不符。 我们有一些类构造函数,它们接收20个以上的接口参数,因此我们的Io​​C注册和解析本身已成为一个庞然大物。 我想知道我们是否可以使用任何“远离SRP的重构”方法来帮助解决其中一些问题。我已经读到如果创建多个空的粗粒度类来“包装”多个紧密相关的类以提供对它们功能总和的单点访问(即模仿一个较小的类),则它不会违反SOLID过度采用SRP的类实施)。 除此之外,我想不出一种解决方案,该解决方案将使我们能够务实地继续我们的开发工作,同时又使每个人都满意。 有什么建议么 ?

8
为什么用Java和C#而不是构造函数使用静态main方法?
我正在寻找来自主要来源或次要来源的明确答案,为什么Java和C#决定将静态方法作为其入口点,而不是通过Application类的实例表示应用程序实例(具有入口点)作为合适的构造函数)。 我先前研究的背景和细节 这已经被问过了。不幸的是,现有的答案只是在乞求这个问题。特别是,以下答案令我不满意,因为我认为它们是不正确的: 如果构造函数被重载,将存在歧义。–实际上,C#(以及C和C ++)允许使用不同的签名,Main因此存在并解决相同的潜在歧义。 一种static方法意味着在初始化之前,没有对象可以被实例化。–这实际上是错误的,某些对象之前已实例化(例如,在静态构造函数中)。 因此,它们可以由运行时调用,而无需实例化父对象。–这根本没有答案。 为了进一步说明为什么我认为这是一个有效且有趣的问题: 许多框架确实使用类来表示应用程序,并使用构造函数作为入口点。例如,VB.NET应用程序框架使用专用的主对话框(及其构造函数)作为入口点1。 从技术上讲,Java和C#都不需要主要方法。好吧,C#需要一个才能进行编译,但是Java甚至不需要。而且在任何情况下都不需要执行它。因此,这似乎不是技术限制。而且,正如我在第一段中提到的那样,仅出于约定,它似乎不符合Java和C#的一般设计原理。 需要明确的是,使用静态方法并没有特定的缺点main,这很奇怪,这使我想知道其背后是否有某种技术原理。 我对主要来源或次要来源的明确答案感兴趣,而不仅仅是猜测。 1尽管有一个回调(Startup)可能会拦截它。
54 java  c#  history  entry-point 


11
如果我需要设计来开始测试,我不明白TDD如何帮助我获得良好的设计
我试图围绕TDD,特别是开发部分,全神贯注。我看过一些书,但是我发现的书主要涉及测试部分-NUnit的历史,为什么测试很好,红色/绿色/重构以及如何创建字符串计算器。 好东西,但这只是“单元测试”,而不是TDD。具体来说,如果我需要一个设计来开始对其进行测试,我不理解TDD如何帮助我获得一个好的设计。 为了说明这一点,请想象一下这三个要求: 目录需要有产品列表 目录应记住用户查看过的产品 用户应该可以搜索产品 在这一点上,许多书从书本上摘下来,只是跳入“测试ProductService”,但他们没有解释如何得出结论,即首先有ProductService。这就是我要理解的TDD中的“开发”部分。 需要有一个现有的设计,但是实体服务之外的东西(也就是说:有一个Product,所以应该有一个ProductService)找不到地方(例如,第二个要求要求我有一个用户,但是我应该在哪里提醒该功能?搜索是ProductService的功能还是单独的SearchService?我怎么知道应该选择哪个?) 根据SOLID,我将需要一个UserService,但是如果我设计一个没有TDD的系统,则可能会得到一堆完整的Single-Method Services。TDD并不是一开始就让我发现自己的设计吗? 我是.net开发人员,但Java资源也可以使用。我觉得似乎没有真正的示例应用程序或书籍可以处理真正的业务应用程序。有人可以提供一个清晰的示例来说明使用TDD进行设计的过程吗?
50 java  c#  .net  tdd 

7
切换到SOLID后管理和组织大量增加的课程?
在过去的几年中,我们一直在缓慢地转换为逐渐更好的书面代码,每次只需几个小步骤。我们终于开始切换到至少与SOLID类似的东西,但是我们还没有到那儿。自从进行切换以来,开发人员最大的抱怨之一就是他们无法忍受同行审查和遍历数十个文件,而以前的每个任务只需要开发人员触摸5-10个文件即可。 在开始进行转换之前,我们的体系结构非常类似于以下内容(已授予,但又增加了一个或两个数量级的文件): Solution - Business -- AccountLogic -- DocumentLogic -- UsersLogic - Entities (Database entities) - Models (Domain Models) - Repositories -- AccountRepo -- DocumentRepo -- UserRepo - ViewModels -- AccountViewModel -- DocumentViewModel -- UserViewModel - UI 从文件的角度来看,所有内容都非常线性且紧凑。显然有很多代码重复,紧密耦合和令人头疼的问题,但是,每个人都可以遍历并弄清楚。完全的新手,从来没有像以前那样打开过Visual Studio的人,就可以在几周内解决这个问题。缺乏整体文件的复杂性,对于新手开发人员和新员工来说,在不增加太多时间的情况下就开始进行贡献相对容易。但这几乎就是代码风格的任何好处都无法体现的地方。 我全心全意地支持我们为改善代码库所做的一切尝试,但是在这样的大规模范式转换中,从团队的其他成员那里得到一些回击是很普遍的。当前几个最大的症结是: 单元测试 班数 同行评审的复杂性 单元测试对于团队来说是一笔难以置信的辛苦卖点,因为他们所有人都认为这是浪费时间,并且他们能够比单个代码更快地整体测试代码。使用单元测试作为SOLID的认可在大多数情况下是徒劳的,并且在这一点上已经成为一个笑话。 上课人数可能是要克服的最大障碍。过去需要5-10个文件的任务现在可以占用70-100!尽管每个文件都有不同的用途,但文件的数量却是巨大的。团队的反应主要是吟和头部抓挠。以前,一项任务可能需要一个或两个存储库,一个或两个模型,一个逻辑层和一个控制器方法。 现在,要构建一个简单的文件保存应用程序,您需要一个类来检查文件是否已存在,一个类来编写元数据,一个类来进行抽象,DateTime.Now以便您可以投入时间进行单元测试,为每个包含逻辑的文件插入接口,包含每个类的单元测试,以及一个或多个文件以将所有内容添加到您的DI容器中。 对于中小型应用程序,SOLID非常容易出售。每个人都看到了可维护性的好处和便利。但是,他们只是没有看到SOLID在超大型应用程序中具有很好的价值主张。因此,我正在尝试寻找改善组织和管理的方法,以使我们度过不断增长的痛苦。 我以为基于最近完成的任务,可以更详细地说明文件量的示例。我被赋予一项任务,以在我们的一种较新的微服务中实现某些功能,以接收文件同步请求。收到请求后,服务将执行一系列查找和检查,最后将文档以及2个单独的数据库表保存到网络驱动器。 要将文档保存到网络驱动器,我需要一些特定的类: - …

11
为什么注释块很重要?
曾经有人说过,我们应该在所有方法的前面加上 /// <summary>注释块(C#),但没有解释原因。 我开始使用它们,发现它们使我非常恼火,因此停止使用它们,除了库和静态方法。它们体积庞大,我总是忘记更新它们。 是否有充分的理由/// <summary>在代码中使用注释块? 我通常//一直在使用注释,这只是/// <summary>我想知道的内容。
49 c#  comments 

3
哪种更好的做法-辅助方法是实例还是静态?
这个问题是主观的,但是我很好奇大多数程序员是如何做到这一点的。下面的示例使用伪C#,但这也应适用于Java,C ++和其他OOP语言。 无论如何,当在我的类中编写辅助方法时,我倾向于将它们声明为静态方法,并且仅在辅助方法需要它们时才传递字段。例如,给定以下代码,我更喜欢使用方法调用#2。 class Foo { Bar _bar; public void DoSomethingWithBar() { // Method Call #1. DoSomethingWithBarImpl(); // Method Call #2. DoSomethingWithBarImpl(_bar); } private void DoSomethingWithBarImpl() { _bar.DoSomething(); } private static void DoSomethingWithBarImpl(Bar bar) { bar.DoSomething(); } } 我这样做的原因是,它使(至少在我看来)清楚地知道了helper方法可能对其他对象产生副作用-即使没有阅读其实现方法。我发现我可以快速掌握使用该实践的方法,从而帮助我进行调试。 您更喜欢在自己的代码中执行哪些操作?这样做的原因是什么?

9
为什么构造函数中的while(true)循环实际上不好?
尽管是一个普遍的问题,但我的范围是C#,因为我知道像C ++这样的语言在构造函数执行,内存管理,未定义的行为等方面具有不同的语义。 有人问我一个有趣的问题,对我来说不容易回答。 为什么(或者根本不?)让类的构造函数开始永无止境的循环(即游戏循环)被认为是不好的设计? 有一些与此有关的概念: 像最小惊讶原则一样,用户并不希望构造函数具有这种行为。 单元测试比较困难,因为您无法创建此类或将其注入,因为它永远不会退出循环。 从概念上讲,循环的结束(游戏结束)是构造函数完成的时间,这也是奇怪的。 从技术上讲,此类除了构造函数外没有其他公共成员,这使它很难理解(尤其是对于没有可用实现的语言) 然后是技术问题: 构造函数实际上从未完成,所以GC在这里发生了什么?这个对象已经在Gen 0中了吗? 由于基本构造函数从不返回,因此无法或至少非常复杂地从此类派生 这样的方法是否存在更明显的弊端或弊端?
47 c#  architecture 

12
避免使用“ goto”伏都教?
我有一个switch可以处理几种情况的结构。对进行switch操作会enum通过组合值引起重复代码的问题: // All possible combinations of One - Eight. public enum ExampleEnum { One, Two, TwoOne, Three, ThreeOne, ThreeTwo, ThreeOneTwo, Four, FourOne, FourTwo, FourThree, FourOneTwo, FourOneThree, FourTwoThree, FourOneTwoThree // ETC. } 当前,该switch结构分别处理每个值: // All possible combinations of One - Eight. switch (enumValue) { case One: DrawOne; break; case Two: DrawTwo; …

3
为什么C#允许接口中的属性?
在C#中,以下代码有效 interface I{ int property{get;set;} } 这对我来说毫无意义。这似乎打破了接口最重要的原则之一:缺少状态(换句话说,没有字段)。该属性是否不会创建隐式私有字段?这对接口真的不好吗?

1
为什么.Net世界似乎包含魔术字符串而不是静态类型的替代字符串?
因此,我在.Net中工作。我在.Net中制作开源项目。我最大的问题之一不是.Net的必要性,而是它周围的社区和框架。似乎到处都有神奇的命名方案和字符串被视为做所有事情的最佳方法。大胆的声明,但看看它: ASP.Net MVC: 您好世界路线: routes.MapRoute( "Default", // Route name "{controller}/{action}/{id}", // URL with parameters new { controller = "Home", action = "Index", id = "" } // Parameter defaults ); 这意味着ASP.Net MVC将以某种方式HomeController在您的代码中查找。以某种方式创建它的新实例,然后Index 显然使用某种id参数调用该函数。然后还有其他类似的东西: RenderView("Categories", categories); ...or.. ViewData["Foobar"]="meh"; 然后XAML也有类似的事情。DataContext被视为一个对象,您必须希望并祈祷它可以解析为所需的类型。DependencyProperties必须使用魔术字符串和魔术命名约定。像这样的事情: MyData myDataObject = new MyData(DateTime.Now); Binding myBinding = new Binding("MyDataProperty"); myBinding.Source = …

3
什么是构造函数注入?
在浏览有关(服务定位器)设计模式的文章时,我一直在研究构造函数注入和依赖注入这两个术语。 当我搜索构造函数注入时,我得到的结果不清楚,这促使我在这里进行检查。 什么是构造函数注入?这是一种特定类型的依赖项注入吗?一个典型的例子将有很大的帮助! 编辑 一周的时间后,我又重新审视了这个问题,我看到自己迷失了……万一其他人突然出现在这里,我将通过一点我的学习来更新问题的正文。请随时发表评论/纠正。 构造函数注入和属性注入是两种类型的依赖注入。

4
为什么以及何时使课程“静态”?类上的“静态”关键字的目的是什么?
用static多种语言在成员上使用关键字表示您不应创建该类的实例才能访问该成员。但是,我认为没有理由进行整个课堂学习static。我为什么以及何时上课static? 上课能给我带来什么好处static?我的意思是,在声明静态类之后,仍然应该将他/她希望不带实例化即可访问的所有成员也声明为静态。 例如,这意味着Math可以将类声明为普通(非静态),而不会影响开发人员的编码方式。换句话说,将类设为静态或普通对开发人员而言是透明的。

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.