Questions tagged «c#»

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

4
包含多个类的C#文件的命名约定是什么?
想要改善这篇文章吗?提供此问题的详细答案,包括引文和为什么答案正确的解释。没有足够详细信息的答案可以被编辑或删除。 此问题是从Stack Overflow 迁移而来的,因为可以在Software Engineering Stack Exchange上回答。 迁移 8年前。 在C#项目中,我们经常将紧密相关的小型类分组到同一.cs文件中。这种做法减少了处理大量几乎没有实际代码的文件带来的麻烦。但是,是否存在命名包含多个类的文件的惯例?
20 c#  .net 

3
具有共同功能的Windows窗体的最佳设计
过去,我使用继承来允许在应用程序中扩展Windows窗体。如果我所有的表单都具有公共控件,插图和功能,那么我将创建一个实现公共控件和功能的基本表单,然后允许其他控件从该基本表单继承。但是,我在设计时遇到了一些问题。 控件一次只能放在一个容器中,因此您拥有的任何静态控件都将很棘手。例如:假设您有一个称为BaseForm的基本表单,其中包含一个TreeView,并对其进行了保护和静态处理,以便此类的所有其他(派生)实例都可以修改和显示相同的TreeView。这对于从BaseForm继承的多个类不起作用,因为TreeView一次只能位于一个容器中。它可能在初始化的最后一个表单上。尽管每个实例都可以编辑该控件,但在给定时间只能显示一个。当然,有一些变通方法,但是它们都很丑陋。(这对我来说似乎是一个非常糟糕的设计。为什么多个容器不能存储指向同一对象的指针?无论如何,它就是它。) 表单之间的状态,即按钮状态,标签文本等,我必须使用全局变量并在Load上重置状态。 Visual Studio的设计师并不能很好地支持此功能。 是否有更好但仍易于维护的设计可供使用?还是形式继承仍然是最好的方法? 更新 从查看MVC到MVP,从观察者模式到事件模式。这是我目前的想法,请批评: 我的BaseForm类将仅包含控件以及与这些控件相关的事件。需要任何逻辑来处理它们的所有事件都将立即传递给BaseFormPresenter类。此类将处理来自UI的数据,执行任何逻辑操作,然后更新BaseFormModel。该模型会将事件(状态更改时将触发)的事件公开给Presenter类,该类将订阅(或观察)该事件。演示者收到事件通知后,它将执行任何逻辑,然后演示者将相应地修改视图。 内存中每个Model类只有一个,但是可能存在许多BaseForm实例,因此有BaseFormPresenter。这将解决我将BaseForm的每个实例同步到相同数据模型的问题。 问题: 哪一层应该存储最后按下的按钮之类的内容,以便我可以在表单之间为用户(例如CSS菜单中)突出显示它? 请批评这个设计。谢谢你的帮助!

2
从运行时获取的类型动态生成类
是否可以用C#(或任何其他语言)执行以下操作? 我正在从数据库中获取数据。在运行时,我可以计算获取的列数和数据类型。 接下来,我想使用这些数据类型作为字段“生成”一个类。我还想存储我在集合中获取的所有记录。 问题是我想在运行时同时执行步骤1和2 这可能吗?我目前正在使用C#,但如果需要的话,可以改用其他软件。

3
C#实际上是一种多平台语言吗?
此问题是从Stack Overflow 迁移而来的,因为可以在Software Engineering Stack Exchange上回答。 迁移 8年前。 C#(和一般的.net平台)看起来正成为多目标应用程序的不错选择: 官方MS .net框架:全面的Windows开发,asp.net开发,Windows Phone开发等 mono及其所有派生产品:monotouch,monodroid:世界其他地区。该工具今天是RTM。 这是否意味着C#成为针对最受欢迎的平台(台式机,Web和移动设备)的一种好语言? 使用目标平台(目标C,Java等)的“本机”语言是否还更好? 它只是一团烟雾,只有营销语言吗? 请注意,我实际上意识到我无法在平台之间复制/粘贴代码。但是我确信可以重用较低层的应用程序(模型,业务等),但是我知道我必须将较高层(Gui等)适应该平台。我的目标是更专注于必需的技能,而不是技术代码共享。 [edit]我是一家大规模使用c#的公司的ac#开发人员。这就是为什么我在扩展公司目标平台范围的计划中谈到c#的原因。
20 c#  mono  monodroid 

