为何C#中无需括号即可调用部分成员?字段与函数为何相似?
C# 调用省略括号与成员定义相似性问题解析
代码示例
示例1
using System; class HelloWorld { static void Main() { Console.WriteLine(first()); Console.WriteLine(second); } private static string first() => "first"; private static string second => "second"; }
示例2
private string first() => "first"; private string second => "second"; void Sample() { print(second); // 无错误 print(second()); // 报错 print(first()); // 无错误 print(first); // 报错 }
问题解答
1. 调用时省略括号是否属于可选语法糖?
不是。这不是可选的语法糖调用方式,而是你访问的是两种完全不同的成员:
first()是方法调用:方法必须通过加括号()来执行,这是C#语法的硬性规定。省略括号时,编译器会认为你试图引用方法本身而非调用它,但print不接受方法委托类型的参数,因此报错。second是只读属性:这里用的是C# 6.0引入的表达式体只读属性语法,和传统写法private string second { get { return "second"; } }完全等价。属性的访问规则就是直接用名称,不需要加括号,加括号会被编译器识别为试图调用不存在的方法,所以报错。
2. 为何字段与函数的定义形式如此相似?
这是因为C# 6.0及后续版本引入了表达式体成员语法,该语法统一了多种成员的简化写法:
- 方法的表达式体写法:
返回类型 方法名() => 表达式;是返回类型 方法名() { return 表达式; }的简化形式。 - 只读属性的表达式体写法:
返回类型 属性名 => 表达式;是返回类型 属性名 { get { return 表达式; } }的简化形式。
这种语法让方法和只读属性的定义看起来形式接近,但二者本质完全不同:方法是执行一段逻辑并返回结果,属性是对某个值(或计算值)的封装,语义上更接近字段而非方法。
内容的提问来源于stack exchange,提问作者koplenov
相关产品推荐
相关产品推荐

