属性一般和字段关联使用,此时的字段称后备字段,有两种命名约定:
属性和后备字段简单示例如下:
using System;
namespace ConsoleApp2
{
class C
{
private int _testField = 5; //后备字段
public int TestField //属性
{
set { _testField = value;} //设置字段值
get { return _testField; } //获取字段值
}
}
class Program
{
static void Main(string[] args)
{
C c1 = new C(); //实例
Console.WriteLine("{0}",c1.TestField); //打印属性值
c1.TestField = 101; //设置属性值
Console.WriteLine("{0}",c1.TestField); //打印属性值
}
}
}
执行计算的属性示例如下:
using System;
namespace ConsoleApp2
{
class C
{
private int _testField = 5; //后备字段
public int TestField //属性
{
set
{
_testField = value > 100 //判断是否大于100
? 100 //大于100,设置值为 100
: value; //否则设置为输入值
}
get { return _testField; } //获取字段值
}
}
class Program
{
static void Main(string[] args)
{
C c1 = new C(); //实例
Console.WriteLine("{0}",c1.TestField); //打印属性值
c1.TestField = 101; //设置属性值
Console.WriteLine("{0}",c1.TestField); //打印属性值
}
}
}
只读和只写属性如下:
- 只有get访问器的属性称为只读属性。只读属性是一种安全的,把一项数据从类或类的实例中传出,而不允许太多访问方法。
- 只有set访问器的属性称为只写属性。只写属性是一种安全的,把一项数据从类的外部传入类,而不允许太多访问的方法。
- 两个访问器中至少有一个必须定义,否则编译器会产生一条错误信息。
按照推荐的编码实践,属性比公共字段更好,理由如下。
- 属性是函数型成员而不是数据成员,允许你处理输入和输出,而公共字段不行。
- 属性可以只读或只写,而字段不行。
- 编译后的变量和编译后的属性语义不同。
自动实现属性
using System;
namespace ConsoleApp2
{
class C
{
private int _testField = 5; //后备字段
public int TestField //属性
{
set; get;
}
}
class Program
{
static void Main(string[] args)
{
C c1 = new C(); //实例
Console.WriteLine("{0}",c1.TestField); //打印属性值
c1.TestField = 101; //设置属性值
Console.WriteLine("{0}",c1.TestField); //打印属性值
}
}
}
静态属性
属性也可以声明为static。静态属性的访问器和所有静态成员一样,具有以下特点。
- 不能访问类的实例成员一—虽然它们能被实例成员访问。
- 不管类是否有实例,它们都是存在的。
- 当从类的外部访问时,必需使用类名引用,而不是实例名。
using System;
namespace ConsoleApp3
{
class C
{
public static int MyValue { get; set; }
public void PrintValue()
{
Console.WriteLine("{0}",MyValue); //类内部访问
}
}
class Program
{
static void Main(string[] args)
{
C.MyValue = 10; //这就是上面第三条,类外部访问静态属性,只能用类名引用,不能用实例。
Console.WriteLine("{0}", C.MyValue); //这就是上面第三条,类外部访问静态属性,只能用类名引用,不能用实例。
C c1 = new C();
c1.PrintValue();
}
}
}