Questions tagged «c#»

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

3
是否可以在不使用%运算符的情况下实现分布良好的哈希表?
我希望在C#中实现一个快速,分布均匀的哈希表。我在选择需要任意哈希码并“约束”它的哈希约束函数时遇到麻烦,因此可以将其用于索引存储桶。到目前为止,有两种选择: 一方面,您可以确保存储桶中始终有素数个元素,而要限制哈希,您只需对存储桶数进行模运算即可。实际上,这就是.NET词典所做的。这种方法的问题在于,与其他操作相比,使用%的速度非常慢。如果您查看Agner Fog指令表,idiv(这是为%生成的汇编代码)对于较新的Intel处理器,其指令等待时间约为25个周期。与此相比,大约3 mul或1逐位OPS像and,or或xor。 另一方面,您可以使存储桶的数量始终为2的幂。您仍将必须计算哈希的模数,因此您不必尝试在数组外部进行索引,但这一次的开销较小。由于对于2的幂% N是& (N - 1),约束被减少到仅需要1-2个周期的屏蔽操作。这是由Google的sparsehashash完成的。缺点是我们指望用户提供良好的哈希值;屏蔽哈希基本上会切断一部分哈希,因此我们不再考虑哈希的所有位。如果用户的哈希值分布不均匀,例如仅填充了较高的位或较低的位始终相同,则此方法的冲突率就会高得多。 我正在寻找一种我可以使用的兼具两全其美的算法:它考虑了哈希的所有位,并且比使用%还要快。它不一定必须是模数,而是一定要保证在一定范围内0..N-1(其中N是铲斗的长度)并且在所有插槽中具有均匀的分布。是否存在这样的算法? 感谢您的帮助。