7
程序员如何使用高级语言处理低级软件开发?
我对编程有些陌生,而提出这个问题的最佳方法是举一个例子。 我知道如何用Java和C#做基本的事情。诸如小型Windows窗体应用程序之类的东西或使类成为通用类。我基本上一直在学习,并且还没有尝试做任何大的事情。无论如何,我一直很好奇事情在幕后的完成方式,我想你会说。 我知道所有内容都归结为1和0,并且汇编语言基本上为1和0的模式提供命令,但是似乎从那里跳到了:为此使用一个库作为该库。在我看来,没有库就可以执行的所有C#操作都是算术和二进制逻辑。要获取输入或输出,请使用库等。 我知道这个问题对某些人来说似乎很明显,我知道我有很多东西要学,但我什至不知道从哪里开始这样的问题。谢谢。 所以我的问题是这样的: 如果有人要制作虚拟机或Playstation仿真器,操作系统或驱动程序,或将mp3支持添加到媒体播放器,或者制作自己的文件类型,等等。我看不到用C#或Java来完成的方式。 换句话说,如果我读WROX的《 Professional C#》或OReilly的《 Programming C#》之类的书,我会知道该怎么做吗?还是您必须学习汇编语言或诸如C ++这样的低级语言?

4
用于GUI编程的Delphi vs C#[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 我来自PHP和Python的背景,对C的了解很少,我做了很多基于Web的应用程序,现在我正在考虑Windows平台的桌面应用程序。 一个朋友告诉我去Delphi,其他人说C#是最好的,嗯,我正在寻找的是 简单 生产率 好的API文档 速度 拖放 多线程和良好的网络API 谢谢
20 c#  delphi 

