Questions tagged «c#»

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

5
长方法重构:保持原样vs分离方法vs使用局部函数
假设我有这样长的方法: public void SomeLongMethod() { // Some task #1 ... // Some task #2 ... } 此方法没有任何重复的部分,应将其移至单独的方法或局部函数。 有很多人(包括我在内)认为长方法就是代码的味道。我也不喜欢#region在这里使用(s)的想法,并且有一个非常受欢迎的答案来解释为什么这很糟糕。 但是如果我将此代码分成方法 public void SomeLongMethod() { Task1(); Task2(); } private void Task1() { // Some task #1 ... } private void Task2() { // Some task #1 ... } 我看到以下问题: 用一个方法内部使用的定义来污染类定义范围,这意味着我应该在某个地方进行文档记录,Task1并且Task2只供内部使用SomeLongMethod(否则,每个阅读我的代码的人都必须推断出这个想法)。 污染将仅在单个SomeLongMethod方法中使用一次的方法的IDE自动完成功能(例如Intellisense)。 因此,如果我将此方法代码分成本地函数 …

3
如果出现解析错误,我将如何设计提供详细信息的TryParse方法?
解析用户输入时,通常建议不要抛出和捕获异常,而应使用验证方法。在.NET BCL中,这将是例如int.Parse(在无效数据上引发异常)和int.TryParse(返回false无效数据)之间的区别。 我正在设计自己的 Foo.TryParse(string s, out Foo result) 方法,我不确定返回值。我可以用bool像.NET自己的TryParse方法,但不会给有关指示类型的错误,有关的确切原因,为什么 s不能被解析成Foo。(例如,s括号可能不匹配,或者字符数错误,或者Bar没有对应的Baz等)。 作为用户的API,我强烈不喜欢它就会返回一个成功/失败布尔瞒着我的方法为什么操作失败。这使得调试猜测游戏成为可能,我也不想将其强加给图书馆的客户。 我可以想到很多解决此问题的方法(返回状态代码,返回错误字符串,将错误字符串添加为out参数),但是它们都有各自的缺点,我也想保持与.NET Framework。 因此,我的问题如下: .NET Framework中是否存在与简单的true / false布尔值相比,(a)解析输入而不抛出异常,并且(b)仍返回更详细的错误信息的方法?
9 c#  .net  api-design 

4
环境上下文与构造函数注入
我有很多核心类,它们需要数据库的ISessionContext,用于日志的ILogManager和用于与其他服务进行通信的IService。我想对所有核心类使用的此类使用依赖项注入。 我有两个可能的实现。接受所有三个类的IAmbientContext或为所有三个类注入IAmbientContext的核心类。 public interface ISessionContext { ... } public class MySessionContext: ISessionContext { ... } public interface ILogManager { } public class MyLogManager: ILogManager { ... } public interface IService { ... } public class MyService: IService { ... } 第一个解决方案: public class AmbientContext { private ISessionContext sessionContext; private ILogManager …

2
哪些数据应存储为“声明”?
在ASP.Net Core中,我发现Claims授权不是很具体的方法。我们可以添加任何东西作为ClaimType和ClaimValue配对;组,名字,姓氏,生日,canAccessThisURI,isEditor等。但是,这种方法(存储可以存储为声明的任何内容)将构成一个巨大的声明表,其中包含50%的应用程序数据。 我想知道,作为一种好的做法,应将哪些常见数据存储为索赔?

7
规避巫师和战士中的规则
在这一系列博客文章中,Eric Lippert使用向导和战士作为示例描述了面向对象设计中的问题,其中: abstract class Weapon { } sealed class Staff : Weapon { } sealed class Sword : Weapon { } abstract class Player { public Weapon Weapon { get; set; } } sealed class Wizard : Player { } sealed class Warrior : Player { } 然后添加一些规则: 战士只能使用剑。 向导只能使用人员。 …

3
C#模式可以清晰地处理“自由功能”,避免使用Helper风格的“实用程序包”静态类
我最近正在查看一些浮动的Helper风格的“实用程序包”静态类,这些静态类围绕我使用的一些大型C#代码库进行浮动,基本上类似于以下非常简短的代码段: // Helpers.cs public static class Helpers { public static void DoSomething() {} public static void DoSomethingElse() {} } 我审查过的具体方法是 彼此之间几乎没有关系 没有明确的状态在调用之间持续存在, 小,和 每一种都由各种不相关的类型消耗。 编辑:上面的内容并非旨在列出所指控的问题。这是我正在审查的特定方法的共同特征的列表。帮助答案提供更多相关解决方案的上下文。 仅针对此问题,我将把这种方法称为GLUM(通用轻量级实用程序方法)。部分地意在“消极”的负面含义。抱歉,这是愚蠢的双关语。 即使撇开我自己对GLUM的默认怀疑态度,我也不喜欢以下内容: 静态类仅用作命名空间。 静态类标识符基本上是没有意义的。 添加新的GLUM时,要么(a)毫无理由地触摸此“ bag”类,要么(b)创建一个新的“ bag”类(这本身通常不成问题;糟糕的是,新的静态类通常只会重复不相关性问题,但方法更少。 元的命名无疑也是可怕的,非标准的,通常内部不一致,无论是Helpers,Utilities或什么的。 什么是重构的合理好简单的模式,最好解决上述问题,并且最好轻触一下? 我可能应该强调:我正在处理的所有方法都是成对的彼此无关。似乎没有一种合理的方法可以将它们分解为更细粒度但仍为多成员的静态类方法包。

6
单元测试应仅涵盖“功能性”软件
我们正在一个新的软件开发项目中使用StructureMap。团队成员之一已实现了一个单元测试,该单元测试基本上测试了StructureMap容器配置。它通过执行以下操作来做到这一点; 计算为应用程序名称空间中的类配置的程序集的实例数。 在类级别定义期望的实例 断言预期实例与找到的实例总数匹配。 断言预期实例与测试中定义的实例匹配 一个例子是; var repositories = container.GetAllInstances<IEnvironmentRepository>(); Assert.AreEqual(1, repositories .Count()); foundInstances = foundInstances + repositories .Count(); 我们还为下一节课提供“单元测试”; public MyClass(IEnvironmentRepository environmentRepository) { } 在这些测试中,我们模拟了IEnvironmentRepository,因此不会像在实时系统中那样从容器中注入它。 一位同事忽略了对结构图配置的单元测试,并带有“单元测试仅测试它自己的配置”的注释。这显然是测试的目的,我认为这是完全正确的。我要求忽略测试的人删除结构映射配置IEnvironmentRepository(仍然忽略测试)并运行完整的单元测试套件,它们都通过了。然后,我们运行了该应用程序,由于容器配置现在无效,因此该应用程序崩溃了。我认为,这证明了测试的价值,我的同事仍然不同意。他只是简单地说我们不应该测试配置,但是我认为这完全可以进行单元测试。 有很多问题; 这是有效的单元测试吗?-我们正在测试容器的配置,而不是结构图起作用(但我可以看到重叠的部分) 如果不是,您如何在不测试的情况下验证配置。您如何阻止某人意外删除所需的代码行并将其检入? MyClass单元测试是否应该IEnvironmentRepository从容器中解析出实例并传递给它?

4
如何反对业务对象类设计的这种“完全公开”的思维方式
我们做了很多的单元测试,我们的业务对象的重构,而我似乎有很对类设计比其他同龄人不同的意见。 我不喜欢的示例类: public class Foo { private string field1; private string field2; private string field3; private string field4; private string field5; public Foo() { } public Foo(string in1, string in2) { field1 = in1; field2 = in2; } public Foo(string in1, string in2, string in3, string in4) { field1 = …

2
Vector <float> .Equals应该是自反的还是应该遵循IEEE 754语义?
比较浮点值是否相等时,有两种不同的方法: NaN不等于自身,这符合IEEE 754规范。 NaN等于自身,这提供了自反性的数学属性,这对于定义等价关系至关重要 在C#(内置的IEEE浮点类型float和double)遵循IEEE语义==和!=(和关系运算符一样&lt;),但确保反思object.Equals,IEquatable&lt;T&gt;.Equals(和CompareTo)。 现在考虑一个在float/ 之上提供矢量结构的库double。这样的向量类型将重载==/ !=并覆盖object.Equals/ IEquatable&lt;T&gt;.Equals。 大家都同意==/ !=应该遵循IEEE语义。问题是,这样的库是否应该以Equals自反的方式或与IEEE语义相匹配的方式来实现该方法(与相等运算符分开)。 将IEEE语义用于Equals以下方面的参数: 遵循IEEE 754 (可能更快),因为它可以利用SIMD指令 我已经在stackoverflow上问了一个独立的问题,关于如何使用SIMD指令表达自反式相等性及其性能影响:用于浮点相等性比较的SIMD指令 更新:似乎可以使用三个SIMD指令有效地实现自反性相等。 Equals涉及浮点的文档不需要反射: 对于Equals(Object)方法的所有实现,以下语句必须为true。在列表中x,y和z代表对象引用不为空。 x.Equals(x)返回true,除非涉及浮点类型。参见ISO / IEC / IEEE 60559:2011,信息技术-微处理器系统-浮点运算。 如果您将浮点数用作字典键,那么您将生活在一种罪过的状态中,不应期望表现出理智的行为。 自反的观点: 这是与现有的类型,包括一致的Single,Double,Tuple和System.Numerics.Complex。 我不知道BCL中Equals遵循IEEE而不是反身的任何先例。相反的例子包括Single,Double,Tuple和System.Numerics.Complex。 Equals主要用于依赖自反性的容器和搜索算法。对于这些算法,如果阻止它们工作,则性能提升是无关紧要的。不要牺牲性能的正确性。 它打破了所有基于散列集和词典,Contains,Find,IndexOf各种收藏品/ LINQ,一套基于LINQ操作(Union,Except,等),如果数据中包含NaN的值。 在IEEE语义可接受的情况下执行实际计算的代码通常适用于具体类型并使用==/ !=(或更可能是epsilon比较)。 您目前无法使用泛型编写高性能的计算,因为您需要为此进行算术运算,但是这些不能通过接口/虚拟方法使用。 因此,较慢的Equals方法不会影响大多数高性能代码。 对于需要IEEE语义或需要提高性能的情况,可以提供一种IeeeEquals方法或一种方法IeeeEqualityComparer&lt;T&gt;。 我认为这些论点强烈支持反身执行。 微软的CoreFX团队计划在.NET中引入这种向量类型。与我不同,他们更喜欢IEEE解决方案,主要是因为性能方面的优势。由于这样的决定在最终发布后肯定不会改变,因此我想从社区中获得我认为是一个大错误的反馈。

1
如何将命令对象与正确的接收者关联?
我尝试使用命令模式在项目中实现撤消和重做 public abstract class Command { protected Form Receiver { set; get; } protected HtmlElement Element { set; get; } abstract public void ReDo(); abstract public void UnDo(); public Command(Form receiver) { this.Receiver = receiver; } } class AddElementCmd : Command { public AddElementCmd(HtmlElement elem, Form receiver) : base(receiver) { …

6
如何在类A上实现一个属性,该属性引用类A的子对象的属性
我们有这段代码,经过简化,看起来像这样: public class Room { public Client Client { get; set; } public long ClientId { get { return Client == null ? 0 : Client.Id; } } } public class Client { public long Id { get; set; } } 现在我们有三个观点。 1)这是很好的代码,因为Client应该始终设置该属性(即不为null),因此该值Client == null将永远不会发生,并且Id值始终0表示一个错误的Id(这是代码编写者的意见;-)) 2)您不能依赖调用方来知道这0是一个错误值,Id并且 Client应始终设置该属性exception,而get当该Client属性恰巧为null 时,则应抛出in 3)当Client应始终设置该属性时,您只需返回Client.Id并NullRef在该Client属性碰巧为null 时让代码引发异常。 …
9 c#  code-quality  null 

3
更好地编写带有COM限制的.NET库,还是将.NET库与Interop分开?
我碰到了一篇有趣的文章:我如何爱上 CodeProject上的COM互操作性,这让我开始思考... 作者认为,他们不希望在.NET库中有任何COM-ity,因为它剥夺了.NET库的美感。相反,他们宁愿编写一个单独的Interop库,以将其.NET库公开给COM。该Interop库将处理以下事实:COM不支持带参数,重载方法,泛型,继承,静态方法等的构造方法。 虽然我认为这很新颖,但它不只是使项目变得复杂吗? 现在,您需要对.NET库和一个Interop库进行单元测试。 现在,您需要花时间弄清楚如何解决漂亮的.NET库并将其公开给COM。 您需要有效地将班级人数增加一倍或两倍。 我当然可以理解您是否需要您的库来支持COM和非COM。但是,如果仅打算使用COM,这种设计是否会带来我看不到的好处?您仅获得C#语言的好处吗? 还是通过提供包装器使库的版本控制变得容易?是否通过不需要使用COM来使您的单元测试运行更快?

3
将接口用于数据类型是否是反模式?
假设我的模型中有多个实体(使用EF),例如用户,产品,发票和订单。 我正在编写一个用户控件,该控件可以在我的应用程序中打印实体对象的摘要,其中这些实体属于预先确定的集合,在这种情况下,我说可以概括用户和产品的摘要。 这些摘要都只有一个ID和一个描述,因此我为此创建了一个简单的接口: public interface ISummarizableEntity { public string ID { get; } public string Description { get; } } 然后,对于有问题的实体,我创建一个实现此接口的局部类: public partial class User : ISummarizableEntity { public string ID { get{ return UserID.ToString(); } } public string Description { get{ return String.Format("{0} {1} is from {2} and is …

4
使用struct强制验证内置类型
通常,域对象具有可以用内置类型表示的属性,但是其有效值是可以用该类型表示的值的子集。 在这些情况下,可以使用内置类型存储值,但是必须确保始终在输入点验证值,否则我们最终可能会使用无效值。 解决此问题的一种方法是将值存储为自定义struct,该自定义具有private readonly内置类型的单个后备字段,并且其构造函数会验证提供的值。然后,我们始终可以确保仅通过使用此struct类型来使用经过验证的值。 我们还可以提供与底层内置类型之间的强制转换运算符,以便值可以作为底层类型无缝地进入和退出。 以一个例子为例,其中我们需要表示域对象的名称,并且有效值是长度在1到255个字符(含)之间的任何字符串。我们可以使用以下结构来表示: public struct ValidatedName : IEquatable&lt;ValidatedName&gt; { private readonly string _value; private ValidatedName(string name) { _value = name; } public static bool IsValid(string name) { return !String.IsNullOrEmpty(name) &amp;&amp; name.Length &lt;= 255; } public bool Equals(ValidatedName other) { return _value == other._value; } public override bool …
9 c#  .net 

4
在DAL和BLL层之间分离检索数据和业务对象
在发布此问题之前,我做了一些研究。在其他问题或帖子中,下面提供其中一个。我不清楚如何确定。 数据访问层中的业务对象 我有一个存储库,业务层调用该存储库以检索数据。例如,说我有以下BLL和DAL类: class BllCustomer { public int CustomerId {get; set;} public String Name {get; set;} public BllAddress Address {get; set;} } class BllAddress { public int AddressId {get; set;} public String Street {get; set;} public String City {get; set;} public String ZipCode {get; set; } } class DalCustomer { …

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.