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; }
}
}
}