3
在DDD中,存储库应公开实体还是域对象?
据我了解,在DDD中,将存储库模式与聚合根一起使用是合适的。我的问题是,是否应将数据作为实体或域对象/ DTO返回? 也许一些代码可以进一步解释我的问题: 实体 public class Customer { public Guid Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } } 我应该做这样的事情吗? public Customer GetCustomerByName(string name) { /*some code*/ } 还是类似的东西? public class CustomerDTO { public Guid Id { get; set; …

3
Foreach循环和变量初始化
这两个版本的代码之间有区别吗? foreach (var thing in things) { int i = thing.number; // code using 'i' // pay no attention to the uselessness of 'i' } int i; foreach (var thing in things) { i = thing.number; // code using 'i' } 还是编译器不在乎?当我谈到差异时,我指的是性能和内存使用情况。..或基本上没有任何区别,还是编译后两者最终成为相同的代码?
11 c#  performance  memory 

1
为什么无法在C#中重载复合赋值运算符?
标题具有误导性,因此请阅读整个问题:-)。 所谓“复合赋值操作符”我心里有这样的结构op=,例如+=。纯赋值运算符(=)不属于我的问题。 “为什么”我不是指观点,而是某些设计师或其同事等表达其推理(即设计选择的来源)时的资源(书,文章等)。 我对C ++和C#中的不对称感到困惑(是的,我知道C#不是C ++ 2.0)-在C ++中,您将重载运算符+=,然后几乎完全+依靠先前定义的运算符自动编写适当的运算符。在C#中是相反的-您过载+并+=为您综合了。 如果我没记错的话,后面的方法在使用real时会失去优化的机会+=,因为必须创建新的对象。因此,这种方法必须具有很大的优势,但是MSDN却不愿透露任何信息。 我想知道这样做的好处是什么,因此,如果您在C#书籍,技术讲座视频,博客文章中发现了解释,我将不胜感激。 我发现最接近的是Eric Lippert博客上的评论为什么C#中重载运算符总是静态的?汤姆·布朗(Tom Brown)。如果首先确定了静态重载,则它仅指示可以为结构重载哪些运算符。这进一步指示了可以为类重载的内容。

3
如何以编程方式监视长时间运行的程序
我现在得到的可以用这个伪代码来总结: public static void Main(string[] args) { var listOfObjects = Database.GetObjectsToUploadToOnlineService(); Parallel.ForEach(Upload) } private static void Upload(MyUploadObject obj) { //Build object (takes a few milliseconds) //Format to JSON (takes a few more milliseconds) //Upload (can take up to a max of 10 minutes) //Wait for a response (can take up …

2
为什么在两个看似完全不同的上下文中使用'out'关键字?
在C#中,out可以两种不同的方式使用关键字。 作为参数修饰符,其中参数通过引用传递 class OutExample { static void Method(out int i) { i = 44; } static void Main() { int value; Method(out value); // value is now 44 } } 作为类型参数修饰符,以指定协方差。 // Covariant interface. interface ICovariant<out R> { } // Extending covariant interface. interface IExtCovariant<out R> : ICovariant<R> { } …

4
我的体系结构的多重继承的替代方案(实时策略游戏中的NPC)?
编码实际上并不难。困难的部分是编写有意义,可读和可理解的代码。因此,我想找一个更好的开发人员并创建一些可靠的体系结构。 因此,我想为电子游戏中的NPC创建一个体系结构。这是一个实时战略游戏,例如《星际争霸》,《帝国时代》,《命令与征服》等。因此,我将拥有不同种类的NPC。一个NPC可以有一对多的能力,这些(方法): Build(),Farm()和Attack()。 例子: 工人可以Build()和Farm() 战士可以Attack() 公民可以Build(),Farm()和Attack() 渔民可以Farm()和Attack() 我希望到目前为止一切都清楚。 所以现在我有了我的NPC类型及其能力。但是让我们来谈谈技术/程序方面。 对于我不同种类的NPC,什么样的程序设计架构会很好? 好吧,我可以有一个基础课。实际上,我认为这是坚持DRY原则的好方法。因此,我可以WalkTo(x,y)在基类中使用类似的方法,因为每个NPC都可以移动。但是现在让我们来解决真正的问题。我在哪里实现我的能力?(记住:Build(),Farm()和Attack()) 由于这些能力将由相同的逻辑组成,因此为每个NPC(工人,战士,..)实施它们将是令人讨厌的/打破DRY原则。 好吧,我可以在基类中实现这些功能。这将需要某种逻辑来验证NPC是否可以使用X IsBuilder,... CanBuild,…… 能力。我想我想表达的很清楚。 但是我对这个想法不太满意。这听起来像一个功能过多的。肿基类。 我确实使用C#作为编程语言。因此,这里不能选择多重继承。意思是:拥有额外的基础类是Fisherman : Farmer, Attacker行不通的。

2
为什么F#Core定义通用数组类型?
我刚刚注意到FSharp.Core命名空间包括最多4维的通用数组类型,即Core。[] <'T>,Core。[,] <'T>等。C#和VB看起来做的很好使用System.Array-尽管我不清楚它们如何支持强类型的专用数组类型,例如int [],string []。 我想这将成为两个问题: C#如何基于非泛型System.Array支持强类型的专用数组类型,如int []? 鉴于C#可以做到这一点,为什么F#定义通用数组类型?
11 c#  .net  f# 

2
编译时IOC
是否有人在编译时启动了一个要进行IOC的项目(可能使用Roslyn或Linq MethodInfo发出)? 到目前为止,我在IOC容器方面的经验非常好,排除了一些小问题 许多IOC容器启动缓慢,因为许多解析逻辑都在这里发生 通常很难确保可以解决,因为编译不再确保可以调用构造函数。 通常,IOC容器会增加运行时的开销(有些甚至不小,通常那些启动很快的容器运行缓慢) 在我看来,理想的解决方案是在构建链上添加一个编译步骤,该步骤添加一个Factory类而不是IOC。 有人做过吗?如果没有,为什么不呢?

2
关于静态班级和成员的思想和最佳实践
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 6年前关闭。 我对有关静态成员或整个静态类的想法和行业最佳实践感到很好奇。这有什么弊端,或者它参与任何反模式? 我将这些实体视为“实用程序类/成员”,从某种意义上说,它们不需要或不需要实例化该类来提供功能。 关于此的一般想法和行业最佳实践是什么? 请参阅下面的示例类和成员,以说明我所引用的内容。 // non-static class with static members // public class Class1 { // ... other non-static members ... public static string GetSomeString() { // do something } } // static class // public static class Class2 { // ... other static members ... public …
11 c#  class-design 

2
在单个方法中有效地混合使用同步和异步方法?
好的,听起来很奇怪,但是代码非常简单,可以很好地说明情况。 public virtual async Task RemoveFromRoleAsync(AzureTableUser user, string role) { AssertNotDisposed(); var roles = await GetRolesForUser(user); roles.Roles = RemoveRoles(roles.Roles, role); await Run(TableOperation.Replace(roles)); } (我知道我在下面的摘要中说的有点像,但以上是实际生产代码中的一种实际方法,该代码实际上正在执行我在这里要问的事情,并且我实际上对您的实际审查很感兴趣相对于异步/等待模式的正确性。) 我现在使用async/ awaitmore越来越多地遇到这种模式。该模式由以下事件链组成: 等待初始呼叫,这会给我一些我需要处理的信息 同步处理该信息 等待最后的通话,以保存更新的工作 上面的代码块通常是我如何处理这些方法。我await是第一个电话,我必须这样做,因为它是异步的。接下来,我要做的工作是不受IO或资源限制的,因此不是异步的。最后,我保存了我的工作,这也是一个async电话,而不再是我的工作await。 但这是处理这种模式的最有效/正确的方法吗?在我看来,我可以跳过await上一个电话,但是如果失败了怎么办?我是否应该使用Task诸如ContinueWith将同步工作与原始调用链接在一起的方法?我现在只是不确定我是否正确处理了这一点。 给定示例中的代码,是否有更好的方法来处理此async / sync / async方法调用链?

1
MVC + 3层;ViewModels在哪里发挥作用?
我正在使用ASP.NET MVC 4设计一个三层应用程序。我使用以下资源作为参考。 CodeProject:MVC + N层+实体框架 在ASP.NET MVC中分离数据访问 到目前为止,我有以下目的。 表示层(PL) (主MVC项目中,中号的MVC被转移到数据访问层): MyProjectName.Main Views/ Controllers/ ... 业务逻辑层(BLL): MyProjectName.BLL ViewModels/ ProjectServices/ ... 数据访问层(DAL): MyProjectName.DAL Models/ Repositories.EF/ Repositories.Dapper/ ... 现在,PL引用BLL,而BLL引用DAL。这样,下层不依赖于其上一层。 在这种设计中,PL调用BLL的服务。PL可以将视图模型传递给BLL,而BLL可以将视图模型传递回PL。 同样,BLL调用DAL层,而DAL层可以将模型返回给BLL。BLL可以依次构建视图模型并将其返回给PL。 到目前为止,这种模式一直在为我工作。但是,我遇到了一个问题,其中某些ViewModel需要在多个实体上进行联接。在普通的MVC方法中,在控制器中,我使用LINQ查询执行joins,然后执行select new MyViewModel(){ ... }。但是现在,在DAL中,我无法访问在(在BLL中)定义ViewModel的位置。 这意味着我无法在DAL中加入联接并将其返回给BLL。看来我必须在DAL中进行单独的查询(而不是在一个查询中进行联接),然后BLL将使用这些结果来构建ViewModel。这非常不方便,但是我不认为我应该将DAL暴露给ViewModels。 有什么想法可以解决这个难题吗?谢谢。

1
为什么yield关键字与return和break结合使用,而不是单独使用?
在C#中,您可以构造返回类型为IEnumerable<T>和并使用yield return和yield break控制流程的方法。这是使用两个控件的简单示例: public IEnumerable<int> GetEvens(int start, int end) { if(end < start) yield break; if(start & 2 != 0) start++; for(int i = start; i <= end; i+=2) { yield return i; } } 我的问题是,为什么它最初设计为与一起使用两个关键字,yield而不是像下面那样使用单个关键字yield“产生返回值”来使用它: public IEnumerable<int> GetEvens(int start, int end) { if(end < start) return; // stop completely …
11 c# 

3
为什么我们不为枚举,抽象类和结构添加前缀?
C#社区已经无处不在地使用“ I”前缀来表示一个接口,即使是最没有经验的程序员也知道会使用它。 为什么我们不给枚举,抽象类或结构加上前缀(可能分别以“ E”,“ A”和“ S”开头)? 例如,如果我们确实用“ A”标记了所有抽象类,它将提供有关该类型的有价值的信息,尽管可以推断出这种信息并不是立即显而易见的。 请注意,我不主张这种改变,我只是在试图理解为什么我们不这样做。 该线程回答了我们为什么使用“ I”前缀的原因,但没有回答为什么我们不使用其他前缀的原因。

1
使用迁移或SQL Server数据工具进行代码优先是否更合适?
我已经获得建立一个新的MVC4网站的规范,起初它不会是一个太大的项目,但是我怀疑它会随着企业对它的新想法的发展而增长。 使用.NET 4.5 ASP.NET MVC4和EF,我必须在进行迁移的代码优先或Sql Server Data Tools(SSDT)之间进行选择,以处理数据库。 借助SSDT,我可以在项目中控制数据库,这是解决方案的一部分,并且可以使用dacpac文件处理从开发到生产的所有更改。我从MVC3进行代码优先的经验是,由于数据库选项有限,所以没有在开发中使用它。最终会导致在模型更改时放弃Db或手动处理Db更改。但是,我被认为不再使用MVC4迁移了,现在我可以将更新推送到Db了。 因此,我的问题是,在节省开发时间/精力的同时,还可以扩展并能够处理生产变更,哪种方法最有效。我喜欢代码优先和能够从模型生成数据库的能力,现在迁移的引入使它在生产中可行吗?

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.