Questions tagged «c#»

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

1
我们使用存储库模式正确吗?
我们正在使用一堆带有后缀的独立类,-repository以从数据库中检索数据。每个表都有自己的存储库。 例如,我们有一个customerrepository具有各种方法来检索客户的类,并且具有一个vacancyrepository具有各种方法来检索空缺的类。 关于这种做事方式,我有两个问题: 如何获取跨越多个表的数据?例如,我有一个屏幕,显示所有尚未创建空缺的客户。可以customerrepository从中使用方法vacancyrespository,还是两个存储库都返回结果,并且层次结构中是否有更高的类(我们将其命名为a dataservice)从两个存储库中获取结果并将它们合并为1个结果? 这样的存储库可以处理多少逻辑? 我认为可以在存储库中实现“ where active == true”以仅检索活动记录,还是应该由层次结构中较高的类来处理简单的逻辑(将其命名为a dataservice)? 我现在遇到的示例是以下示例: 我们有一个问题列表,其中包含一个或多个问题。 问题可以有一个结果,该结果保存在单独的表中。 因此,当您要检索问题列表的总结果时,必须合并questionlist表,问题表和questionstatus表中的数据。 现在,我们为这些表提供3个不同的存储库。 如果我要问questionlistrepository清单12的总结果是什么,那将不得不从另外两个存储库中获取数据,因此其中有些逻辑,这是允许的吗? 还是有questionlistdataservice哪个知道要使用哪个存储库? 还有一件事:我们的存储库可以生成一个结果,IQueryable以便调用服务可以轻松地合并结果,但是如果不是这种情况,我认为从列表中检索所有三个表的所有内容不是一个好主意。数据库。

