Questions tagged «c#»

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

3
将一组相关的属性包装到其自己的struct / class中是一种好习惯吗?
用Swift编写User对象,尽管我的问题与任何强类型语言有关。用户可以拥有一堆链接(FacebookProfile,InstagramProfile等)。有关此问题。 将链接包装在其自己的对象中是一种好习惯吗? struct用户{ var firstName:字符串 var lastName:字符串 var email:string var链接:链接 } 结构链接{ var facebook:字符串 var instagram:字串 var twitter:字符串 } 还是应该松散?从技术上讲,我知道这两种方法都很好,但是总体上想知道是否有推荐的方法,尤其是为了提高可读性。 struct User { var firstName: string var lastName: string var email: string var facebookLink: string var twitterLink: string var instagramLink: string } 在这种情况下,链接应该是集合/列表吗?我认为它不应该是一个列表,因为有固定数量的链接选项可用,并且数量不会增加。我的想法对吗? 将我的网络方法放置在User对象(例如getUsers,getUser,updateUser)内是否是一种好习惯? 我知道这些可能是主观的,但是我试图了解在类似情况下的最佳实践是什么。将不胜感激任何指针。

2
当线程在while循环内等待任务时,会发生什么?
在处理了C#的async / await模式一段时间之后,我突然意识到我不太了解如何解释以下代码中发生的情况: async void MyThread() { while (!_quit) { await GetWorkAsync(); } } GetWorkAsync()假定返回一个等待对象Task,该等待对象在执行继续操作时可能会或可能不会导致线程切换。 如果等待不在循环内,我不会感到困惑。我自然希望该方法的其余部分(即延续)可以在另一个线程上执行,这很好。 但是,在一个循环中,“其余方法”的概念让我有些迷惑。 如果线程是在连续状态下打开的,而线程没有被打开,那么“其余的循环”会怎样?在哪个线程上执行循环的下一个迭代? 我的观察表明(未最终验证),每个迭代都在同一线程(原始线程)上开始,而延续在另一个线程上执行。真的可以吗?如果是,那么这是否是某种程度的意外并行性,需要解决GetWorkAsync方法相对于线程安全性的问题? 更新:我的问题并非如某些人所建议的重复。该while (!_quit) { ... }代码模式仅仅是我的实际代码的简化。实际上,我的线程是一个长寿命的循环,它以固定的时间间隔(默认为每5秒)处理其工作项的输入队列。实际的退出条件检查也不是示例代码所建议的简单的字段检查,而是事件句柄检查。
10 c#  loops  async 

2
为什么“ using”指令和“ using”语句在C#中使用相同的关键字?
该using指令使我们可以访问类型,而无需使用它们的全限定名: using MyNamespace.Foo.Bar; 该using语句充当try/ finally块的语法糖,可确保正确处置对象: using(var x = new MyDisposableClass()) { ... } 这两种情况似乎彼此无关。他们为什么使用相同的关键字? 我怀疑有人会混淆这两种情况,但是如果不为新功能创建新词似乎很奇怪。 顺便说一句,我也读过classC ++ 的双重用法(一种用于声明类,一种用于定义模板参数),但是第二种情况最终得到了自己的关键字typename,这对我来说更有意义。
10 c#  statement 

2
创建唯一目的是隐式转换为另一个类的类是否不好?
想象一下一种情况,我们正在使用一个允许您创建Circle对象的库,您可以在其中指定半径和圆心来定义它。但是,由于某些原因,它也需要一个必需的flavour参数。现在,我们确实需要Circle在自己的应用程序中使用,但是出于我的应用程序的目的,我可以将风味设置为Flavours.Cardboard每次。 为了“解决”这一问题,我Circle在另一个命名空间中创建了自己的类,该命名空间仅将radius和center作为参数,但具有一个隐式转换器,可以直接转换为Circle仅创建Circle(this.radius, this.center, Flavours.Cardboard)对象的外部库类。因此,在任何需要其他类型的的地方Circle,我都会进行自动转换。 创建这样一个类的后果是什么?有更好的解决方案吗?如果我的应用程序是在此外部库的基础上构建的供其他程序员使用的API,会有所不同吗?

