get 和 set 是 C# 属性的访问器,非方法也非字段,必须位于属性定义内;get 无参且须返回属性类型值,set 隐含 value 参数不可重命名;可单独省略以实现只读/只写;自动属性由编译器生成隐藏字段,手动实现需显式声明私有字段防递归;只读属性(get;)仅限声明或构造函数赋值,init 属性允许初始化器赋值但之后不可修改。

get 和 set 是属性的访问器,不是方法也不是字段
在 C# 中,get 和 set 只能出现在属性(property)定义内部,用来控制对底层字段的读写逻辑。它们不是独立可调用的函数,也不能像方法那样传参或被显式调用。
常见误解是把属性当成“带括号的方法”,比如写 obj.Name() —— 这会报错,正确写法是 obj.Name(无括号)。
-
get语句块必须返回与属性类型一致的值,且不能有参数 -
set语句块隐含一个名为value的参数,类型自动匹配属性类型 - 可以单独省略
get或set(如只读/只写属性),但至少保留一个
自动属性 vs 手动实现 get/set
多数场景推荐用自动属性(public string Name { get; set; }),编译器自动生成隐藏字段和默认访问器。只有当你需要校验、触发事件、延迟加载或日志时,才手动展开。
手动实现时,必须显式声明私有字段,并在 get/set 中操作它;否则会无限递归调用自身(比如在 get 里直接 return Name)。
private string _name;
public string Name
{
get { return _name; }
set
{
if (string.IsNullOrWhiteSpace(value))
throw new ArgumentException("Name cannot be null or empty");
_name = value.Trim();
}
}
set 访问器里的 value 是隐式参数,不能重命名
value 是 C# 为 set 访问器预定义的关键词,作用域仅限于该 set 块内。你不能把它改成 newValue 或加 var 声明,否则编译失败。
95Shop可以免费下载使用,是一款仿醉品商城网店系统,内置SEO优化,具有模块丰富、管理简洁直观,操作易用等特点,系统功能完整,运行速度较快,采用ASP.NET(C#)技术开发,配合SQL Serve2000数据库存储数据,运行环境为微软ASP.NET 2.0。95Shop官方网站定期开发新功能和维护升级。可以放心使用! 安装运行方法 1、下载软件压缩包; 2、将下载的软件压缩包解压缩,得到we
- 错误写法:
set { string newValue = value; _name = newValue; }(虽然不报错,但string newValue是冗余声明) - 更错误写法:
set (string v) { _name = v; }(C# 不支持给set加自定义参数) - 正确写法就是直接用
value,它类型由属性决定,无需声明
只读属性和 init-only 属性的差异
C# 6 开始支持只读自动属性:public string Id { get; } = Guid.NewGuid().ToString();,只能在声明时或构造函数中赋值。
C# 9 引入 init 访问器,允许在对象初始化器中赋值,之后不可改:public string Tag { get; init; }。注意 init 不是 set 的别名,二者互斥;用了 init 就不能再有 set。
容易踩坑的是:在构造函数里给 init 属性赋值是合法的,但通过反射或 MemberInfo.SetValue 强行修改会抛 InvalidOperationException。