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

 更新时间:2026年01月09日 09:15:59   作者:钰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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解MongoDB for C#基础入门

    详解MongoDB for C#基础入门

    本篇文章主要介绍了MongoDB for C#基础入门,具体介绍了c#中关于对MongoDB的连接,插入,查询等,有需要的可以了解一下。
    2016-12-12
  • C#使用非托管代码直接修改字符串的方法

    C#使用非托管代码直接修改字符串的方法

    在string方法中,如ToUpper等字符串操作方法,都会产生一个新的字符串,这样增大了运行开支。一个替代方案是通过非托管代码直接操作字符串。如替代ToUpper方法:
    2013-07-07
  • 详解c# 强制转换和类型转换

    详解c# 强制转换和类型转换

    这篇文章主要介绍了c# 强制转换和类型转换的相关资料,帮助大家更好的理解和学习c#,感兴趣的朋友可以了解下
    2020-10-10
  • C#中将dateTimePicker初始值设置为空

    C#中将dateTimePicker初始值设置为空

    本文主要介绍了C#中将dateTimePicker初始值设置为空,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • 基于C#实现磁性吸附窗体

    基于C#实现磁性吸附窗体

    这篇文章主要为大家详细介绍了如何利用C#实现磁性吸附窗体,文中的示例代码讲解详细,对我们学习C#有一定的帮助,感兴趣的小伙伴可以跟随小编一起了解一下
    2022-12-12
  • 关于C#连接FTP时路径问题的解决方法

    关于C#连接FTP时路径问题的解决方法

    最近在工作中遇到一个需求,需要利用C#连接FTP,在连接过程中遇到一个问题,所以下面这篇文章主要给大家介绍了关于C#连接FTP时路径问题的解决方法,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-08-08
  • C#实现终止正在执行的线程

    C#实现终止正在执行的线程

    这篇文章主要介绍了C#实现终止正在执行的线程的方法,针对临界资源等容易出现错误的地方进行了分析,并提出了改进方案与实例,需要的朋友可以参考下
    2014-09-09
  • C#并行编程之Task同步机制

    C#并行编程之Task同步机制

    这篇文章介绍了C#并行编程之Task同步机制,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • C#图片压缩的实现方法

    C#图片压缩的实现方法

    一般在web应用中,对客户端提交上来的图片肯定需要进行压缩的。尤其是比较大的图片,如果不经过压缩会导致页面变的很大,打开速度比较慢,当然了如果是需要高质量的图片也得需要生产缩略图。
    2013-02-02
  • C#开发教程之利用特性自定义数据导出到Excel

    C#开发教程之利用特性自定义数据导出到Excel

    这篇文章主要介绍了C#开发教程之利用特性自定义数据导出到Excel的相关资料,需要的朋友可以参考下
    2016-07-07

最新评论