3
使用接口进行松耦合代码
背景 我有一个项目,该项目取决于某种类型的硬件设备的使用情况,但是只要该硬件设备执行我需要的操作,则由谁来制造该硬件设备并不重要。话虽这么说,即使两个本来应该做同样事情的设备,如果不是由同一家制造商生产的,它们也会有差异。因此,我正在考虑使用一个接口将应用程序与所涉及设备的特定制造商/型号分离开,而使该接口仅涵盖最高级别的功能。这就是我在想我的体系结构的外观: 在一个C#项目中定义一个接口IDevice。 在另一个C#项目中定义的库中有一个具体的东西,它将用来表示设备。 有具体的设备实现IDevice接口。 该IDevice接口可能具有类似GetMeasurement或的方法SetRange。 使应用程序了解具体的知识,并将具体的知识传递给利用(而非实现)IDevice设备的应用程序代码。 我非常确定这是正确的做法,因为这样我就可以在不影响应用程序的情况下更改正在使用的设备(这似乎有时会发生)。换句话说,具体的实现方式GetMeasurement或SetRange实际操作方式并不重要(设备制造商之间可能会有所不同)。 我唯一的疑问是,现在应用程序和设备的具体类都依赖于包含IDevice接口的库。但是,这是一件坏事吗? 我也看不到应用程序不需要知道设备的方式,除非设备与设备IDevice位于相同的名称空间中。 题 这似乎是实现接口以解耦应用程序与所使用设备之间的依赖关系的正确方法吗?

3
使用专用设置器存根属性以进行测试
我们有对象 public class MyObject{ protected MyObject(){} public string Property1 {get;private set;} public string Property2 {get;private set;} public string Property3 {get;private set;} public string Property4 {get;private set;} public string Property5 {get;private set;} public string Property6 {get;private set;} public string Property7 {get;private set;} public string Property8 {get;private set;} public string Property9 {get;private …

1
如何避免健谈的界面
背景: 我正在设计一个服务器应用程序,并为不同的子系统创建单独的dll。为简化起见,假设我有两个子系统:1)Users2)Projects 用户的公共界面具有如下方法: IEnumerable<User> GetUser(int id); 而且Projects的公共接口具有如下方法: IEnumerable<User> GetProjectUsers(int projectId); 因此,例如,当我们需要显示某个项目的用户时,我们可以调用GetProjectUsers,这将为对象提供足够的信息以显示在数据网格或类似物中。 问题: 理想情况下,Projects子系统不应同时存储用户信息,而应仅存储参与项目的用户的ID。为了服务的GetProjectUsers,它需要调用GetUser的的Users系统存储在自己的数据库中的每个用户ID。但是,这需要大量单独的GetUser调用,从而在User子系统内部引起大量单独的sql查询。我还没有真正测试过,但是具有这种健谈的设计会影响系统的可伸缩性。 如果不考虑子系统的分离,我可以将所有信息存储在两个系统Projects都可以访问的单个模式中,并且可以简单地执行a操作,JOIN以在单个查询中获取所有项目用户。Projects还需要知道如何User从查询结果中生成对象。但这打破了具有许多优点的分离。 问题: 有人可以建议一种在避免所有这些单独GetUser通话的同时保持分隔的方法GetProjectUsers吗? 例如,我曾想过让用户为外部系统提供使用标签值对“标记”用户并请求具有特定值的用户的能力,例如: void AddUserTag(int userId, string tag, string value); IEnumerable<User> GetUsersByTag(string tag, string value); 然后,Projects系统可以在将每个用户添加到项目中时对其进行标记: AddUserTag(userId,"project id", myProjectId.ToString()); 在GetProjectUsers期间,它可以在一次调用中请求所有项目用户: var projectUsers = usersService.GetUsersByTag("project id", myProjectId.ToString()); 我对此不确定的部分是:是的,用户与项目无关,但实际上有关项目成员资格的信息存储在用户系统中,而不是项目中。我只是感觉不自然,所以我试图确定我是否缺少一个很大的劣势。

