Questions tagged «c#»

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

3
为什么贫血领域模型在C#/ OOP中被认为是不好的,而在F#/ FP中却非常重要?
在关于F#的博客文章中,它表示乐趣和收益,它表示: 在功能设计中,将行为与数据分开非常重要。数据类型是简单且“哑”的。然后分别有许多作用于这些数据类型的函数。 这与面向对象的设计正好相反,在面向对象的设计中,行为和数据必须结合在一起。毕竟,这正是一个类。实际上,在真正的面向对象设计中,除了行为外,您应该什么都没有-数据是私有的,只能通过方法访问。 实际上,在OOD中,围绕数据类型的行为不足被认为是一件坏事,甚至有一个名字:“ 贫血领域模型 ”。 鉴于在C#中,我们似乎继续从F#借用,并尝试编写更多的函数式代码;为什么我们不借用分离数据/行为的想法,甚至认为它不好呢?仅仅是因为该定义不与OOP一起使用,还是有一个具体的原因在C#中是不好的,由于某些原因在F#中不适用(实际上是相反的)? (注意:我对C#/ F#中的差异特别感兴趣,因为它们可能会改变对优劣的看法,而不是对博客文章中的任一种看法持不同意见的人)。


5
作为C#开发人员,您会学习Java为Android开发还是使用MonoDroid?[关闭]
我认为自己非常精通C#。目前,这是我选择的语言,基本上,这就是我所有专业经验的基础。 不过,我对MonoDroid项目的存在感到困惑。我一直认为C#和Java 非常接近。就像,如果您知道一个,就可以很快地学习另一个。因此,当我考虑开发自己的第一个Android应用程序时,我以为自己会熟悉Java并足以入手,然后就可以自己学习了。 这难道不比使用MonoDroid更有意义,因为MonoDroid的功能可能不如Java Android SDK丰富,并且仍然需要学习自己的API(尽管是.NET API)?我只是觉得学习一门新语言(以及当时非常流行的一种语言)并获得一些经验(最好是无论如何都已经非常接近它)会更好,而不是坚持使用已有的技术却没有获得更多有价值的技能 也许我严重误解了平均潜在的MonoDroid用户。也许对Java和.NET经验丰富的人更喜欢.NET。或者,也许(实际上有可能)我只是没有考虑其他因素。我只是想知道,为什么您会使用MonoDroid而不是仅使用Java为Android开发?
46 java  c#  .net  android  monodroid 

7
.NET属性-使用私有集还是只读属性?
在什么情况下,我应该在属性上使用私有集而不是将其设置为ReadOnly属性?考虑以下两个非常简单的示例。 第一个例子: Public Class Person Private _name As String Public Property Name As String Get Return _name End Get Private Set(ByVal value As String) _name = value End Set End Property Public Sub WorkOnName() Dim txtInfo As TextInfo = _ Threading.Thread.CurrentThread.CurrentCulture.TextInfo Me.Name = txtInfo.ToTitleCase(Me.Name) End Sub End Class // ---------- …
45 c#  .net  vb.net 

4
为什么结构和类在C#中是分开的概念?
在用C#编程时,我偶然发现了一个我无法理解的奇怪的语言设计决策。 因此,C#(和CLR)具有两种聚合数据类型:(struct值类型,存储在堆栈上,没有继承)和class(引用类型,存储在堆上,具有继承)。 首先,这种设置听起来不错,但随后您偶然发现了采用聚合类型参数的方法,要弄清楚它实际上是值类型还是引用类型,必须找到其类型的声明。有时可能会造成混乱。 解决该问题的公认方法似乎是将所有structs 声明为“不可变的”(将其字段设置为readonly),以防止可能的错误,从而限制structs的用途。 例如,C ++使用了更多可用的模型:它允许您在堆栈或堆上创建对象实例,并按值或按引用(或按指针)传递它。我一直听到C#的灵感来自C ++,但我不明白为什么它不采用这种技术。结合class并struct进入一个结构有两个不同的分配方案(堆和栈)和周围将它们作为值或(明确)经由引用ref和out关键字似乎是一个很好的事情。 问题是,为什么在C#和CLR中class并struct成为单独的概念,而不是具有两个分配选项的一种聚合类型?

4
为什么C#开发人员用换行符括起来?[关闭]
在过去的几年中,我大部分时间主要用于C#和SQL。在那段时间里,与我合作的每个程序员都习惯将函数或控制流语句的左括号放在新的一行上。所以... public void MyFunction(string myArgument) { //do stuff } if(myBoolean == true) { //do something } else { //do something else } 我一直对这是多么浪费空间感到震惊,尤其是在if / else语句中。而且我知道在C#的更高版本中存在替代方法,例如: if(myBoolean == true) //do something on one line of code 但是几乎没有人使用过它们。每个人都在做换行符。 缺席很久之后,我又重新开始使用JavaScript。在我的记忆中,JavaScript开发人员曾经做过完全相同的curl-brace-newline事情,但是对于所有花哨的新库和新东西,大多数开发人员都在声明后加上了大括号: function MyJavaScriptFunction() { //do something } 您可以从中看到这种感觉,因为自从使用闭包和函数指针在JavaScript中变得很流行以来,它就节省了大量空间并提高了可读性。所以我想知道为什么它在C#中没有被视为完成的事情。实际上,如果您在Visual Studio 2013中尝试上述构造,它实际上会为您重新格式化,将开括号放在新的一行上! 现在,我在Code Review SE上看到了这个问题:https : …
44 java  c#  javascript  syntax 


