Questions tagged «c#»

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

3
检测IEnumerable“状态机”
我刚刚读了一篇有趣的文章,《用C#收益回报变得太可爱了》 这让我想知道最好的方法是检测IEnumerable是否是实际的可枚举集合,或者它是使用yield关键字生成的状态机。 例如,您可以将DoubleXValue(来自本文)修改为以下内容: private void DoubleXValue(IEnumerable<Point> points) { if(points is List<Point>) foreach (var point in points) point.X *= 2; else throw YouCantDoThatException(); } 问题1)有更好的方法吗? 问题2)创建API时,我应该担心这一点吗?
17 c#  api-design 


3
国家模式是否违反《里斯科夫替代原则》?
该图像取自“ 应用域驱动的设计和模式:带有C#和.NET中的示例” 这是状态模式的类图,其中a SalesOrder在生命周期内可以具有不同的状态。在不同状态之间仅允许某些转换。 现在,OrderState该类是一个abstract类,并且其所有方法都继承为其子类。如果我们将子类视为Cancelled最终状态,不允许将其转换为其他任何状态,则必须对override此类中的所有方法进行抛出。 现在,这不是违反Liskov的替代原则吗,因为sublcass不应改变父级的行为吗?将抽象类更改为接口是否可以解决此问题? 如何解决?

5
如何减轻运行时创建视图模型的痛苦
对于这个很长的问题,我深表歉意。我在下面总结了我的问题 在MVC世界中,事情很简单。该模型具有状态,在视图显示模式,并且控制器不东西/与模型(基本上),控制器没有的状态。为了完成这些工作,Controller对Web服务,存储库等有一些依赖性。实例化控制器时,您关心的是提供那些依赖关系,而没有别的。执行动作(Controller上的方法)时,可以使用这些依赖关系来检索或更新Model或调用某些其他域服务。如果存在任何上下文,例如说某些用户想要查看特定项目的详细信息,则将该项目的ID作为参数传递给Action。Controller中的任何地方都没有对任何状态的引用。到目前为止,一切都很好。 输入MVVM。我爱WPF,我喜欢数据绑定。我喜欢使数据绑定到ViewModels更加容易的框架(使用Caliburn Micro atm)。我觉得这个世界上事情并不那么简单。让我们再次做运动:该模型具有状态下,查看显示的视图模型和视图模型做的东西/使用模型(基本),一个视图模型做有状态!(澄清;也许它代表所有属性的一个或多个模型,但是这意味着它必须具有对模型的一种方式或另一种,这本身就是状态的基准)为了做ViewModel在Web服务,存储库等方面有一些依赖性。实例化ViewModel时,您关心的是提供那些依赖关系,还需要提供状态。女士们,先生们,这无休止地困扰着我。 每当您需要从中实例化a ProductDetailsViewModel时ProductSearchViewModel(您又从中实例化了ProductSearchWebServicewhich IEnumerable<ProductDTO>,每个人还和我在一起吗?),您可以执行以下操作之一: call new ProductDetailsViewModel(productDTO, _shoppingCartWebService /* dependcy */);,这很糟糕,想象另外3个依赖关系,这意味着也ProductSearchViewModel需要承担这些依赖关系。改变构造函数也是很痛苦的。 调用_myInjectedProductDetailsViewModelFactory.Create().Initialize(productDTO);,工厂只是一个Func,大多数IoC框架很容易生成它们。我认为这很糟糕,因为Init方法是一个泄漏的抽象。您也不能对Init方法中设置的字段使用readonly关键字。我确定还有更多原因。 呼叫_myInjectedProductDetailsViewModelAbstractFactory.Create(productDTO);So ...这是通常建议用于此类问题的模式(抽象工厂)。我虽然是个天才,但它满足了我对静态类型的渴望,直到我真正开始使用它为止。我认为样板代码太多了(除了我使用的荒谬变量名之外,您都知道)。对于每个需要运行时参数的ViewModel,您将获得两个额外的文件(工厂接口和实现),并且需要键入非运行时依赖项,例如额外输入4次。而且,每次依赖关系发生变化时,您也需要在工厂中进行更改。感觉我什至不再使用DI容器。(我认为温莎城堡对此有某种解决方案(有其自身的缺点,如果我错了,请纠正我))。 用匿名类型或字典来做某事。我喜欢我的静态打字。 是的。以这种方式混合状态和行为会产生一个在MVC中根本不存在的问题。我觉得目前还没有一个真正足够的解决方案来解决这个问题。现在,我想观察一些事情: 人们实际上使用了MVVM。因此,他们要么不在乎以上所有内容,要么拥有一些出色的其他解决方案。 我还没有找到带有WPF的MVVM的深入示例。例如,NDDD示例项目极大地帮助我理解了一些DDD概念。如果有人可以将我指向类似MVVM / WPF的方向,我真的很喜欢它。 也许我在做MVVM时出错了,应该将我的设计倒过来。也许我根本不应该有这个问题。好吧,我知道其他人也问过同样的问题,所以我认为我不是唯一的一个。 总结一下 我是否可以正确地得出结论,将ViewModel作为状态和行为的集成点是整个MVVM模式存在某些困难的原因? 使用抽象工厂模式是以静态类型实例化ViewModel的唯一/最佳方法吗? 是否有类似深度参考实现的内容? 是否有很多带有状态/行为的ViewModels设计气味?
17 c#  design  wpf  mvvm 

