Questions tagged «c#»

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

6
按需求或方法划分单元测试
首先,对标题表示歉意,我想不出最简单的解释方法! 我有一个要为其编写单元测试的方法。我将使其保持相当通用,因为我不想讨论该方法的实现,而只是讨论它的测试。方法是: public void HandleItem(item a) { CreateNewItem(); UpdateStatusOnPreviousItem(); SetNextRunDate(); } 因此,此类有一个公共方法,然后调用一些私有方法来执行逻辑。 因此,在编写单元测试时,我想检查所有三件事。因为它们都在同一运行中被调用,所以我认为我可以将其作为一项测试: public void GivenItem_WhenRun_Thenxxxxx { HandleItem(item); // Assert item has been created // Assert status has been set on the previous item // Assert run date has been set } 但我认为我也可以将其编写为三个单独的测试: public void GivenItem_WhenRun_ThenItemIsCreated() { HandleItem(item); } public …
16 c#  unit-testing 

2
为什么C#允许您进行重写异步?
在C#中,当您覆盖方法时,允许在未使用原始方法的情况下进行覆盖异步。这似乎是糟糕的形式。 使我想到这一点的例子是这样-我是来协助进行负载测试问题的。在大约500个并发用户的情况下,登录过程将在重定向循环中分解。IIS正在记录异常,并显示消息“异步模块或处理程序在异步操作仍处于挂起状态时已完成”。一些搜索使我认为有人在滥用async void,但是我快速搜索源却找不到任何东西。 可悲的是,当我本应寻找诸如“ async \ s [^ T]”之类的东西时,我正在搜索“ async \ svoid”(正则表达式搜索)(假设Task尚未完全合格……您明白了)。 后来我发现是async override void onActionExecuting(...在基本控制器中。显然,这一定是问题所在。解决该问题(暂时使其同步)解决了该问题。 回到问题:为什么当调用代码永远无法等待覆盖时,为什么还要将覆盖标记为异步?
16 c#  async 

4
将整数标识符映射到枚举有什么缺点?
我一直在考虑为这样的标识符创建自定义类型: public enum CustomerId : int { /* intentionally empty */ } public enum OrderId : int { } public enum ProductId : int { } 我这样做的主要动机是防止在您无意中将orderItemId传递给期望有orderItemDetailId的函数时发生的错误。 枚举似乎可以与我想要在典型的.NET Web应用程序中使用的所有内容无缝地结合在一起: MVC路由工作正常 JSON序列化工作正常 我能想到的每个ORM都可以正常工作 所以现在我想知道,“为什么不应该这样做?” 这些是我能想到的唯一缺点: 这可能会使其他开发人员感到困惑 如果您有任何非整数标识符,它将在您的系统中引起不一致。 它可能需要额外的转换,例如(CustomerId)42。但是我认为这不会成为问题,因为ORM和MVC路由通常会直接将枚举类型的值交给您。 所以我的问题是,我想念什么?这可能是个坏主意,但是为什么呢?
16 c# 

2
序列化和反序列化应该由要序列化的类负责吗?
我目前处于C#.NET应用程序的几个模型类的(重新)设计阶段。(模型与MVC中的M相同)。模型类已经具有大量精心设计的数据,行为和相互关系。我正在将模型从Python重写为C#。 在旧的Python模型中,我认为我看到了疣。每个模型都知道如何进行序列化,而序列化逻辑与任何类的其余行为无关。例如,假设: Image类的.toJPG(String filePath) .fromJPG(String filePath)方法 ImageMetaData.toString()和.fromString(String serialized)方法的类。 您可以想象这些序列化方法与该类的其余部分之间是否没有凝聚力,但是只能保证该类知道足够的数据来对其自身进行序列化。 上课知道如何序列化和反序列化是一种常见的做法吗?还是我错过了通用模式?

7
如何提高C#,Java和类似语言中面向数学的代码的可读性?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 5年前关闭。 作为C程序员和C#程序员,我不喜欢C#的一件事就是数学函数的详细程度。例如,每次您必须使用正弦,余弦或幂函数时,都必须在Math静态类之前。当方程本身非常简单时,这将导致代码很长。如果您需要强制转换数据类型,则问题将变得更加严重。因此,我认为可读性受到影响。例如: double x = -Math.Cos(X) * Math.Sin(Z) + Math.Sin(X) * Math.Sin(Y) * Math.Cos(Z); 相对于简单 double x = -cos(X) * sin(Z) + sin(X) * sin(Y) * cos(Z); 在其他语言(如Java)中也是如此。 我不确定这个问题是否真的有解决方案,但是我想知道C#或Java程序员是否使用任何技巧来提高Math代码的可读性。但是我意识到C#/ Java / etc。不是像MATLAB之类的面向数学的语言,所以这很有意义。但是有时候,人们仍然需要编写数学代码,如果可以使其更具可读性,那就太好了。
16 java  c#  math  readability 

1
为什么在C#中实现魔术方法?
在C#中,我开始看到所有这些魔术方法都弹出了,而没有界面的支持。为什么选择这个? 让我解释。 以前在C#中,如果对象实现了该IEnumerable接口,则该对象将自动被foreach循环迭代。这对我来说很有意义,因为它由一个接口备份,并且如果我要Iterator在要遍历的类中拥有自己的函数,则可以这样做,而不必担心它会神奇地意味着其他含义。 现在,显然,(不确定何时),不再需要这些接口。它只需要进行正确的命名转换即可。 另一个示例是通过使用一个确切 命名的方法来等待任何对象,该方法GetAwaiter具有一些特定的属性。 为什么不像以前那样创建一个界面IEnumerable或INotifyPropertyChanged静态地备份这种“魔术”呢? 关于我在这里的意思的更多细节: http://blog.nem.ec/2014/01/01/magic-methods-c-sharp/ 魔术方法的优缺点是什么,在网上哪里可以找到有关为什么做出这些决定的任何信息?
16 c# 

4
在简单属性上使用AggressiveInlining有不利之处吗?
我敢打赌,如果我对分析C#/ JIT行为的工具有更多了解,我会自己回答,但是由于我不了解,请耐心询问。 我有这样的简单代码: private SqlMetaData[] meta; [MethodImpl(MethodImplOptions.AggressiveInlining)] private SqlMetaData[] Meta { get { return this.meta; } } 如您所见,我放入了AggressiveInlining,因为我认为应该对其进行内联。 我认为。不能保证JIT可以内联它。我错了吗? 做这种事情会损害性能/稳定性/任何东西吗?

3
泛型如何实现?
从编译器内部角度来看,这是一个问题。 我对泛型感兴趣,而不是模板(C ++),所以我用C#标记了问题。不是Java,因为AFAIK两种语言的泛型在实现上有所不同。 当我查看不带泛型的语言时,它非常简单,您可以验证类定义,将其添加到层次结构中就可以了。 但是如何处理泛型类,更重要的是如何处理对它的引用?如何确保每个实例的静态字段都是奇异的(即每次解析通用参数时)。 假设我看到一个电话: var x = new Foo<Bar>(); 是否将新Foo_Bar类添加到层次结构? 更新:到目前为止,我仅找到2条相关的帖子,但是即使它们在“如何自己做”的意义上也没有涉及太多细节: http://www.jprl.com/Blog/archive/development/2007/Aug-31.html http://www.artima.com/intv/generics2.html
16 c#  generics 

1
了解访客模式
我有一个代表GUI控件的类层次结构。像这样: Control->ContainerControl->Form 我必须实现一系列算法,这些算法可以与处理各种任务的对象一起使用,并且我认为“访客”模式将是最干净的解决方案。让我们举个例子,该算法创建对象层次结构的Xml表示。使用“经典”方法,我可以这样做: public abstract class Control { public virtual XmlElement ToXML(XmlDocument document) { XmlElement xml = document.CreateElement(this.GetType().Name); // Create element, fill it with attributes declared with control return xml; } } public abstract class ContainerControl : Control { public override XmlElement ToXML(XmlDocument document) { XmlElement xml = base.ToXML(document); // …

5
在C#界面中使用关键字“使用”
当我使用C#编写一些代码并使用Visual Studio 2010定义接口时,它总是包含许多“使用”语句(如示例中所示) using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace TestEngine.TestNameSpace { interface ITest1 { bool testMethod(int xyz); } } 我想知道这些是做什么用的,以及它们是否真的必要。我可以省掉这些吗?仅当我在界面说明中使用这些部件时才需要它们吗?

3
专用线程锁定对象的命名约定
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引文回答。 4年前关闭。 这是一个相对较小的问题,但我无法找到官方文档,甚至找不到关于它的博客意见/讨论。 简而言之:当我有一个私有对象,其唯一目的是为私有服务时lock,该对象该如何命名? class MyClass { private object LockingObject = new object(); void DoSomething() { lock(LockingObject) { //do something } } } 我们LockingObject在这里应该命名什么?还不仅要考虑变量的名称,还要考虑变量在锁定时的代码外观。 我看过各种示例,但似乎没有可靠的建议: SyncRoot(和的各种变体形式_syncRoot)的用法很多。 代码示例: lock(SyncRoot),lock(_syncRoot) 这似乎受到VB的等效SyncLock语句,SyncRoot某些ICollection类上存在的属性以及某种SyncRoot设计模式的一部分的影响(这可能是一个坏主意) 在C#上下文中,不确定是否要使用VBish命名。更糟糕的是,在VB中将变量命名为与关键字相同。不知道这是否会引起混乱。 thisLock并lockThis来自MSDN文章:C#lock语句,VB SyncLock语句 代码示例: lock(thisLock),lock(lockThis) 不知道这些名称是否仅出于示例目的而最少命名 如果我们在static类/方法中使用它,那有点奇怪。 编辑:关于锁的Wikipedia文章也使用此命名作为其示例 PadLock(不同大小写的)的几种用法 代码示例: lock(PadLock),lock(padlock) 不错,但是我唯一的牛肉就是它毫无意外地调用了物理 “挂锁” 的图像,而我倾向于将其与抽象线程概念无关。 根据锁定意图命名锁定 代码示例: lock(messagesLock),lock(DictionaryLock),lock(commandQueueLock) 在VB SyncRoot MSDN页面示例中,它包含一个simpleMessageList带有私有messagesLock对象的示例 …

4
我是否应该选择带有或不带有私有字段的属性?
我现在使用的代码库具有使用私有字段和公共属性的约定。例如,大多数类的成员定义如下: // Fields private double _foo; private double _bar; private double _baz; // Properties public double Foo { get{ return _foo; } set{ _foo = value; } } public double Bar { get{ return _bar; } set{ _bar = value; } } public double Baz { get{ return _baz; } …
16 c#  coding-style 

5
如何使用C#和NUnit构建GUI应用程序的单元测试
我被要求做一个小项目,为我们的一个客户提供一个简单的应用程序。通常,我会在后端代码上工作,在那里我已经解决了所有测试需求,而且我还没有为GUI编写测试的乐趣,因此我不清楚应该如何设置EXE的测试代码和工具。 我的第一个直觉是简单地将测试与应用程序代码一起包含,但是这将需要提供一些特定于测试的依赖项,而我已被指示不要将其交付给客户。我也无法从任何现金中提取现金用于专用测试工具,因此我需要使用手边的工具(StoryQ,RhinoMocks和NUnit),这实际上足以测试一个简单的GUI应用程序的行为。据我所知,这使我不得不在保持设计非常简单或为测试而故意过度设计之间寻求一个良好的平衡。似乎我要么像往常一样在单独的库中构建具有业务逻辑的应用程序并针对该库进行测试,要么找到其他机制使我可以执行该应用程序,而不会破坏应用程序设计所没有的其他模块真的需要。 编辑: 请注意,这个问题是关于如何构造NUnit和我的可执行文件之间的关系(而不是DLL),而不是关于如何分离表示和业务逻辑。 /编辑 所以我的问题是: 是否有特定/推荐的方法来配置带有单元测试的简单GUI应用程序,以使我能够使用手头的工具来充分检查状态和行为,而又无需过度设计? 我是否错过了一些有关测试EXE(而不是DLL)时应调用/配置NUnit的方式的基本知识? 您能否提供或指出我如何实现所有这些目的的示例? 我意识到可能有不止一种方法可以执行此操作,因此我正在根据您的经验寻找具体的实施准则。
16 c#  testing  gui  nunit 

3
C#5异步支持将如何帮助解决UI线程同步问题?
我在某处听说C#5 async-await非常棒,您不必担心这样做: if (InvokeRequired) { BeginInvoke(...); return; } // do your stuff here 看起来,等待操作的回调将在调用者的原始线程中发生。埃里克·利珀特(Eric Lippert)和安德斯·海斯伯格(Anders Hejlsberg)多次指出,此功能源于使UI(尤其是触摸设备UI)具有更高响应能力的需求。 我认为此类功能的常见用法如下: public class Form1 : Form { // ... async void GetFurtherInfo() { var temperature = await GetCurrentTemperatureAsync(); label1.Text = temperature; } } 如果仅使用回调,则设置标签文本将引发异常,因为未在UI线程中执行该文本。 到目前为止,我找不到任何资源可以证实这种情况。有人知道吗?是否有任何文件从技术上解释这将如何工作? 请提供可靠来源的链接,而不仅仅是回答“是”。

6
C#5异步重入的解决方案
因此,关于C#5中新的异步支持的问题一直困扰着我: 用户按下一个按钮即可启动异步操作。呼叫立即返回,并且消息泵再次开始运行-这就是重点。 因此,用户可以再次按下按钮-导致重新进入。如果有问题怎么办? 在我看到的演示中,他们在await通话前禁用了按钮,然后在通话后再次启用了该按钮。在我看来,这似乎是现实应用中非常脆弱的解决方案。 我们是否应该编写某种状态机来指定必须为给定的一组运行操作禁用哪些控件?或者,还有更好的方法? 我很想在操作过程中只显示一个模式对话框,但这有点像使用大锤。 有人有什么好主意吗? 编辑: 我认为禁用在操作运行时不应该使用的控件是脆弱的,因为我认为当您拥有带有许多控件的窗口时,它很快就会变得很复杂。我喜欢使事情简单,因为在初始编码和后续维护期间,它减少了错误的机会。 如果存在针对特定操作应禁用的控件集合,该怎么办?如果同时执行多个操作怎么办?

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.