Sam*_*Sam 2 c# language-design
我最近在Objective C中编写了大量代码,同时还开展了几个C#项目.在这个过程中,我发现我错过了双向的事情.
特别是,当我在C#中编码时,我发现我错过了Objective C的短空检查语法.
为什么在C#中假设您无法使用以下语法检查对象是否为null:
if (maybeNullObject) // works in Objective C, but not C# :(
{
...
}
Run Code Online (Sandbox Code Playgroud)
我同意这if (maybeNullObject != null)是一个更冗长/更清晰的语法,但是在代码中一直写出来但过于冗长的感觉不仅乏味.另外,我相信if (maybeNullObject)大多数开发人员通常都会理解语法(Javascript,Obj C,我假设其他人).
我把它抛出作为一个问题,假设可能有一个特定的原因C#不允许if (maybeNullObject)语法.但我认为编译器可以轻松地将对象表达式(如if (maybeNullObject)自动(或自动))转换为if (maybeNullObject != null).
这个问题的一个很好的参考是一个想法如何成为一个C#语言功能?.
我建议的短空检查语法只适用于对象.短的空检查不适用于原语和类型bool?.
因为ifC#中的语句是严格的.它们只取布尔值,没有别的,并且没有后续级别的"真实性"(即0,null,无论如何.它们是它们自己的动物,并且它们不存在隐式转换).
编译器可以"轻松地"将几乎任何表达式"转换"为布尔值,但这可能会导致细微的问题(相信我......)并且有意识地决定不允许这些隐式转换.
IMO这是一个不错的选择.您基本上要求一次性隐式转换,其中编译器假定,如果表达式未返回布尔结果,则程序员必须要执行空检查.除了是一个非常狭窄的特征,它纯粹是语法糖,提供很少甚至没有明显的好处.正如Eric Lippert woudl所说,每个功能都有成本......
您要求的功能会为语言增加不必要的复杂性(是的,它很复杂,因为类型可能会定义一个隐式转换为bool.如果是这种情况,执行哪个检查?)只允许您不键入!= null一次等一下.
编辑:
如何bool为@Sam 定义隐式转换的示例(对于注释来说太长).
class Foo
{
public int SomeVar;
public Foo( int i )
{
SomeVar = i;
}
public static implicit operator bool( Foo f )
{
return f.SomeVar != 0;
}
}
static void Main()
{
var f = new Foo(1);
if( f )
{
Console.Write( "It worked!" );
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
999 次 |
| 最近记录: |