4
故意提出使用catch的例外
对于if...else带有异常处理的典型包装,是否建议使用以下示例来避免代码重复? try { if (GetDataFromServer()) { return ProcessData(); } else { throw new Exception(); } catch(Exception ex) { return null; } 代替... try { if (GetDataFromServer()) { return ProcessData(); } else { return null; } } catch(Exception ex) { return null; } 我知道会有轻微的性能下降,但是我想知道这是否可以接受。我目前使用第二种方法-特别是在需要以不同方式处理特定异常的情况下-但我想知道第一种方法是否适合简单情况。

7
嵌套实体和叶实体属性的计算-SQL或NoSQL方法
我正在从事一个名为“菜单/食谱管理”的业余项目。 这就是我的实体及其关系的样子。 A Nutrient具有属性Code和Value 一个Ingredient具有集合Nutrients 一个Recipe具有的收藏,Ingredients有时也可以具有其他的收藏recipes 一个Meal有一个收集Recipes和Ingredients 一个Menu有集合Meals 关系可以描述为 在其中一个页面中,对于所选菜单,我需要显示根据其成分(膳食,食谱,成分和相应的营养素)计算出的有效营养素信息。 到目前为止,我正在使用SQL Server来存储数据,我正在从C#代码导航链,从菜单的每一餐开始,然后汇总营养值。 我认为这不是一种有效的方法,因为每次请求页面时都会进行此计算,并且成分会偶尔更改。 我在考虑有一个后台服务,该服务维护一个称为MenuNutrients({MenuId, NutrientId, Value})的表,并且在任何成分(餐,菜谱,成分)发生变化时,将使用有效营养素填充/更新该表。 我认为GraphDB非常适合此要求,但是我接触NoSQL的机会有限。 我想知道显示给定菜单营养的这种要求的替代解决方案/方法是什么。 希望我对场景的描述清楚。

2
C#编程语言中变量的命名约定
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 6年前关闭。 我正在观看有关变量的C#视频。作者在方法内声明了一个变量,并按如下方式命名:string MyName =“ James”; 我的问题是:.Net Framework建议使用哪种约定。是上面示例中的Pascal机壳,还是骆驼皮?

4
函数中内部作用域块的使用是否不好?
在某些(非常罕见)的情况下,存在以下风险: 重用不打算重用的变量(请参见示例1), 或使用一个变量代替另一个在语义上接近的变量(请参见示例2)。 范例1: var data = this.InitializeData(); if (this.IsConsistent(data, this.state)) { this.ETL.Process(data); // Alters original data in a way it couldn't be used any longer. } // ... foreach (var flow in data.Flows) { // This shouldn't happen: given that ETL possibly altered the contents of `data`, it is …

2
属性正确命名以代表以数字开头的字符串
查看Windows上的某些相机元数据File Properties(还有其他一些内容),两个分别Properties称为Focal length和35mm焦距。 我正在开发将利用这两个功能的软件Properties。到目前为止,我已经为第一个创建了一个Property名称FocalLength,但是似乎无法为另一个找到合适的名称。 我已经考虑过_35MmFocalLength或ThirtyFiveMmFocalLength,但是我认为可能会有更好的建议。 有任何想法吗?

4
在单元测试中,为什么要创建两次存储库?
前几天,我在阅读有关单元测试的内容时,看到了一些示例,人们在其中创建了一个存储库界面(即IExampleRepository),然后创建了真实的存储库(public class ExampleRepository : IExampleRepository)和一个用于单元测试的存储库(FakeExampleRepository : IExampleRepository)。 在中,IExampleRepository他们实现了与中相同的方法ExampleRepository,但是使用了不同的Linq查询。 确切的目的是什么?我认为对代码进行单元测试的一部分是确保一种方法正常工作吗?但是,当我使用两个完全不同的查询时,一个用于“真实”查询,另一个在测试中,该测试有多大意义?


4
为什么不在C#中使用非托管安全代码
C#中有一个选项可以执行未经检查的代码。通常不建议这样做,因为托管代码更加安全并且可以解决很多问题。 但是我想知道,如果您确定您的代码不会引起错误,并且您知道如何处理内存,那为什么(如果您喜欢快速代码)遵循一般建议? 我想知道这一点,因为我编写了一个用于摄像机的程序,该程序需要非常快速的位图处理。我自己制作了一些快速的图形算法,并且使用非托管代码在位图上效果很好。 现在,我通常会怀疑,如果您确定没有内存泄漏或崩溃的风险,为什么不更频繁地使用非托管代码? PS我的背景:我有点涉足这个编程领域,而且我一个人工作(我从事了几年),所以我希望这个软件设计问题不会那么奇怪。我真的没有其他人像老师那样问这些事情。

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.