1
C#-4.0是开放标准吗?
Ecma-334(ISO / IEC 23270:2006)标准对应于该语言的2.0版。 Microsoft可以免费获得4.0版的规范,但是Microsoft的开放规范列表仅列出了Ecma(2.0版)版本。 那么,在更高版本中添加的所有良好功能(LINQ,lambda函数等)又如何呢?可以在他的编译器中实现它们吗?
17 c#  legal  standards 

4
依赖注入和单例。他们是两个完全不同的概念吗?
我一直在听说要为我的同事在Singleton上使用依赖项注入。我仍然无法确定它们是否是可以互相替换的两个正交图案?还是DI是使Singleton模式可测试的方法? 请看下面的代码片段。 IMathFace obj = Singleton.Instance; SingletonConsumer singConsumer = new SingletonConsumer(obj); singConsumer.ConsumerAdd(10,20); 所述SingletonConsumer正在接受类型的参数IMathFace。而不是在内部访问singleton类,而是SingletonConsumer将获得调用者传递的singleton实例。这是通过依赖注入使用单例类的一个好例子吗?

2
抽象异常超类型
如果System.Exception认为投掷很糟糕,为什么一开始就没有Exception做出abstract? 这样,将无法调用: throw new Exception("Error occurred."); 这将强制使用派生异常来提供有关发生的错误的更多详细信息。 例如,当我想为库提供自定义异常层次结构时,通常会为我的异常声明一个抽象基类: public abstract class CustomExceptionBase : Exception { /* some stuff here */ } 然后是一些派生的异常,其目的更加具体: public class DerivedCustomException : CustomExceptionBase { /* some more specific stuff here */ } 然后,在调用任何库方法时,可以使用此通用try / catch块直接捕获来自库的任何错误: try { /* library calls here */ } catch (CustomExceptionBase ex) …

9
Java会赶上C#吗?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 8年前关闭。 今天,我发布了一个问题,询问哪种C#或Java语言更适合我学习。我有一些很好的答案。出现的一件事是,也许Java现在在新功能方面已经落后于C#。我看到了一些Web链接,并且大多数人指出了C#拥有什么以及Java没有什么。 所以我对大家的问题是Java是否会再次赶上C#?如果您要猜测5年后的状况。是否会有现在可能缺少的所有东西?Java 7呢?
17 java  c# 

