Questions tagged «c#»

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

5
我应该使用抽象方法还是虚拟方法?
如果我们假设不希望基类成为纯接口类,并使用下面的两个示例,那么使用抽象或虚拟方法类定义是更好的方法吗? “抽象”版本的优点是它看起来更简洁,并强制派生类提供希望的有意义的实现。 “虚拟”版本的优点是可以轻松地由其他模块插入并用于测试,而无需像抽象版本那样添加大量底层框架。 摘要版本: public abstract class AbstractVersion { public abstract ReturnType Method1(); public abstract ReturnType Method2(); . . public abstract ReturnType MethodN(); ////////////////////////////////////////////// // Other class implementation stuff is here ////////////////////////////////////////////// } 虚拟版本: public class VirtualVersion { public virtual ReturnType Method1() { return ReturnType.NotImplemented; } public virtual ReturnType Method2() …
11 c#  design 

4
返回只读对象的最佳实践
我对C#中的OOP有“最佳实践”问题(但它适用于所有语言)。 考虑使库类具有要通过属性访问器公开的对象,但是我们不希望公众(使用此库类的人)对其进行更改。 class A { // Note: List is just example, I am interested in objects in general. private List<string> _items = new List<string>() { "hello" } public List<string> Items { get { // Option A (not read-only), can be modified from outside: return _items; // Option B (sort-of read-only): …

2
需要解释C#规范中的部分
我正在阅读C#规范。我可以在一个段上使用澄清: C#具有统一的类型系统。所有C#类型(包括基本类型(如int和double))都从单个根对象类型继承。因此,所有类型都共享一组通用操作,并且任何类型的值都可以以一致的方式存储,传输和操作。此外,C#支持用户定义的引用类型和值类型,从而允许对象的动态分配以及轻量级结构的内联存储。 在这种情况下,“轻型结构的在线存储”是什么意思?

2
用多个“屏幕”构建Winform应用程序的正确方法是什么
构建具有多个“屏幕”的Winform应用程序的正确方法是什么?例如,我正在尝试编写一个小的备份程序(主要用于咯咯笑),并且我一直在将控件和容器转储到表单上。 我正在使用面板和组框来分隔不同的屏幕(例如:我正在使用一个面板来保存“设置”窗口的所有控件,而另一个面板来显示已设置的所有当前备份)。好吧,我的form.cs文件膨胀成大量的代码,我感觉自己做错了什么。我几乎找不到文件中的任何内容,现在可以重新开始了。这个项目只是为了扩展我对C#和.NET的了解,因此开始一个新项目并不是一件大事。
11 c#  gui  winforms  gui-design 

13
处理大括号汤
我已经在C#和VB.NET中编程了多年,但主要是在VB中编程。我正在向C#转变职业生涯,总的来说,我更喜欢C#。 我遇到的一个问题是大括号汤。在VB中,每个结构关键字都有一个匹配的close关键字,例如: Namespace ... Class ... Function ... For ... Using ... If ... ... End If If ... ... End If End Using Next End Function End Class End Namespace 用C#编写的同一代码最终很难阅读: namespace ... { class ... { function ... { for ... { using ... { if ... { …

5
由于什么原因,我应该在C#中保持“使用”部分的整洁?
重构代码后,我将IDE转到C#类的using部分,并清除了未使用的名称空间和重复的名称空间,并对它们进行了排序。 我的一对(配对编程)问我原因。我不知道为什么要这么做。我这样做是出于保持我的所有代码整洁的习惯。我的意思是,我告诉他,一般而言,拥有简洁的代码是一个好主意,但是当然,这并不是一个很好的理由,因为我什至不花时间在任何C#代码页的using部分中。 由于多次将类或枚举(或通常的类型)从一个名称空间移动到另一个名称空间,这会在代码中添加新的using语句(通过手动在代码窗口中向上并自己编写using语句,或通过编辑器使用Alt+ Ctrl+ F10组合),并且由于这些新的using语句将添加到using节的末尾,这使得它们不会按字母顺序排序,并且由于编译器从不抱怨这些问题中的任何一个,因此我们为什么要关心这样做节整洁?我们可能有什么原因?

4
使用“混合”语言进行设计:面向对象的设计还是功能编程?
在过去的几年中,我喜欢使用的语言变得越来越“实用”。我现在使用的是一种“混合”语言:C#,F#,Scala。我喜欢使用与域对象相对应的类来设计我的应用程序,并使用使编码更容易,更简洁和更安全的功能功能(尤其是对集合进行操作或传递函数时)。 但是,当涉及到设计模式时,这两个世界会“冲突”。我最近遇到的特定示例是观察者模式。我希望生产者在创建或更改项目时通知其他一些代码(“消费者/观察员”,例如数据库存储,记录器等)。 我最初是这样“功能性地”完成的: producer.foo(item => { updateItemInDb(item); insertLog(item) }) // calls the function passed as argument as an item is processed 但是我现在想知道是否应该使用更多的“ OO”方法: interface IItemObserver { onNotify(Item) } class DBObserver : IItemObserver ... class LogObserver: IItemObserver ... producer.addObserver(new DBObserver) producer.addObserver(new LogObserver) producer.foo() //calls observer in a loop 两种方法的优缺点是什么?我曾经听过一位FP专家说,那里的设计模式仅是由于语言的局限性,这就是为什么功能语言很少的原因。也许这可能是一个例子? 编辑:在我的特定情况下,我不需要它,但是..您将如何以功能方式实现“观察者”的删除和添加?(即,您将如何实现模式中的所有功能?)例如,仅传递一个新函数?

3
C#中的各种集合通用接口之间的区别
我已经从事Windows的C#和ASP.net MVC开发工作了一段时间。但是我在一些方面仍然不清楚。我试图了解使用和互换相似种类的通用集合接口之间的基本区别和性能问题。 之间有什么根本区别IEnumerable<T>,ICollection<T>,List<T>(Class)? 我似乎在使用和交换它们时在我的应用程序中没有发现任何问题。另外,还有其他类似的通用集合可以与这三个集合互换吗?

4
Scala代替Java是一个不错的选择吗?
我们将开始一个新项目,其中将培训所有使用Java(frameworks / ECO system等)的.net开发人员。我们有很多用C#编写的代码,似乎所有这些都将浪费掉,因为我们必须用Java重新编写所有代码。我看到的问题是,大约第一年(可能是两年),我们将无法交付任何东西,因为我们将大部分时间用于重现Java以前但现在的内容。 由于我们的团队分布在世界各地的不同办公室,并且我们有大量的Java开发人员(20至30名)和10位使用.net的开发人员,因此我们希望让所有开发人员都使用相同的语言/平台,以便我们开始重用组件/模块。所以我可以理解管理层的观点。 昨天我遇到了Scala,并想知道将它与当前产品(用C#编写)一起使用是否会更好,然后至少一年后我们将有一个有效的产品。同样在一年中,我们在迁移产品的其他部分时可以在Java世界中使用这些模块。 考虑到我们要实现的目标,Scala是比Java更好的选择吗?
11 java  c#  scala 

2
动态语言运行时和C#4.0之间有什么关系?
假设我想在当今存在的.NET平台上创建动态语言编译器/解释器,或者是Scheme解释器。使用动态语言运行时(DLR)还是使用C#4.0来实现我的语言的动态功能,我会更好吗?还是我都需要? 我知道在这方面还有其他工作要做,尤其是IronScheme和IronPython。这两种语言都使用DLR。我相信IronPython使用的是最新版本的DLR(大约有一年的历史了),而IronScheme使用的是早期版本的DLR的早期,经过大量修改的分支。但是创建这些编译器时C#4.0不可用。 我已经看过Rob Conery与Massive的合作,它使用C#4.0的动态功能。这是非常令人印象深刻的。但是C#是否能够承受动态语言编译器/解释器的全部工作?DLR中是否存在C#中缺少的功能,或者DLR本质上已集成到C#4.0中?如果仅使用C#4.0,我会缺少DLR的任何重要功能吗?

3
在哪里可以阅读Microsoft的原始C#简介论文?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,以使它成为软件工程堆栈交换的主题。 6年前关闭。 当Microsoft在2002年提出.NET Framework和C#语言时,第一篇介绍C#的文章是什么? 我正在寻找在MSDN或Microsoft网站上发布的一些论文,这些论文将解释对另一种语言的需求,讨论一些背景知识,也许还有一些代码示例。 另外,我对原始的C#简介感兴趣,而不对通用的.NET Framework文档感兴趣。 我记得早期的.NET文章相当模糊,尽管重新阅读它们确实很有趣,但我的目标是以语言为中心的文档。
11 c#  microsoft  history  msdn 

4
对数据对象使用依赖注入?
我只是在学习有关依赖项注入的知识,并且陷入了困境。依赖注入建议通过构造函数发送依赖类,但是我想知道对于数据对象是否需要这样做。由于单元可测试性是DI的主要优点之一,因此仅存储数据而不对任何过程进行数据测试的数据对象都会使DI成为不必要的复杂性层,或者它甚至仍然有助于显示依赖性与数据对象? Class DO{ DO(){ DataObject2List = new List<DO2>(); } public string Field1; public string Field2; public List<DO2> DataObject2List; } Class DO2{ public DateTime Date; public double Value; }

8
变量命名约定?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 4年前关闭。 我刚刚开始使用ReSharper(用于C#),我有点喜欢它的代码气味查找器,它向我展示了我很久以前就打算解决的一些内容(主要是变量命名约定)。 这使我重新考虑了一些方法和实例变量的命名约定。ReSharper建议实例变量为小写字母并以下划线开头。有一阵子,我打算让我所有的局部变量都变成小写,但是下划线是必要的吗?你觉得舒服吗?我不喜欢这个约定,但是我还没有尝试过,您对此有何看法? 促使我重新评估的第二件事是我对GUI事件处理程序的命名约定。我通常使用ControlName_Action的VS标准,而我的控件通常使用匈牙利表示法(作为后缀,以帮助在代码中阐明用户可见的内容以及在处理类似命名的变量时不可见的内容),所以我最终得到OK_btn_Click( ),您对此有何看法?我应该屈从于ReSharper公约还是其他同样有效的选择?
11 c#  naming  resharper 

1
有人知道MonoDroid是否真的死了吗?
我公司最近投资了Visual Studio 的Mono for Android工具,因为我们有很多.NET开发人员,并且对Monodroid工具的强大功能印象深刻。阅读《ZDNet帖子》后,我很伤心地看到这个项目可能已经死了。除了该文章中列出的内容之外,还有没有其他人对此有更多了解?显然,许多开发人员从mono项目中解脱出来,但我想知道这是否是真的。任何信息将不胜感激。我们刚刚购买了Enterprise 5许可证,这是非常昂贵的,如果我刚购买并开始学习它后就死了,我会非常生气!
11 c#  .net  monodroid 

10
属性的重点是什么?
以下是一些有关属性的参数和我的反参数: 比编写getter和setter方法更容易使用 Getter和setter方法对是代码的味道。编写起来更容易,就像使用Scantron表格并填写所有“ C”来简化数学测试失败一样。对于持久性,仅包含状态的对象不应使用getter / setter,而在持久性时应创建不可变的对象。 对于对象的消费者而言,重要的是它的作用,而不是它的作用方式。它的行为就是它所做的;它的状态是如何执行的。如果您发现自己关心对象的状态(持久性除外,尽管这也会破坏OO),那么您根本就没有在做OOP而失去了它的优势。 它们粗略地向消费者表明了性能 对于任何给定的财产,这可能会在将来发生变化。假设在版本1.0中,访问PropertyX只是返回一个字段。在版本1.5中,如果该字段为null,则PropertyX使用Null Object模式创建一个新的null对象。在2.0版中,该字段正在通过PropertyX中的getter方法进行进一步验证。 随着属性变得越来越复杂,使用属性的性能指标似乎越来越不真实。 他们比公共领域更好 这是真的。但是方法也是如此。 它们代表的是与方法根本不同的对象方面,并且对象的所有使用者都应注意这一点 您确定以上两个陈述都是正确的吗? 他们更容易打字,伙计 当然,打字myObject.Length比打字更容易myObject.Length(),但是不能用一点句法糖来解决吗? 为什么使用方法而不是属性? 没有性能保证。即使方法变得更复杂,API也会保持真实。如果消费者遇到性能问题,并且他们不依赖API的话,他们将需要分析其代码。 较少供消费者考虑。该酒店有塞特犬吗?一种方法肯定不会。 消费者从正确的OOP思维方式进行思考。作为API的使用者,我有兴趣与对象的行为进行交互。当我在API中看到属性时,它看起来很像状态。实际上,如果属性做得太多,它们甚至都不应该是属性,因此,实际上,API对用户来说是处于状态的属性。 API的程序员将更深入地考虑具有返回值的方法,并尽可能避免在此类方法中修改对象的状态。应当尽可能将命令与查询分开。 所以我问你,为什么要使用属性而不是方法?MSDN上的大多数要点本身就是代码的味道,它们既不属于属性也不属于方法。 (这些想法是在考虑了CQS之后想到的。)

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.