C#教程

关注公众号 jb51net

关闭
首页 > 软件编程 > C#教程 > C#属性访问器Set与Get

C#属性访问器Set与Get详解

作者:钰fly

本文总结了C#中属性Set和Get访问器的核心概念,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、核心概念对比

概念定义作用访问权限示例
字段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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文