9
陈述应该采用内部方法还是外部方法?
这些设计中哪个更好?各自的优缺点是什么?您会使用哪一个?任何其他关于如何处理类似方法的建议都值得赞赏。 可以合理地假设Draw()是调用其他绘制方法的唯一位置。这需要扩展到更多的Draw *方法和Show *属性,而不仅仅是此处显示的三个。 public void Draw() { if (ShowAxis) { DrawAxis(); } if (ShowLegend) { DrawLegend(); } if (ShowPoints && Points.Count > 0) { DrawPoints(); } } private void DrawAxis() { // Draw things. } private void DrawLegend() { // Draw things. } private void DrawPoints() { // Draw …
17 c# 

4
开发ASP.NET应用程序时值得使用CQRS / MediatR吗?
我最近一直在研究CQRS / MediatR。但是,我越深入,就越不喜欢它。也许我误会了一些东西。 因此,它声称可以将您的控制器简化为 public async Task<ActionResult> Edit(Edit.Query query) { var model = await _mediator.SendAsync(query); return View(model); } 完全符合瘦控制器指南。但是,它忽略了一些非常重要的细节-错误处理。 让我们看一下Login新MVC项目中的默认操作 public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null) { ViewData["ReturnUrl"] = returnUrl; if (ModelState.IsValid) { // This doesn't count login failures towards account lockout // To enable password failures …

3
BackgroundWorker与异步/等待
我是C#开发的新手,希望创建一个响应更快的UI。在我的初步研究中,我看到了两种实现此目的的方法: 与BackgroundWorker类结合使用多线程。 较新的异步/等待修饰符。 更新意味着更好吗?两种方法有什么区别?如果我想创建一个新项目,如何选择哪种方法? 编辑:也许我应该指定。我正在创建一个Windows Forms应用程序,其中所有必需的数据都将保存/加载到本地磁盘上。我还将与多个USB设备通信。

4
在C#方法中声明返回变量与直接返回值
在关于返回变量的辩论中,团队中的某些成员更喜欢将结果直接返回给调用者的方法,而另一些成员则更喜欢声明一个返回变量,然后将其返回给调用者(请参见下面的代码示例) 后者的论点是,它允许正在调试代码的开发人员在方法返回给调用者之前找到方法的返回值,从而使代码更易于理解:对于以菊花链方式进行的方法调用,尤其如此。 是否有关于哪种方法最有效的准则和/或是否有其他原因导致我们应采用一种风格而不是另一种风格? 谢谢 private bool Is2(int a) { return a == 2; } private bool Is3(int a) { var result = a == 3; return result; }

4
如何最好地组织类和接口文件?
好的..经过所有讨论之后,我将稍微更改我的问题以更好地反映我正在处理的具体示例。 我有两个类,ModelOne和ModelTwo,这些类执行类似的功能,但彼此无关。但是,我有一个第三类CommonFunc,其中包含一些公共功能,这两种功能都在两者中实现ModelOne,ModelTwo并且已根据进行了分解DRY。这两个模型是在ModelMain类中实例化的(它本身是在更高级别上实例化的,但是我将在这个级别上停止)。 我正在使用的IoC容器是Microsoft Unity。我不假装自己是专家,但是我的理解是,您在容器中注册了一个接口和类的元组,当您想要一个具体的类时,您会向IoC容器询问与特定接口匹配的任何对象。这意味着对于我要从Unity实例化的每个对象,都必须有一个匹配的接口。因为我的每个类都执行不同的功能(且不重叠),所以这意味着接口和类1之间的比例为1:1。但是,这并不意味着我正在为每个编写的类都刻苦地编写一个接口。 因此,在代码方面,我最终得到2: public interface ICommonFunc { } public interface IModelOne { ICommonFunc Common { get; } .. } public interface IModelTwo { ICommonFunc Common { get; } .. } public interface IModelMain { IModelOne One { get; } IModelTwo Two { get; } .. } public class …

6
枚举什么时候不是代码气味?
困境 我已经阅读了很多有关面向对象实践的最佳实践书籍,几乎我读过的每一本书都有一部分内容,他们说枚举是一种代码味道。我认为他们已经错过了解释枚举何时有效的部分。 因此,我正在寻找准则和/或用例,其中枚举不是代码的味道,而实际上是有效的构造。 资料来源: “根据经验,枚举是代码的味道,应将其重构为多态类。[8]” Seemann,Mark,依赖注入,.Net,2011年,第2页。342 [8] Martin Fowler等人,《重构:改进现有代码的设计》(纽约:Addison-Wesley,1999年),第82页。 语境 我陷入困境的原因是交易API。通过以下方法,他们给了我Tick数据流: void TickPrice(TickType tickType, double value) 哪里 enum TickType { BuyPrice, BuyQuantity, LastPrice, LastQuantity, ... } 我尝试过围绕该API进行包装,因为打破更改是该API的生活方式。我想跟踪包装器上最后收到的刻度线类型的值,并且通过使用ticktypes字典来做到这一点: Dictionary<TickType,double> LastValues 在我看来,如果将它们用作键,这似乎是对枚举的正确使用。但是我有第二个想法,因为我确实有一个地方可以根据这个集合做出决定,而且我想不出一种消除消除switch语句的方法,我可以使用一个工厂,但是那个工厂仍然会有一个在某处切换语句。在我看来,我只是在移动东西,但仍然闻起来。 找到枚举的不容易,但是要做到的却不那么容易,如果人们可以分享他们的专业知识,利弊,我将不胜感激。 第二个想法 有些决定和行动是基于这些决定和行动的TickType,我似乎想不出消除枚举/切换语句的方法。我能想到的最干净的解决方案是使用工厂并返回基于的实现TickType。即使那样,我仍然会有一个switch语句,该语句返回接口的实现。 下面列出的是示例类之一,在其中我怀疑自己可能使用的枚举错误: public class ExecutionSimulator { Dictionary<TickType, double> LastReceived; void ProcessTick(TickType tickType, double value) { //Store Last Received …

1
.NET解决方案的目录结构
我们最近有一个承包商访问,对我们的项目结构方法提出质疑。请注意,我专门指的是目录结构。他建议使用Microsoft指南。我以为我可以在Google“ Microsoft指南.NET项目目录结构”中找到有用的东西,但是事实证明并非如此。就目前而言,我们做这样的事情: [Company.System.Feature] |-doc |Sandcastle project |-lib |Nuget packages |-src |-Project1 e.g. web |-Project2 e.g. business logic |-UnittestProject1 |-Specs doc文件夹包含一个Sandcastle解决方案,如此处所述:https : //www.codeproject.com/Articles/15176/Sandcastle-Help-File-Builder(请参阅:绝对路径和相对路径)。因此,doc文件夹包含一个Help文件夹,其中包含生成的帮助文件。lib文件夹包含所有Nuget软件包。 是否有任何Microsoft准则,建议如何构建解决方案?我在这里看过:https : //stackoverflow.com/questions/789389/project-structure-for-c-sharp-development-effort/789554? noredirect =1# comment86756309_789554等。我读过的大多数文章和问题似乎都是在2007-2009年创建的。我相信Nuget是在2010年推出的。是否有Microsoft准则?我读到一些叫做Tree Surgeon的东西,但是似乎不再存在了:https : //archive.codeplex.com/? p =treesurgeon。 我正在使用TFS;巡航控制和DDD可以发挥任何作用。
16 c#  visual-studio 

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.