8
如果有意义的值超出范围,我应该抛出异常还是自己处理?
我写了一个表示纬度/经度坐标的结构。对于纬度,其值的范围是-180至180,对于纬度,其值的范围是90至-90。 如果该结构的用户给我提供的值超出该范围,则我有2个选择: 引发异常(arg超出范围) 将值转换为约束 因为坐标-185具有含义(因为极坐标可以很容易地将其转换为+175),所以我可以接受并转换它。 最好抛出一个异常来告诉用户他的代码给了我一个它不应该具有的值吗? 编辑:另外,我知道纬度/经度和坐标之间的区别,但是我想简化一下以便于讨论-这并不是最聪明的主意

10
为什么您的代码不应使用100%CPU?[关闭]
我专门讲的是在Windows XP或更高版本上运行的C#.NET 4程序,但是一般的答案也是可以接受的。 假设一个已经优化和高效的程序。这里的问题完全归结于CPU使用率高对硬件的影响,以及是否应该限制高使用率的程序以减少磨损,而不是取决于我的实现是否有效。 今天的一位同事建议我不要在数据加载过程中实现100%CPU利用率的目标,因为“现代CPU价格便宜,并且在100%CPU时会迅速降级”。 这是真的?如果是这样,为什么?以前,我给人的印象是100%CPU使用率对于密集或长时间的操作来说是更可取的,而且我在这两种方法上都找不到任何可敬的资源。
42 c#  multithreading  cpu  usage 

3
是否存在不能以10为基数但可以以2为基数的数字?
C#的decimal类型用于需要以10为底的精确表示的数字。例如,0.1不能以2为底(例如float和double)表示,并且在存储在这些类型的变量中时始终为近似值。 我想知道相反的事实是否还可能。是否存在以10为基数不能表示但可以以2为基数表示的数字(在这种情况下,我想使用a float代替a decimal来处理它们)?

14
使用常数是否正确?
所以我的教授回馈了我一直在从事的项目的反馈。他为此代码添加了一些标记: if (comboVendor.SelectedIndex == 0) { createVendor cv = new createVendor(); cv.ShowDialog(); loadVendors(); } 这在组合框“索引已更改”处理程序中。当用户要创建新供应商时使用它,我的首选(索引0,永不更改)打开“创建新供应商”对话框。因此,我的组合框的内容最终看起来像这样: Create New Vendor... Existing Vendor Existing Vendor 2 Existing Vendor 3 他的问题在于第一行代码: if (comboVendor.SelectedIndex == 0) 他声称0应该是一个常数,因此实际上使我停靠了标记。他声称我根本不应该在代码中使用文字。 问题是,我不明白为什么要在那种情况下使该代码保持不变。该索引永远不会改变,也不需要您进行调整。将一个单独的0保留在用于特定情况且永不更改的内存中似乎浪费内存。
42 c# 

13
期望Any()* not *引发null引用异常是否不合理?
当你创建一个扩展方法就可以了,当然,调用它null。但是,不像一个实例方法调用,调用它在空不具有扔NullReferenceException- >您必须检查和手动把它。 为了实施Linq扩展方法,Any()Microsoft决定他们应该抛出一个ArgumentNullException(https://github.com/dotnet/corefx/blob/master/src/System.Linq/src/System/Linq/AnyAll.cs)。 我不得不写信 if( myCollection != null && myCollection.Any() ) 作为此代码的客户端,我期望eg ((int[])null).Any()应该返回false吗?

12
C#开发是否与您使用的IDE有效分离?
我是一名学习C#的Python程序员,他正努力消除烦恼,只是喜欢C#,而不是不断将其与Python进行比较。 我有一个要点:堆栈定义问题的详细说明,缺乏对事物定义位置的明确说明。简而言之:在C#中,using foo不会告诉您提供了哪些名称foo,这类似于from foo import *Python中的一种形式-在Python编码文化中不鼓励使用隐式而不是更显式的形式from foo import bar。 对于C#程序员到此为止的Stack Overflow答案,我颇为震惊,这是在实践中,缺乏明确性并不重要,因为在您的IDE(大概是Visual Studio)中,您可以将鼠标悬停在名称上,并被告知名称来自的系统。例如: 现在,从理论上讲,我意识到这意味着当您使用文本编辑器进行查看时,您无法分辨出C#中的类型来自哪里……但是实际上,我认为这并不是问题。您实际上多久查看一次代码,却无法使用Visual Studio? 这是我的启示。许多Python程序员更喜欢使用文本编辑器进行编码,例如使用Sublime Text 2或vim之类的东西,这些都与代码有关,再加上命令行工具以及对文件夹和文件的直接访问和操作。依赖IDE来理解这种基本级别的代码的想法似乎令人反感。似乎C#文化在这一点上根本不同。而且我想知道我在学习C#时是否只需要接受并接受它。 这使我想到这里的问题:C#开发实际上与您使用的IDE密不可分吗?

8
私有变量与财产?
在大多数情况下,在类内部为变量设置值时,我们会看到两种选择: private string myValue; public string MyValue { get { return myValue; } set { myValue = value; } } 是否有一个约定可以确定如何为类内部的变量赋值?例如,如果我在同一个类中有一个方法,我应该使用属性还是使用私有变量来分配它。我已经看过这两种方法,所以我想知道这是一个选择还是性能是一个因素(可能很小)。

9
我应该在遍历它们的方法中接受空集合吗?
我有一个方法,其中所有逻辑都在foreach循环内执行,该循环遍历该方法的参数: public IEnumerable<TransformedNode> TransformNodes(IEnumerable<Node> nodes) { foreach(var node in nodes) { // yadda yadda yadda yield return transformedNode; } } 在这种情况下,发送一个空集合会导致一个空集合,但是我想知道这是否不明智。 我的逻辑是,如果有人正在调用此方法,那么他们打算传入数据,并且只会在错误的情况下将空集合传递给我的方法。 我应该捕获此行为并抛出异常,还是返回空集合的最佳实践?

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.