3
永远不要让公众成员虚拟/抽象-是吗?
早在2000年代,我的一位同事就告诉我,将公共方法虚拟化或抽象化是一种反模式。 例如,他认为这样的课程设计得不好: public abstract class PublicAbstractOrVirtual { public abstract void Method1(string argument); public virtual void Method2(string argument) { if (argument == null) throw new ArgumentNullException(nameof(argument)); // default implementation } } 他说 实现Method1并重写的派生类的开发人员Method2必须重复参数验证。 如果基类的开发人员决定在Method1或Method2以后的可自定义部分周围添加一些内容,他将无法执行。 相反,我的同事提出了这种方法: public abstract class ProtectedAbstractOrVirtual { public void Method1(string argument) { if (argument == null) throw new …

7
模式与原理的区别
面向对象的设计模式和原理之间有什么区别?他们是不同的东西吗?据我了解,他们两个都试图实现一些共同的目标(例如灵活性)。那么我可以说模式是原则,反之亦然吗? 设计原理= SOLID(即依赖反转原理) 设计模式= Gof(即抽象工厂模式)

3
我应该如何提供有关异常的其他信息?
每当我需要提供有关异常的其他信息时,我都会想知道哪种方法实际上是正确的方法。 为了这个问题,我写了一个例子。假设有一个我们要更新Abbreviation属性的类。从SOLID的角度来看,这可能并不完美,但是即使我们通过具有某些服务的DI 传递了工作方法,也会发生相同的情况-发生异常,并且没有上下文。回到示例... class Person { public int Id { get; set; } public string Name { get; set; } public string Abbreviation { get; set; } } 然后是该类的一些实例和一个调用worker方法的循环。它可以抛出StringTooShortException。 var persons = { new Person { Id = 1, Name = "Fo" }, new Person { Id = 2, Name …
20 c#  exceptions 

1
复制关于接口实现/重写文档的好坏?
所以我们有一个像这样的界面 /// <summary> /// Interface for classes capable of creating foos /// </summary> public interface ICreatesFoo { /// <summary> /// Creates foos /// </summary> void Create(Foo foo); /// <summary> /// Does Bar stuff /// </summary> void Bar(); } 最近,我们播放了一个文档故事,涉及生成并确保像上面那样有大量XML文档。但是,这导致了很多重复的文档。示例实现: /// <summary> /// A Foo Creator which is fast /// </summary> …

3
包装器在包装同一对象时是否应该使用==运算符比较相等?
我正在为XML元素编写包装器,使开发人员可以轻松地解析XML中的属性。包装器除了被包装的对象外没有其他状态。 我正在考虑以下实现(此示例已简化),其中包括==操作员的重载。 class XmlWrapper { protected readonly XElement _element; public XmlWrapper(XElement element) { _element = element; } public string NameAttribute { get { //Get the value of the name attribute } set { //Set the value of the name attribute } } public override bool Equals(object other) { var o …
19 c#  .net  operators 

8
有没有比TryGetValue使用C#词典更好的方法?
我发现自己经常在网上查找问题,许多解决方案都包括字典。但是,每当我尝试实现它们时,我的代码都会令人讨厌。例如,每次我想使用一个值时: int x; if (dict.TryGetValue("key", out x)) { DoSomethingWith(x); } 这是4行代码,基本上可以执行以下操作: DoSomethingWith(dict["key"]) 我听说使用out关键字是一种反模式,因为它会使函数改变其参数。 另外,我发现自己经常需要“反向”字典,在其中翻转键和值。 同样,我经常想遍历字典中的各项,发现自己将键或值转换为列表等以更好地做到这一点。 我觉得几乎总是有一种更好,更优雅的字典使用方式,但是我很茫然。

8
C#-为什么不鼓励在字段上使用前缀?
过去,我们使用匈牙利符号。现在将其视为passé,并且在大多数情况下,我不再使用它,但是我仍然发现该m_前缀用于表示成员字段。 对我来说,如果我正在阅读别人的代码,就会看到以下内容: count = 3; 我假设这count是该函数的局部变量,并且我正在做将在该函数的其他地方使用的操作。如果我看到这个: m_count = 3; 我立即意识到我正在更新对象的状态。 Microsoft风格指南说这是做事的错误方法。我应该像在函数中定义的临时变量一样命名我的非公共字段。不m_,甚至没有简单的下划线。 是的,我们可以定义自己的编码样式,但是接下来我必须努力使用各种静态代码分析工具,以使他们相信我们的处事方式还可以。 我很高兴能够更改为Microsoft风格,但是我想知道为什么事情是这样。 为什么现在不能分辨一个变量是函数本地变量还是成员变量,这为什么认为很糟糕? PS这非常类似于c#领域和方法前面关于“ this”关键字的当前最佳实践是什么?,但我问的m_不是this. PPS另请参见Microsoft为什么使参数,局部变量和私有字段具有相同的名称命名约定?


2
何时在构造函数上使用[Pure]?
我正在学习.NET中的代码协定,并且试图了解纯构造函数的概念。该代码合同文档状态: 合同中调用的所有方法都必须是纯函数。也就是说,它们不得更新任何先前存在的状态。允许使用纯方法修改进入纯方法后创建的对象。 并且PureAttribute文档指出: 指示类型或方法是纯类型,即,它不进行任何可见状态更改。 对于方法,我理解这些语句,但是构造函数呢?假设您有一个像这样的课程: public class Foo { public int Value { get; set; } public Foo(int value) { this.Value = value; } } 显然,此构造函数确实会影响新Foo对象的状态,但是它没有其他副作用(例如,它不操纵任何参数或调用任何非纯方法)。这是候选人[Pure]吗?[Pure]在构造函数上放置属性的意义是什么?何时应该在自己的代码中执行此操作?

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.