查看: 87|回复: 0

[教程] C#属性访问器Set与Get详解

[复制链接]

2

主题

0

回帖

0

积分

积极分子

金币
0
阅读权限
220
精华
0
威望
0
贡献
0
在线时间
0 小时
注册时间
2009-4-27
发表于 2026-1-9 09:15:59 | 显示全部楼层 |阅读模式

一、核心概念对比

概念定义作用访问权限示例
字段private string name;存储数据通常私有private int age;
属性public string Name { get; set; }访问数据通常公有public int Age { get; set; }

二、属性的三种写法

1.完整写法(原始写法)

private string _name;  // 私有字段

public string Name     // 公有属性
{ 
    get 
    {
        return _name;  // 返回字段值
    }
    set 
    {
        _name = value; // 设置字段值
    }
}

2.简化写法

// 如果只是简单传递值,可以简化
private int _id;
public int Id { get { return _id; } set { _id = value; } }

3.自动属性(语法糖)

// 编译器自动生成私有字段
public bool Sex { get; set; }
public int Age { get; set; }

三、Set 和 Get 访问器的本质

Set 访问器

// 本质:一个设置值的方法
public string Name
{
    set  // 相当于:public void SetName(string value)
    {
        _name = value;  // value 是用户传入的值
    }
}

// 使用:p.Name = "张三";
// 相当于:p.SetName("张三");

Get 访问器

// 本质:一个获取值的方法
public string Name
{
    get  // 相当于:public string GetName()
    {
        return _name;
    }
}

// 使用:string name = p.Name;
// 相当于:string name = p.GetName();

四、访问器的实际应用(重要)

1.添加验证逻辑

private int _age;
public int Age
{ 
    get { return _age; }
    set 
    {
        if (value < 0 || value > 200)
            throw new Exception("年龄必须在0-200之间");//做一个限定值 不在值内报异常
        _age = value;
    }
}

2.添加额外逻辑

private string _name;
public string Name
{
    get 
    {
        Console.WriteLine("获取Name值");
        return _name + " 视觉67班";  // 返回时添加额外信息
    }
    set 
    {
        Console.WriteLine($"设置Name值: {value}");
        _name = value;
    }
}

3.只读或只写属性

// 只读属性(只有get)
public string Id { get; } = Guid.NewGuid().ToString();

// 私有set
public string Name { get; private set; }

// 只写属性(不常见)
private string _secret;
public string Secret { set { _secret = value; } }

六、为什么要用属性而不是字段

1.数据封装

// ❌ 不好:直接暴露字段
public int Age;  // 外部可以直接设置为负值

// ✅ 好:通过属性控制
private int _age;
public int Age
{
    get { return _age; }
    set 
    {
        if (value >= 0 && value <= 150)
            _age = value;
    }
}

2.向后兼容

// 第一版:直接使用字段
public int Score;

// 第二版:改为属性,添加验证
private int _score;
public int Score
{
    get { return _score; }
    set 
    {
        if (value >= 0 && value <= 100)
            _score = value;
    }
}
// 外部代码无需修改,仍然使用 obj.Score

3.数据绑定支持

// WPF、WinForms 等 UI 框架支持属性绑定
public string UserName { get; set; }  // 可以绑定到 TextBox

八、常见错误

❌ 错误1:无限递归

public string Name
{
    get { return Name; }  // ❌ 递归调用自身
    set { Name = value; } // ❌ 递归调用自身
}

// ✅ 正确:引用字段
public string Name
{
    get { return _name; }    // ✅
    set { _name = value; }   // ✅
}

❌ 错误2:忘记字段

public int Score
{
    get { return ???; }  // ❌ 没有字段可返回
    set { ??? = value; } // ❌ 没有字段可赋值
}

// ✅ 正确:先定义字段
private int _score;
public int Score
{
    get { return _score; }
    set { _score = value; }
}

九、一句话总结

字段存储数据要私有,属性访问数据要公有。Set 是设置值的方法,Get 是获取值的方法。需要验证用完整属性,简单情况用自动属性。

到此这篇关于C#属性访问器Set与Get详解的文章就介绍到这了,更多相关C#属性访问器Set与Get内容请搜索琼殿技术社区以前的文章或继续浏览下面的相关文章希望大家以后多多支持琼殿技术社区!

您可能感兴趣的文章:
  • C#属性get和set使用示例详解
  • C#中{get;set;}的具体使用
  • C#中的属性解析(get、set、value)
  • C#之set与get方法的用法案例
  • 深入C#中get与set的详解
  • C#反射(Reflection)对类的属性get或set值实现思路
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

相关侵权、举报、投诉及建议等,请发 E-mail:qiongdian@foxmail.com

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部