字段与属性都是类的成员。
字段是数据成员,是隶属于类的变量。
属性是函数成员,它不为数据存储分配内寸,它执行代码。
当字段为private,可以用属性来读写此字段。
代码如下
class C1
{
private int realValue; //分配内存
public int RealValue // 不分配内存
{
//get访问器必须包含return语句,返回字段‘realValue’
get
{
return realValue;
}
set //set访问器接受它的输入参数--value,并巴它赋给字段,value是隐式参数。
{
realValue = value;
}
}
}
class Program
{
static void Main(string[] args)
{
C1 c = new C1();
Console.WriteLine("realValue:{0}", c.RealValue);//把属性看做一个字段,从中读取它的值。
c.RealValue = 20; //通过set访问器赋值。
Console.WriteLine("realValue:{0}", c.RealValue);
Console.Read();
}
}
属性也可以设置只读或只写
{
private int realValue; //分配内存
public int RealValue // 不分配内存
{
private
get
{
return realValue;
}
set//只写,此时set访问器的访问修饰符同属性的访问修饰符一样都为:public;不能同时为set,get访问器添加访问修饰符。
{
realValue = value;
}
}
}
或者
class C1
{
private int realValue;
private int complexValue;
public int RealValue
{
get //只读
{
return realValue;
}
}
public int ComplexValue
{
set //只写
{
complexValue = value;
}
}
}
属性也可以不与字段关联
class Triangle
{
public double A = 3;
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();
}
}
属性也可不用显示声明字段用于存贮数据。
/// <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();
}
}
也可以通定义其他函数来实现访问private字段
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();
}
}
通过上面的代码,可以看到属性的set,get,访问器更简洁。
从代码上看,属性有set,get,访问器;字段没有。
定义方法访问字段,需显示定义value