You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 18:50:28