天舟飞月 發表於 2026-1-9 09:15:59

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

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>一、核心概念对比</li><li>二、属性的三种写法</li><ul class="second_class_ul"><li>1.完整写法(原始写法)</li><li>2.简化写法</li><li>3.自动属性(语法糖)</li></ul><li>三、Set 和 Get 访问器的本质</li><ul class="second_class_ul"><li>Set 访问器</li><li>Get 访问器</li></ul><li>四、访问器的实际应用(重要)</li><ul class="second_class_ul"><li>1.添加验证逻辑</li><li>2.添加额外逻辑</li><li>3.只读或只写属性</li></ul><li>六、为什么要用属性而不是字段</li><ul class="second_class_ul"><li>1.数据封装</li><li>2.向后兼容</li><li>3.数据绑定支持</li></ul><li>八、常见错误</li><ul class="second_class_ul"><li>❌ 错误1:无限递归</li><li>❌ 错误2:忘记字段</li></ul><li>九、一句话总结</li><ul class="second_class_ul"></ul></ul></div><p class="maodian"></p><h2>一、核心概念对比</h2>
<table><thead><tr><th>概念</th><th>定义</th><th>作用</th><th>访问权限</th><th>示例</th></tr></thead><tbody><tr><td>字段</td><td>private string name;</td><td>存储数据</td><td>通常私有</td><td>private int age;</td></tr><tr><td>属性</td><td>public string Name { get; set; }</td><td>访问数据</td><td>通常公有</td><td>public int Age { get; set; }</td></tr></tbody></table>
<p class="maodian"></p><h2>二、属性的三种写法</h2>
<p class="maodian"></p><h3>1.完整写法(原始写法)</h3>
<div class="jb51code"><pre class="brush:csharp;">private string _name;// 私有字段

public string Name   // 公有属性
{
    get
    {
      return _name;// 返回字段值
    }
    set
    {
      _name = value; // 设置字段值
    }
}</pre></div>
<p class="maodian"></p><h3>2.简化写法</h3>
<div class="jb51code"><pre class="brush:csharp;">// 如果只是简单传递值,可以简化
private int _id;
public int Id { get { return _id; } set { _id = value; } }</pre></div>
<p class="maodian"></p><h3>3.自动属性(语法糖)</h3>
<div class="jb51code"><pre class="brush:csharp;">// 编译器自动生成私有字段
public bool Sex { get; set; }
public int Age { get; set; }</pre></div>
<p class="maodian"></p><h2>三、Set 和 Get 访问器的本质</h2>
<p class="maodian"></p><h3>Set 访问器</h3>
<div class="jb51code"><pre class="brush:csharp;">// 本质:一个设置值的方法
public string Name
{
    set// 相当于:public void SetName(string value)
    {
      _name = value;// value 是用户传入的值
    }
}

// 使用:p.Name = "张三";
// 相当于:p.SetName("张三");</pre></div>
<p class="maodian"></p><h3>Get 访问器</h3>
<div class="jb51code"><pre class="brush:csharp;">// 本质:一个获取值的方法
public string Name
{
    get// 相当于:public string GetName()
    {
      return _name;
    }
}

// 使用:string name = p.Name;
// 相当于:string name = p.GetName();</pre></div>
<p class="maodian"></p><h2>四、访问器的实际应用(重要)</h2>
<p class="maodian"></p><h3>1.添加验证逻辑</h3>
<div class="jb51code"><pre class="brush:csharp;">private int _age;
public int Age
{
    get { return _age; }
    set
    {
      if (value &lt; 0 || value &gt; 200)
            throw new Exception("年龄必须在0-200之间");//做一个限定值 不在值内报异常
      _age = value;
    }
}</pre></div>
<p class="maodian"></p><h3>2.添加额外逻辑</h3>
<div class="jb51code"><pre class="brush:csharp;">private string _name;
public string Name
{
    get
    {
      Console.WriteLine("获取Name值");
      return _name + " 视觉67班";// 返回时添加额外信息
    }
    set
    {
      Console.WriteLine($"设置Name值: {value}");
      _name = value;
    }
}</pre></div>
<p class="maodian"></p><h3>3.只读或只写属性</h3>
<div class="jb51code"><pre class="brush:csharp;">// 只读属性(只有get)
public string Id { get; } = Guid.NewGuid().ToString();

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

// 只写属性(不常见)
private string _secret;
public string Secret { set { _secret = value; } }</pre></div>
<p class="maodian"></p><h2>六、为什么要用属性而不是字段</h2>
<p class="maodian"></p><h3>1.数据封装</h3>
<div class="jb51code"><pre class="brush:csharp;">// ❌ 不好:直接暴露字段
public int Age;// 外部可以直接设置为负值

// ✅ 好:通过属性控制
private int _age;
public int Age
{
    get { return _age; }
    set
    {
      if (value &gt;= 0 &amp;&amp; value &lt;= 150)
            _age = value;
    }
}</pre></div>
<p class="maodian"></p><h3>2.向后兼容</h3>
<div class="jb51code"><pre class="brush:csharp;">// 第一版:直接使用字段
public int Score;

// 第二版:改为属性,添加验证
private int _score;
public int Score
{
    get { return _score; }
    set
    {
      if (value &gt;= 0 &amp;&amp; value &lt;= 100)
            _score = value;
    }
}
// 外部代码无需修改,仍然使用 obj.Score</pre></div>
<p class="maodian"></p><h3>3.数据绑定支持</h3>
<div class="jb51code"><pre class="brush:csharp;">// WPF、WinForms 等 UI 框架支持属性绑定
public string UserName { get; set; }// 可以绑定到 TextBox
</pre></div>
<p class="maodian"></p><h2>八、常见错误</h2>
<p class="maodian"></p><h3>❌ 错误1:无限递归</h3>
<div class="jb51code"><pre class="brush:csharp;">public string Name
{
    get { return Name; }// ❌ 递归调用自身
    set { Name = value; } // ❌ 递归调用自身
}

// ✅ 正确:引用字段
public string Name
{
    get { return _name; }    // ✅
    set { _name = value; }   // ✅
}</pre></div>
<p class="maodian"></p><h3>❌ 错误2:忘记字段</h3>
<div class="jb51code"><pre class="brush:csharp;">public int Score
{
    get { return ???; }// ❌ 没有字段可返回
    set { ??? = value; } // ❌ 没有字段可赋值
}

// ✅ 正确:先定义字段
private int _score;
public int Score
{
    get { return _score; }
    set { _score = value; }
}</pre></div>
<p class="maodian"></p><h2>九、一句话总结</h2>
<p>字段存储数据要私有,属性访问数据要公有。Set 是设置值的方法,Get 是获取值的方法。需要验证用完整属性,简单情况用自动属性。</p>
<p>到此这篇关于C#属性访问器Set与Get详解的文章就介绍到这了,更多相关C#属性访问器Set与Get内容请搜索琼殿技术社区以前的文章或继续浏览下面的相关文章希望大家以后多多支持琼殿技术社区!</p>
                           
                            <div class="art_xg">
                              <b>您可能感兴趣的文章:</b><ul><li>C#属性get和set使用示例详解</li><li>C#中{get;set;}的具体使用</li><li>C#中的属性解析(get、set、value)</li><li>C#之set与get方法的用法案例</li><li>深入C#中get与set的详解</li><li>C#反射(Reflection)对类的属性get或set值实现思路</li></ul>
                            </div>

                        </div>
                        <!--endmain-->
頁: [1]
查看完整版本: C#属性访问器Set与Get详解