3
您如何分辨是使用复合模式还是树结构,还是第三个实现?
我有两种客户端类型,即“ 观察者 ”类型和“ 主题 ”类型。它们都与组的层次结构相关联。 观察者将从不同层次中与其关联的组中接收(日历)数据。通过合并尝试收集数据的组的“父”组中的数据(每个组只能有一个父组)来计算此数据。 主题将能够在与其关联的组中创建数据(观察者将接收)。当在一个组中创建数据时,该组的所有“子级”也将拥有该数据,他们将能够为数据的特定区域制作自己的版本,但仍链接到创建的原始数据(在在我的特定实现中,原始数据将包含时间段和标题,而子组则为直接链接到其各自组的接收者指定其余数据。 但是,当主体创建数据时,必须检查所有受影响的观察者是否有与此冲突的数据,据我所知,这意味着庞大的递归功能。 因此,我认为这可以归纳为以下事实:我需要具有一个可以在其中上下移动的层次结构,并且某些地方必须能够将它们作为一个整体来对待(基本上是递归)。 另外,我不仅针对可行的解决方案。我希望找到一种相对容易理解的解决方案(至少在体系结构方面),并且足够灵活,以便将来能够轻松接收其他功能。 是否有解决此问题或类似层次结构问题的设计模式或良好实践? 编辑: 这是我的设计: “ Phoenix”类以这种方式命名,因为我还没有想到合适的名称。 但是除此之外,我需要能够为特定的观察者隐藏特定的活动,即使这些活动通过组与之相连。 有点题外话: 就我个人而言,我认为我应该可以将这个问题分解为较小的问题,但这使我无所适从。我认为这是因为它涉及多个相互不关联的递归功能,以及需要以不同方式获取信息的不同客户端类型。我真的不能把头缠住它。如果有人能指导我如何更好地封装层次结构问题,我也将很高兴收到这一消息。

7
与C ++相比,C#是否能给您“更少的绳索来吊死自己”?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 乔尔·斯波斯基(Joel Spolsky)将C ++定义为“足以使自己吊死的绳索”。实际上,他在总结Scott Meyers的“ Effective C ++”: 这是一本书,基本上说,C ++足以将自己吊死,然后再延伸几英里,然后再变成一些伪装成M&M的自杀药。 我没有这本书的副本,但是有迹象表明,这本书的大部分内容与管理内存的陷阱有关,这似乎在C#中显得毫无意义,因为运行时会为您管理这些问题。 这是我的问题: C#是否可以避免仅通过精心编程才能避免的C ++陷阱?如果是这样,在何种程度上以及如何避免? 新C#程序员应该注意C#中是否存在新的,不同的陷阱?如果是这样,为什么不能通过C#设计来避免它们?

3
有人可以向我解释C#的编码约定吗?
我最近开始使用Unity3D,主要是使用C#编写脚本。正如我通常使用Java编程一样,两者之间的差异并不是很大,但是我仍然提到速成课程,只是为了确保自己走上正确的道路。 但是,我对C#的最大好奇是它使用了其方法名称的首字母大写(例如Java:getPrime()C#:GetPrime()aka:Pascal Case?)。是否有充分的理由呢?我从速成课程页面上了解到,我读到的显然是.Net的约定,我无法更改它,但是我很好奇,为什么听到这样的结果而不是正常的(相对的)骆驼案呢?例如Java使用的 注意:我了解语言具有自己的编码约定(Python方法都是小写字母,这也适用于此问题),但是我从来没有真正理解过为什么它没有被正规化为标准。

5
基类作为工厂?
我在周末写一些代码,发现自己想写一个工厂作为基类中的静态方法。 我的问题只是想知道这是否是ac#惯用语方法? 我认为可能不是因为基类具有派生类的知识。 也就是说,我不确定要获得相同结果的简单方法。整个其他工厂类(至少对我而言)似乎不需要的复杂性(?) 就像是: class Animal { public static Animal CreateAnimal(string name) { switch(name) { case "Shark": return new SeaAnimal(); break; case "Dog": return new LandAnimal(); break; default: throw new Exception("unknown animal"); } } } class LandAnimal : Animal { } class SeaAnimal : Animal { }
14 c#  class-design 

4
在C#中使用动态类型的缺点
我最近一直在研究C#中的动态类型。通过一些示例,我理解代码一旦编译,就无需再次重新编译,而是可以直接执行。 我觉得关键字提供的灵活性实际上可以随意更改数据类型是一个很大的优势。 题, 除了错误的动态方法调用之外,是否存在任何其他特定缺陷,这些错误会引发开发人员在开始执行之前必须知道的运行时异常。

5
负载测试:每秒如何生成请求?
我有一个运行在Zeroc-ICE上的服务器组件。当我想对其进行负载测试时,我认为使用并行库创建多个请求即可。但这最终以这种方式结束。从C#使用Parallel(Parallel.For)库显然更容易,但似乎并不能完全在同一瞬间并行生成所有内容。因此,它不是每秒创建N个请求的定义。我该怎么办?我想任何想先进行负载测试的人都会考虑这一点。 实际每秒实际创建N个请求的有效方法是什么? 另一个神话是关于并行编程。如果您通常在C#或.Net中使用并行编程模式,请告诉我们。想象一下,我有5个流程。如何将同时启动所有五个过程。这对我的资源消耗意味着什么?我已经尝试阅读了网上提供的许多材料,但是我收到的问题越来越多,而不仅仅是它们作为我的问题的答案。 我使用Parallel.For并创建了N个线程并测量了时间。然后,我使用Task.Factory.start尝试了同样的事情来枚举任务。测量的时间不同。那么使用它们之间到底有什么不同?什么时候应该使用相应的类?究竟是出于什么目的?我们经常有很多财富,但仅仅是我们不知道如何区分彼此。对我来说就是这种情况,无法找到为什么我不应该使用另一个。 我使用秒表类来衡量这些时间是最好的。在我对组件进行负载测试的情况下,测量响应时间的方式将是什么。秒表似乎对我来说是最好的解决方案。欢迎任何意见。 ps:有许多针对Web应用程序的负载测试工具。我的是服务器组件的自定义案例。我的问题更多是与每秒创建N个线程有关。 欢迎所有意见。只是不要以为它不是编程问题。当然是。任何想亲自进行QE知识的程序员,首先要亲自了解产品的性能,都应该振作起来。


10
将Fortran 77代码转换为C#
我正在尝试将Fortan77程序转换为C#。我有一个子程序,到处都有大约650行代码和可怕的GOTO语句。我什至开始可视化子例程的流程以弄清楚它的作用,这给我带来了很多麻烦。 有没有在这种事情上有经验的人可以给我任何有关如何大致了解此子程序的建议?是否有一些工具可以加快或促进这种转换?
14 c#  fortran 

3
在网络配置中设置连接字符串是否是一种好习惯?
最近,我在工作中与一些同事进行了讨论,因为他们说最好在.DLL中加密一个字符串连接。我说过为什么不使用加密的web.config中定义的字符串连接?一样,更好,因为实体框架(例如,在应用程序的Web配置中查找连接的名称),现在,我想从安全角度了解哪种更好,什么是最佳实践?

3
接口作为行为的抽象基类?
我需要为我的C#项目设计一个类层次结构。基本上,类的功能类似于WinForms类,因此让我们以WinForms工具包为例。(但是,我不能使用WinForms或WPF。) 每个类都需要提供一些核心属性和功能。尺寸,位置,颜色,可见性(对/错),绘制方法等。 我需要设计建议我使用了一个带有抽象基类和接口的设计,这些基类和接口不是真正的类型,而更像是行为。这是一个好的设计吗?如果没有,那将是一个更好的设计。 代码如下: abstract class Control { public int Width { get; set; } public int Height { get; set; } public int BackColor { get; set; } public int X { get; set; } public int Y { get; set; } public int BorderWidth { get; set; } …

1
声明事件的首选方式
我对.NET事件模型非常了解。我想我可能会误解该系统的细微差别。 当我开始将事件放入班级时,我将使用标准方式,如下所示: public event EventHandler<MyEventArgs> MyEvent; 这意味着任何订阅该事件的人都需要类似以下方法: void HandleThatEvent(object sender, MyEventArgs args){...} 很好,但是我发现我很少关心发送者,因此它使很多方法签名变得肿。 所以我改用声明自己的委托类型 public delegate void MyEventHandler(SomeClass argument); 它减少了混乱,但是在编写处理程序时却给我带来了一个小问题: eventImplmentor.MyEvent += HandleThatEvent; . . . void HandleThatEvent(/*oh, um, what arguments does it take? Intellisense isn't telling me*/) 因此,我将不得不返回到委托的声明,然后再查看并回写它们,或者编译它并等待被告知。 因此,现在,我只是用Action,Action<T>或任何模板适合。 public event Action<SomeClass> MyEvent; 这样我就可以将鼠标悬停在事件上,并被告知期望的参数。 毕竟,我的问题是:是否有在C#中声明事件的最佳实践?我应该回到原来的EventHandler<T>方式还是可以Action<T>接受?
14 c# 

12
在c#领域和方法之前,关于“ this”关键字的当前最佳实践是什么?
除非需要区分具有相同名称的变量和字段,否则我永远不会放在this.字段或C#中的任何成员访问前面。我认为这与m_C ++中常用的前缀没有什么不同,并且认为如果您确实需要指定它是成员,则您的类太大。 但是,我办公室中有很多人对此表示强烈反对。 当前认为最佳做法是this.什么? 编辑:为了澄清,我从不使用m_,仅this.在绝对必要时使用。
14 c#  coding-style 

7
开源礼节
我已经开始在Codeplex上进行我的第一个开源项目,并遇到了一些糟糕的代码。(我确实了解到C#仍然具有“ goto”语句),我开始添加“所有者”想要的功能,并在探究了代码库并看清混乱之后(例如使用“ goto”),我想清理它一点点。但是我有点担心,这就是为什么我转向所有人:“修复”“错误代码”对我来说是适当的礼节,还是应该让它继续进行新功能?就像我之前说的,我是整个OSS领域的新手,并且通常在一个团队中工作,所以我不想搞砸。

3
如何为Winforms解决方案设置MVP?
我过去曾经使用过MVP和MVC,我更喜欢MVP,因为我认为它可以更好地控制执行流程。 我已经创建了我的基础结构(数据存储/存储库类),并且在对示例数据进行硬编码时可以毫无问题地使用它们,因此现在我转向GUI并准备我的MVP。 A节 我已经看到MVP使用视图作为入口点,也就是说,在视图构造方法中,它创建了演示者,该演示者又创建了模型,并根据需要连接事件。 我还以演示者为切入点,在其中创建了视图,模型和演示者,然后在其构造函数中为该演示者提供了视图和模型对象以关联事件。 与2中一样,但是模型没有传递给演示者。相反,该模型是一个静态类,在其中调用方法并直接返回响应。 B区 在使视图和模型保持同步方面,我已经看到了。 每当视图中的值发生更改时,即TextChanged.Net / C#中的事件。这会触发一个DataChangedEvent传递到模型中的,以使其始终保持同步。在模型发生变化的地方(即它侦听的后台事件),然后通过引发的相同想法来更新视图DataChangedEvent。当用户想要提交更改SaveEvent时,它将触发,并进入模型进行保存。在这种情况下,模型将模仿视图的数据并处理动作。 与#b1相似,但是视图并非始终与模型同步。相反,当用户想要提交更改时,将SaveEvent被解雇,演示者获取最新的详细信息并将其传递到模型中。在这种情况下,除非需要对视图数据进行操作,否则模型将不知道视图数据,在这种情况下,将传递所有必需的详细信息。 C区 在视图中显示业务对象,即不是原始数据的对象(MyClass)(int,double) 该视图具有将显示为域/业务对象的所有数据的属性字段。例如,view.Animals公开一个IEnumerable<IAnimal>属性,即使视图将它们处理到TreeView中的Nodes中。然后对于选定的动物,它将SelectedAnimal作为IAnimal属性公开。 该视图不了解域对象,它仅公开图元/框架(.Net / Java)包含的对象类型的属性。在这种情况下,演示者将把适配器对象传递给域对象,然后适配器将给定的业务对象转换为视图上可见的控件。在这种情况下,适配器必须有权访问视图上的实际控件,而不仅仅是任何视图,因此会变得更加紧密。 D区 用于创建单个控件的多个视图。即,您有一个具有简单模型的复杂视图,例如保存不同类型的对象。您可以在侧面有一个菜单系统,每单击一个项目就会显示相应的控件。 您创建一个巨大的视图,其中包含通过视图界面公开的所有单个控件。 您有几种看法。您有一个菜单视图和一个空白面板。该视图创建所需的其他视图,但不显示它们(visible = false),该视图还为其包含的每个视图(即子视图)实现接口,因此可以向一个演示者公开。空白面板中将填充其他视图(Controls.Add(myview))和((myview.visible = true)。这些“子”视图中引发的事件由父视图处理,父视图又将事件传递给演示者,反之亦然,以将事件提供给子元素。 每个视图(无论是主要父视图还是较小的子视图)均连接到自己的演示者和模型中。您可以从文化上将视图控件放到现有的表单中,它将具备功能,只需将其连接到幕后的演示者中即可。 E节 如果所有内容都具有接口,那么现在基于以上示例中MVP的完成方式,由于它们可能不是交叉兼容的,因此将影响此答案。 一切都有界面,视图,演示者和模型。然后,显然每个都有具体的实现。即使您只有一个具体的视图,模型和演示者。 视图和模型具有接口。这允许视图和模型不同。演示者创建/获得视图和模型对象,并且仅用于在它们之间传递消息。 仅视图具有界面。该模型具有静态方法,不会创建,因此不需要接口。如果需要其他模型,则演示者将调用一组不同的静态类方法。由于模型是静态的,因此与演示者没有链接。 个人想法 从我介绍的所有不同变体中(大多数我可能已经以某种形式使用过),我确信还有更多。我更喜欢A3,因为它可以使业务逻辑在MVP之外可重用,而B2则可以减少数据重复和触发事件。C1用于不添加其他类,请确保将少量非单元可测试的逻辑放入视图中(如何可视化域对象),但是可以对其进行代码审查,也可以在应用程序中简单地对其进行查看。如果逻辑很复杂,我会同意一个适配器类,但并非在所有情况下都同意。对于D部分,我觉得D1创建的视图对于菜单示例来说至少太大了。我以前用过D2和D3。D2的问题是,您最终不得不编写大量代码才能将事件往返于演示者与演示者之间路由到正确的子视图,并且其拖放操作不兼容,每个新控件都需要更多接线才能支持单个演示者。D3是我的首选,但是即使视图恰好非常简单或不需要重用,D3仍会作为演示者和模型添加更多类来处理该视图。我认为根据情况,D2和D3的混合效果最好。对于E部分,我认为具有接口的所有内容都可能过头了,因为我已经对域/业务对象进行了此操作,因此这样做通常不会在“设计”中看到任何优势,但它确实有助于在测试中模拟对象。我个人认为E2是经典的解决方案,尽管我以前在2个项目中使用过E3。我认为根据情况,D2和D3的混合效果最好。对于E部分,我认为具有接口的所有内容都可能会过时了,我已经对域/业务对象进行了此操作,并且这样做通常不会在“设计”中看到任何优势,但是它确实有助于在测试中模拟对象。我个人认为E2是经典的解决方案,尽管我以前在2个项目中使用过E3。我认为根据情况,D2和D3的混合效果最好。对于E部分,我认为具有接口的所有内容都可能会过时了,我已经对域/业务对象进行了此操作,并且这样做通常不会在“设计”中看到任何优势,但是它确实有助于在测试中模拟对象。我个人认为E2是经典的解决方案,尽管我以前在2个项目中使用过E3。 题 我是否正确实施MVP?有正确的方法吗? 我已经读过Martin Fowler的著作,其中有很多变化,而且我还记得当我刚开始做MVC时,我理解了这个概念,但是最初无法确定切入点在哪里,一切都有自己的功能,但是控制和创建原始作品的是什么MVC对象集。

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.