Questions tagged «c#»

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

4
将标志用于“分组”枚举是否错误?
我的理解是,[Flag]枚举通常用于可以组合的事物,其中各个值并不相互排斥。 例如: [Flags] public enum SomeAttributes { Foo = 1 << 0, Bar = 1 << 1, Baz = 1 << 2, } 凡SomeAttributes值可以是一个组合Foo,Bar和Baz。 在更复杂的现实场景中,我使用一个枚举来描述DeclarationType: [Flags] public enum DeclarationType { Project = 1 << 0, Module = 1 << 1, ProceduralModule = 1 << 2 | Module, ClassModule = 1 …
12 c#  .net  readability  enum 

5
如何避免在管理缓存的类中违反SRP?
注意:代码示例是用c#编写的,但这无关紧要。我将c#用作标签,因为找不到更合适的标签。这是关于代码结构的。 我正在阅读Clean Code,并试图成为一个更好的程序员。 我经常发现自己难以遵循“单一责任原则”(类和功能只能做一件事),尤其是在功能方面。也许我的问题是“一件事”的定义不明确,但仍然... 一个例子:我在数据库中有一个Fluffies列表。我们不在乎什么是蓬松。我想上课恢复蓬松。但是,蓬松可以根据某些逻辑进行更改。根据某些逻辑,此类将从缓存中返回数据或从数据库中获取最新数据。我们可以说它管理蓬松,这是一回事。为了简单起见,假设加载的数据可以使用一个小时,然后必须重新加载。 class FluffiesManager { private Fluffies m_Cache; private DateTime m_NextReload = DateTime.MinValue; // ... public Fluffies GetFluffies() { if (NeedsReload()) LoadFluffies(); return m_Cache; } private NeedsReload() { return (m_NextReload < DateTime.Now); } private void LoadFluffies() { GetFluffiesFromDb(); UpdateNextLoad(); } private void UpdateNextLoad() { m_NextReload = DatTime.Now …

2
如何编写抽象数据库接口以支持多种数据库类型?
如何开始在其较大的应用程序中设计一个抽象类,该类可以与多种类型的数据库(例如MySQL,SQLLite,MSSQL等)接口? 这个设计模式叫什么,它从哪里开始呢? 假设您需要编写一个具有以下方法的类 public class Database { public DatabaseType databaseType; public Database (DatabaseType databaseType){ this.databaseType = databaseType; } public void SaveToDatabase(){ // Save some data to the db } public void ReadFromDatabase(){ // Read some data from db } } //Application public class Foo { public Database db = new …
12 c#  database 

5
非连续数组性能好吗?
在C#中,当用户创建一个List<byte>并向其中添加字节时,它有可能用完空间并需要分配更多空间。它分配前一个数组的大小的两倍(或其他倍数),复制字节并丢弃对旧数组的引用。我知道该列表成倍增长,因为每次分配都很昂贵,这将其限制在O(log n)分配范围内,10每次仅添加额外的项就会导致O(n)分配。 但是,对于大型阵列,可能会浪费大量空间,可能几乎是阵列的一半。为了减少内存,我写了一个类似的类NonContiguousArrayList,List<byte>如果列表中的内存少于4MB,它将用作后备存储,然后它会NonContiguousArrayList随着大小的增加分配额外的4MB字节数组。 与List<byte>这些阵列不同,它们是非连续的,因此周围没有数据复制,只有额外的4M分配。查找项目时,将索引除以4M以获得包含该项目的数组的索引,然后对4M取模以获取数组内的索引。 您能指出这种方法的问题吗?这是我的清单: 不连续的数组没有缓存局部性,这会导致性能下降。但是,在4M的块大小下,似乎将有足够的位置进行良好的缓存。 访问一个项目不是那么简单,存在一个间接的附加级别。这会优化吗?会导致缓存问题吗? 由于达到4M限制后线性增长,因此您可以分配比平时更多的分配(例如,对于1GB内存,最多可以分配250个分配)。4M之后不会复制任何额外的内存,但是我不确定额外的分配是否比复制大块内存更昂贵。
12 c# 

2
在源代码中隐藏API密钥的最佳方法
我需要一些有关如何保护应用程序(尤其是ac#.NET应用程序)中的私有API密钥的想法。 首先,我了解到从理论上讲不可能在源代码中隐藏任何内容,因此我想出了另一个想法,但是我不确定它的合理性。无论如何,是否有可能以某种方式与Web服务器通信以验证私钥,然后再与应用程序对话以确认它是合法的握手? 我有两个密钥可以使用:一个公共密钥(顾名思义,不必像对待私有密钥一样小心对待),以及一个私有密钥,它需要与他人保持安全。 我将如何做到这一点的任何想法将不胜感激。
12 c#  api  authentication 

9
设计继承如何导致额外的费用?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 6年前关闭。 所以,我想继承一个sealed class在CSHARP,结果被烧毁。除非您有权访问源,否则无法解封。 然后,我想到了“为什么sealed甚至存在?”。4个月前。尽管阅读了很多有关内容的文章,但我还是不知道,例如: 乔恩·斯凯特(Jon Skeet)的愿望是:“ 类在.NET中默认为封闭的。 ” 比继承更偏爱组成? “您不应该密封所有课程(...)” 您如何模拟密封课程? 从那以后我一直试图消化所有这些,但是对我来说太过分了。最终,昨天我再次尝试了。我再次扫描了所有这些文件,还有更多: 为什么一个班级应该不是“抽象”或“最终/密封”之外的任何东西? 在超过15年的编程时间中,我第一次听说SOLID时,是从已经链接的问题的答案中得出的,显然我四个月前都没有读过它 最后,经过深思熟虑,我决定根据新标题对原始问题进行大量编辑。 在老问题过于宽泛和主观的。基本上是在问: 旧标题中:使用密封的一个很好的理由 在正文中:如何正确修改密封类?忘记继承?使用成分? 但是现在,理解(我昨天没做过)所有事情sealed都在阻止继承,我们可以并且确实应该在继承上使用组合,我意识到我需要的是实际示例。 我想我的问题是(实际上一直都是)Mindor先生在聊天中向我提出的建议:继承设计如何导致额外的成本?
12 c#  inheritance 

4
我将如何设计一个接口,以使其清楚哪些属性可以更改其值,哪些属性将保持不变?
我在有关.NET属性的设计问题。 interface IX { Guid Id { get; } bool IsInvalidated { get; } void Invalidate(); } 问题: 此接口具有两个只读属性,Id和IsInvalidated。但是,它们本身是只读的事实本身并不能保证它们的值将保持不变。 可以说,我的意图是要清楚地表明…… Id 表示一个常量值(因此可以安全地缓存),而 IsInvalidated可能会在IX对象的生存期内更改其值(因此不应缓存)。 我如何修改interface IX以使该合同足够明确? 我自己尝试的三种解决方案: 该界面已经过精心设计。调用方法的存在Invalidate()使程序员可以推断出类似名称的属性的值IsInvalidated可能会受到它的影响。 仅在方法和属性的命名类似的情况下,此参数才成立。 通过事件增强此接口IsInvalidatedChanged: bool IsInvalidated { get; } event EventHandler IsInvalidatedChanged; …Changed事件的存在IsInvalidated表明该属性可能会更改其值,而事件的类似事件的缺失Id则表明该属性不会更改其值。 我喜欢这种解决方案,但其中很多其他的东西可能根本就不会使用。 IsInvalidated用以下方法替换属性IsInvalidated(): bool IsInvalidated(); 这可能太微妙了。可以暗示每次都会重新计算一个值-如果它是一个常数,则不需要。MSDN主题“在属性和方法之间选择”对此有这样的说明: 在以下情况下,请使用方法而不是属性。[…]每次调用操作都会返回不同的结果,即使参数没有更改。 我希望得到什么样的答案? 我对解决该问题的完全不同的解决方案最感兴趣,并给出了它们如何击败我的上述尝试的解释。 如果我的尝试在逻辑上有缺陷或具有尚未提及的重大缺点,以致仅剩一种解决方案(或没有解决方案),我想听听我哪里做错了。 如果缺陷很小,并且在考虑了多个解决方案后仍然存在,请发表评论。 至少,我希望获得一些反馈,以了解哪种是您首选的解决方案,以及出于何种原因。
12 c#  design  .net  properties 

5
如何将我的思想从C ++迁移到C#
我是一位经验丰富的C ++开发人员,我对语言非常了解,并且已经大量使用了其某些特定功能。另外,我了解OOD的原理和设计模式。我现在正在学习C#,但是我无法停止无法摆脱C ++心态的感觉。我将自己与C ++的优势紧密联系在一起,以致于我无法缺少某些功能。而且我在C#中找不到任何好的解决方法或替代方法。 有什么好的做法,设计模式,成语是在C#不同于C ++的角度可以建议?如何获得一个完美的C ++设计,而不是C#中的笨拙? 具体来说,我找不到一种很好的C#方式来处理(最近的示例): 控制需要确定性清除的资源(例如文件)的生命周期。这很容易using掌握,但是当资源的所有权正在转移时[...在线程之间]如何正确使用它呢?在C ++中,我只使用共享指针,并让它在适当的时候处理“垃圾回收”。 不断为特定泛型的重写功能而苦苦挣扎(我喜欢C ++中的部分模板专门化之类的东西)。我应该放弃使用C#进行通用编程的任何尝试吗?也许泛型是有目的的,除了特定领域的问题外,使用C并不是C#风格? 类似宏的功能。虽然通常是个坏主意,但对于某些问题领域,没有其他解决方法(例如,对语句的条件评估,例如只应运往Debug版本的日志)。没有它们意味着我需要放置更多if (condition) {...}样板,并且在触发副作用方面仍然不尽相同。

4
C#最小SQL数据库
我正在做一个小项目(而不是生产项目),在这里我需要存储足够的数据,以至于像CSV这样的处理效率低下,而SQL / MySQL服务器则太多了。.Net是否有任何方法可以有效地存储多个数据条目,并且具有查询的能力,而无需管理和连接到服务器,而只需加载和处理单个文件。
12 c#  database  sql 

2
是否应将类,枚举和其他实体放在单独的文件中?
我公司的团队负责人\建筑师认为,如果将“逻辑连接的实体”放在一个.cs文件中,则大型项目更容易理解。 我引用: “逻辑,接口和类的整体结构可以在一个地方看到,这是一个不能被驳斥的论点。要看到同一件事,但需要一堆文件,则需要使用工具,类图,R#用于导航,等等。” “遵循拙劣的理论,我可能会大声疾呼,分开的文件很酷,但是当涉及到对现有代码进行更改时,尤其是如果您不是该代码的编写者时,很难理解大量分散的文件。因此,在论坛上,您可以编写“一个枚举一个文件”,但实际上,永远不要使用这种方法“ “ ...关于开发人员之间代码库的分离,如今同时编辑同一文件已不是问题。合并已不是问题。” 我听说过很多次,我们必须为每个枚举,类等创建一个.cs文件,这是最佳实践。 但是我不能说服他。他说,他不信任任何著名的程序员,例如Jon Skeet。顺便说一下,Skeet对这个主题的看法是:找到枚举类型的最佳位置在哪里? 你怎么看?有真正的问题吗?还是只是一个口味问题,应该由组织的编码标准来规范?

4
是否有创建文件格式的正确方法?
我正在为使用C#.NET编写的应用程序构建专有文件格式,以存储保存的信息,甚至可能存储项目资源。是否有关于如何执行此操作的标准?我只是将Serialize对象变成二进制文件,然后创建一个标头,该标头将告诉我如何解析文件。这是一个不好的方法吗?

3
LINQ适用于哪些问题域?
每次我在C#的Stack Overflow上看到一个问题时,都会看到至少一个或两个答案可以解决LINQ问题。通常,声誉很高的人似乎像专家一样使用LINQ。 所以我的问题是,LINQ应该用于哪个问题域? 还要注意:是否有避免使用的目的?数据集的大小是否会影响LINQ查询的性能?

3
运送我的一流图书馆。我需要知道的任何陷阱吗?
我是一名Web开发人员,打算在自己的职业生涯中获得“出版的一流图书馆”成就,而且我还在发汗(我整夜都在紧张地工作)。我很乐意利用社区的经验,看看是否有人有任何建议或建议,以确保尽可能顺利进行。有什么我需要注意的细节或陷阱吗?关于构建过程有什么特别之处可以让我难忘吗? 我在这里: 库已经过单元测试,代码覆盖率约为97% API有充分的文档说明,并且已经创建了用于智能感知的xml文档 我确保公共/私有类访问器是正确和正确的。所有获取者/设定者也是如此 错误处理并不像我希望的那样优雅,但是我已经到了最后期限,并且已经接受了它的“现在的样子” 没有友好的日志记录。Debug.Writeline被广泛使用...我最近了解到这反映了我的经验不足:( 非常感谢您的建议! 该库将用于生成报告。标准帽子-连接到只读数据库,执行计算,格式化并将数据输出到响应流。 我被当作一种边缘资源来填补一位辞职的程序员,而这项任务是作为“割牙”项目而交给我的。该类库将发布给公司中的其他程序员,以供他们编写生产代码时使用。

5
唯一的逻辑是警卫的单元测试方法是否有用?
说我有一个这样的方法: public void OrderNewWidget(Widget widget) { if ((widget.PartNumber > 0) && (widget.PartAvailable)) { WigdetOrderingService.OrderNewWidgetAsync(widget.PartNumber); } } 我的代码中有几种这样的方法(异步Web服务调用的前半部分)。 我正在辩论将它们包含在单元测试中是否有用。是的,这里有逻辑,但这只是保护逻辑。(这意味着在允许进行Web服务调用之前,请确保已拥有所需的东西。) 我有一部分说“确保可以对它们进行单元测试,但这不值得花时间”(我在一个已经落后于进度的项目中)。 但是我的另一面说,如果您不对它们进行单元测试,并且有人更换了Guards,那么可能会有问题。 但是我的第一部分说,如果有人更换了警卫,那么您将为他们做更多的工作(因为现在他们必须更换警卫和警卫的单元测试)。 例如,如果我的服务承担检查Widget可用性的责任,那么我可能不再想要那个守护者。如果正在单元测试中,我现在必须更改两个位置。 我在两种方式上都有利弊。所以我想问一下别人做了什么。
12 c#  unit-testing 

4
分配给新对象时切换或字典
最近,我开始倾向于使用Dictionaries而不是Switch语句来映射1-1关系。我发现它的编写速度更快,并且在心理上也更容易处理。不幸的是,当映射到对象的新实例时,我不想这样定义它: var fooDict = new Dictionary<int, IBigObject>() { { 0, new Foo() }, // Creates an instance of Foo { 1, new Bar() }, // Creates an instance of Bar { 2, new Baz() } // Creates an instance of Baz } var quux = fooDict[0]; // quux references Foo …
12 c#  coding-style 

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.