属性与字段

本文详细介绍了C#中的属性和字段的区别与使用,包括属性的getter和setter访问器、自动实现属性以及如何通过方法访问私有字段。通过实例展示了属性的创建、赋值和访问,强调了属性与字段在数据访问和限制上的不同。同时探讨了特殊情况,如属性不关联字段和仅声明属性的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

https://blog.youkuaiyun.com/sophiemantela/article/details/80595466?
https://blog.youkuaiyun.com/qq_44034384/article/details/106558354?
学习记录借鉴以上文章,若有侵权请联系

1. 创建一个Person类

using System;
namespace ConsoleApplication1
{
    class Person
    {
		//private int realValue; //分配内存
        //public int RealValue // 不分配内存
        
        //这里是字段用来存储数据,private可写可不写(默认private)
        private string name;
        private int age;
        private string sex;

        //这里是属性,本身没值,用于给字段赋值与取值时的方法,但不能称之为方法
        public string Name
        {
            get { return name; }
            set { name = value; }
        }


        public int Age
        {
            //取值时进行判断
            get
            {
                if (age < 0 || age > 100)
                {
                    return age = 0;
                }

                return age;
            }
            set { age = value; }
        }

        public string Sex
        {
            get { return sex; }
            //赋值时进行判断
            set
            {
                if (value != "男" && value != "女")
                {
                    value = "男";
                }

                sex = value;
            }
        }

        /// <summary>
        /// 输出基本信息
        /// </summary>
        public void Message()
        {
            Console.WriteLine("姓名:{0},年龄:{1},性别:{2}", this.Name, this.Age, this.Sex);
        }
    }
}

2. 进行实例化

Person person = new Person();
person.Name = "张三";
person.Age = 23;
person.Sex = "男";
person.Message();
Console.ReadLine();

3.执行结果

姓名:张三,年龄:23,性别:男


特殊情况

1、属性也可以不与字段关联(个人理解:调用属性时,将字段的数据带入属性之中)

 class Triangle 
    {
        public double A = 3;  //注意这里是public 并不是private 所以可以直接在主函数调用
        public double B = 5;
        public double GetThird 
        {
            get 
            {
                return Math.Sqrt((A * A) + (B * B));
            }
        }
    }
     class Program
    {
        static void Main(string[] args)
        {
            Triangle tri = new Triangle();
            Console.WriteLine("三角形的第三边长度:{0}", tri.GetThird);
            tri.A = 7;
            tri.B = 13;
            Console.WriteLine("三角形的第三边长度:{0}", tri.GetThird);

             Console.Read();
        }
    }

2、属性也可不用显示声明字段用于存贮数据。

/// <summary>
    /// 自动实现属性:c# 允许只声明属性而不声明后备字段,编译器会创建隐藏的后备字段。并且自动挂接到get,set访问器上。
    /// </summary>

    class C2
    {
        public int RealValue //分配内存
        {
            get;
            set;
        }
    }
       class Program
    {
        static void Main(string[] args)
        {

            C2 ctest = new C2();
            Console.WriteLine("属性值:{0}", ctest.RealValue);
            ctest.RealValue = 23;
            Console.WriteLine("属性值:{0}", ctest.RealValue);

            Console.Read();
        }
    }

3、也可以通定义其他函数来实现访问private字段(利用方法来实现与get和set同等作用)

  class Person2
    {
        private string _name;

        //定义GetName方法
        public string GetName()
        {
            return _name;
        }
        //定义SetName方法,显示定义 value 参数 
        public void SetName(string value)
        {
            this._name = value;
        }
        private int _age;
        public int Age //属性
        {
            private get
            {
                return _age;
            }
            set
            {
                if ((value < 0) || (value > 130))
                    Console.WriteLine("输入的年龄值无效!!");
                else
                {
                    this._age = value;
                }
            }
        }
        public void Print()
        {
            Console.WriteLine("name: {0},age= {1}", _name, _age);
        }
    }
     class Program
    {
        static void Main(string[] args)
        {

            Person2 per = new Person2();
            per.SetName("xiao hong"); //通过方法给字段赋值。
            per.Age = 23;//通过属性给字段赋值。
            per.Print();

            Console.Read();
        }
    }

总结
1、属性不能直接访问数据,字段可以直接访问数据
2、可以在属性上添加对数据访问的限制
3、属性没有存储数据的功能,数据都存在字段中,所以只有修改字段的数据才能更改数据,修改属性的值没用
4、属性并不能单独出现,必须有字段的条件下才能有属性

疑惑
这种情况下t.name和t.Name的值相同,后者覆盖前者?

using System;

namespace _10_属性与字段
{
    class Program
    {
        static void Main(string[] args)
        {
            Triangle t = new Triangle();
            t.Name = "1";
            t.name = "2";
            Console.WriteLine(t.name, t.Name);
            Console.ReadLine();
        }
    }

    class Triangle
    {
        public string name;
        public string Name
        {
            get { return name; }
            set { name = value; }
        }
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值