Tag: 语言设计

操作方法:在C#中实现短路反向三元运算符? 有关系吗?

假设您使用三元运算符或空合并运算符或嵌套的if-else语句来选择对象的赋值。 现在假设在条件语句中,您对昂贵或易失性操作进行了评估,要求将结果放入临时变量中,捕获其状态,以便可以对其进行比较,然后进行可能的分配。 一个语言(例如C#)如何实现一个新的逻辑运算符来处理这种情况? 应该是? 在C#中是否存在处理此案例的现有方法? 其他语言? 例如,当我们假设我们正在寻找直接比较时,已经克服了一些降低三元或零合并算子的冗长度的情况。 请参阅使用Null Coalescing运算符的唯一方法 ,特别是关于如何扩展运算符的使用以支持String.IsNullOrEmpty(string) 。 注意Jon Skeet如何使用MiscUtil的PartialComparer将0 s重新格式化为null s, 为什么这可能是必要的? 好吧,看看我们如何为没有任何快捷方式的复杂对象编写比较方法(引用的讨论中的例子): public static int Compare( Person p1, Person p2 ) { return ( (result = Compare( p1.Age, p2.Age )) != 0 ) ? result : ( (result = Compare( p1.Name, p2.Name )) != 0 ) ? result : Compare( […]

C#语言设计的支柱

在文章 ( http://www.artima.com/intv/nonvirtualP.html )中,Anders Hejlsberg提到版本控制是C#语言设计的支柱之一。 有谁知道其他支柱是什么?

为什么if和#的范围以这种方式在c#中

受这个问题的启发,我开始想知道为什么下面的例子在c#中都是非法的: VoidFunction t = delegate { int i = 0; }; int i = 1; 和 { int i = 0; } int i = 1; 我只是想知道是否有人知道这种语言设计的确切原因? 它是否会阻止糟糕的编程实践,如果是这样,为什么不发出警告?,出于性能原因(编译和运行时)或者是什么原因?

c#switch语句比vb.net’case’更有限

我在这里读了一篇有趣的文章,它对vb.net中的’case’语句与C#中的’switch’语句提出了一个有趣的观点,我在下面粘贴了它: 以下Visual Basic Select Case语句无法使用单个switch语句在C#中表示: Dim Condition As Integer = 55 Select Case Condition Case 1, 3 To 5, 10, 12, 14, Is > 50 ‘value 55 executes code here Case Else ‘values <1, 2, 6-9, 11, 13, 15-49 End Select 我总是在C#中找到switch语句,在每种情况下都有一个中断和后续的中断请求,有点笨拙。 有没有理由他们没有增强switch命令来允许这些情况? 无论如何,什么时候会有用呢? 任何人都知道构造的任何扩展,以允许更多的灵活性? 干杯

为什么C#允许没有抽象成员的抽象类?

C#规范第10.1.1.1节规定: 允许(但不是必需)抽象类来包含抽象成员。 这允许我创建这样的类: public abstract class A { public void Main() { // it’s full of logic! } } 甚至更好: public abstract class A { public virtual void Main() { } } public abstract class B : A { public override sealed void Main() { // it’s full of logic! } } 这真是一个具体的课程; 它只是抽象的,因为人们无法实例化它。 例如,如果我想在B.Main()执行逻辑,我将首先得到B的实例,这是不可能的。 […]

什么是F#缺乏OO或势在必行?

很多时候我听说F#不适合特定的任务,比如UI。 “使用正确的工具”是一个常见的短语。 除了缺少WinForms / WPF / ORM设计器等工具之外,我不确定F#到底缺少什么 – 老实说! 然而,特别是在UI方面,我被告知C#做得更好。 那么,在强制使用F#时,F#的实际差异和遗漏是什么? 这是我提出的列表: 大量缺少工具支持 F#仍然是测试版 你的开发人员不知道F# 我不想考虑这些要点,因为它们并不是F#的内在特征。 Mutable需要“可变”或需要ref,ref需要! 解除引用 Mutables赋值< – 和ref使用:=(它们都是1个字符而不仅仅是=) val需要DefaultValueAttribute来获取默认值 F#不会发出隐式接口 受保护的成员更难以处理 没有自动属性 抽象类上实现的虚拟成员需要两个定义 引用到LINQ-Expression-Trees会产生与C#/ VB略有不同的树(对于期望以特定格式表达其表达式的API而言很烦人) 没有stackalloc F#没有?:条件运算符 F#中的指针可能被认为更麻烦 代表/事件可能被认为更加繁琐(我认为它们更容易,但至少它们是不同的) 没有自动类型转换(比如int to float或者隐式转换) Nullable没有特殊的语法支持(C#的?类型注释和??运算符,以及在nullable上使用运算符。) 没有自动向上扩展到普通基类或装箱(例如:让x:obj =如果为真,那么其他为“hi”//这不会是类型检查) 没有警告就不能丢弃值(“忽略”以绕过它) 没有C风格的语法:) 问题:哪些是编写命令式或OO代码的障碍? 为什么(简短的例子)? 我错过了哪些? 什么是最好的解决方法,为什么他们还不够? 请注意 ,我不是在谈论编写所谓的惯用语F#,我当然不是在谈论函数式编程。 我更感兴趣的是“如果我要强迫自己在F#中编写UI或命令式/ OO代码,使用F#OO /命令式function和类类型,最痛苦的是什么?” 奖励如果您不了解F#但使用C#或VB.NET并认为它是某种情况下更好的工具,请指出您觉得有吸引力的特定语言function和语法。

为什么没有非整数枚举?

为什么不能创建非整数枚举? 我想知道这是一个语言设计决策,还是在编译器中实现这个问题。 换句话说,在语言中实现非整数枚举是否可行,但是没有合理的需要? 或者如果它不可行但是合理,那么会遇到什么障碍? 有人告诉我,在C#中没有这个的原因或理由很简单,非常高兴。

C#中的开关是空的情况还是下一个非空的?

使用以下代码: case “GETSITES”: case “SITESETUP”: MessageBox.Show(“Help! I am suffering from the Air-Conditioned Nightmare!!!”); // … MessageBox.Show是执行开关值是”GETSITES”还是”SITESETUP” ? 或者仅当开关值为”SITESETUP” ? 由于”GETSITES”没有rest,我想是的,但我不确定。 UPDATE 我想我应该把我的问题描述为: 这两个代码片段在语义上是等价的吗? 片段1 case 0: case 1: // bla bla bla; break; 片段2(伪代码) case 0, 1: // bla bla bla; break;

在异步返回类型上

想知道为什么我们应该指定async方法确实返回Task对象。 使用async关键字指定它似乎是多余的,因为你没有真正创建Task对象,所以它很混乱。 据我所知,编译器会为Task对象创建发出必要的代码(无论是在等待调用还是用新任务包装返回)。 我真的不喜欢声明类型和返回类型之间的不一致。

为什么我们必须命名接口方法参数?

在C#中,我们必须命名接口方法的参数。 我明白,即使我们没有这样做,这样做也会有助于读者理解其含义,但在某些情况下,并不是真的需要: interface IRenderable { void Render(GameTime); } 我会说上面的内容与下面一样可读且有意义: interface IRenderable { void Render(GameTime gameTime); } 是否需要一些技术原因来说明接口上方法参数的名称? 值得注意的是,接口方法的实现可以使用与接口方法中的名称不同的名称。