C#中的字段和属性(附带实例)
类的定义包括类头和类体两部分,其中,类头就是使用 class 关键字定义的类名,而类体是用一对大括号{}括起来的,在类体中主要定义类的成员,类的成员包括字段、属性、方法、构造函数等。
本节将对字段和属性进行讲解。
【实例 1】计算圆的面积。创建一个控制台应用程序,在默认的 Program 类中定义一个变量,用来存储圆半径;定义一个常量,用来存储 π 的值;然后在 Main() 方法中计算圆的面积并输出。代码如下:
程序运行结果为:
字段属于类级别的变量,未初始化时,C# 将其初始化为默认值,但不会将局部变量初始化为默认值。例如,下列代码是正确的,输出为 0:

图 1 局部变量未初始化时的错误
C#中的属性具有访问器,这些访问器指定在它们的值被读取或写入时需要执行的语句,因此属性提供了一种机制,把读取和写入对象的某些特性与一些操作关联起来,开发人员可以像使用公共数据成员一样使用属性,属性的声明语法如下:
根据是否存在 get 访问器和 set 访问器,可以将属性分为以下 3 种:
属性的主要用途是限制外部类对类中成员的访问权限,定义在类级别上。
例如,自定义一个 TradeCode 属性,表示商品编号,要求该属性为可读可写属性,并设置其访问级别为 public,代码如下:
【实例 2】首先创建一个控制台应用程序,在默认的 Program 类中定义一个 Age 属性,设置访问级别为 public,因为该属性提供了 get 访问器和 set 访问器,因此它具有可读可写属性;然后在该属性的 set 访问器中对属性的值进行控制,控制只能输入 1~70 之间的数据,如果输入其他数据,就会提示相应的信息。代码如下:
C# 中支持自动实现的属性,即在属性的 get 访问器和 set 访问器中没有任何逻辑,代码如下:
使用自动实现的属性时,就不能在属性设置中进行属性的有效验证,例如,在实例 2 中,不能检查输入的年龄在 0~70 之间。另外,如果要使用自动实现的属性,则必须同时拥有 get 访问器和 set 访问器,如果只有 get 或者只有 set 的代码,就会出现错误,例如,下面的代码是不合法的:
本节将对字段和属性进行讲解。
C#字段
字段就是程序开发中常见的常量或者变量,它是类的一个构成部分,使得类可以封装数据。【实例 1】计算圆的面积。创建一个控制台应用程序,在默认的 Program 类中定义一个变量,用来存储圆半径;定义一个常量,用来存储 π 的值;然后在 Main() 方法中计算圆的面积并输出。代码如下:
class Program { static double r; //定义一个变量,用来存储圆半径 const double PI = 3.14; //定义常量,存储π的值 static void Main(string[] args) { Console.Write("请输入半径: "); Program.r = Convert.ToDouble(Console.ReadLine()); //输入圆半径 Console.WriteLine("圆面积为: " + PI * Math.Pow(r, 2)); //计算圆面积 Console.ReadLine(); } }代码注解:
- 第 3 行代码为变量加 static 关键字,说明是一个静态变量;
- 第 9 行代码中的 Math.Pow() 方法用来计算某个数的指定次幂;
- 上面代码中的变量 r 和常量 PI 是 Program 类中的字段。
程序运行结果为:
请输入半径: 4 圆面积为: 50.24
字段属于类级别的变量,未初始化时,C# 将其初始化为默认值,但不会将局部变量初始化为默认值。例如,下列代码是正确的,输出为 0:
class Program { static int i; static void Main(string[] args) { Console.WriteLine(i); } }但是,如果将变量 i 的定义存储在 Main() 方法中,则运行时会出现如下图所示的错误提示:

图 1 局部变量未初始化时的错误
C#属性
属性是对现实实体特征的抽象,提供对类或对象的访问。类的属性描述的是状态信息,在类的实例中,属性的值表示对象的状态值。C#中的属性具有访问器,这些访问器指定在它们的值被读取或写入时需要执行的语句,因此属性提供了一种机制,把读取和写入对象的某些特性与一些操作关联起来,开发人员可以像使用公共数据成员一样使用属性,属性的声明语法如下:
【权限修饰符】【类型】【属性名】 { get {get访问器体} set {set访问器体} }
- 【权限修饰符】:指定属性的访问级别。
- 【类型】:指定属性的类型,可以是任何预定义或自定义的类型。
- 【属性名】:一种标识符,命名规则与变量相同,但是,属性名的第一个字母通常用大写。
- get 访问器:相当于一个具有属性类型返回值的无参数方法,它除了作为赋值的目标,当在表达式中引用属性时,将调用该属性的 get 访问器获取属性的值。get 访问器中的语句需要用 return 语句来返回,并且所有的 return 语句都必须返回一个可隐式转换为属性类型的表达式。
- set 访问器:相当于一个具有单个属性类型值参数和 void 返回类型的方法。set 访问器的隐式参数始终命名为 value。当一个属性作为赋值的目标被引用时,就会调用 set 访问器,所传递的参数将提供新值。由于 set 访问器存在隐式的参数value,因此,在 set 访问器中不能自定义名称为 value 的局部变量或常量。
根据是否存在 get 访问器和 set 访问器,可以将属性分为以下 3 种:
- 可读可写属性:包含 get 访问器和 set 访问器;
- 只读属性:只包含 get 访问器;
- 只写属性:只包含 set 访问器;
属性的主要用途是限制外部类对类中成员的访问权限,定义在类级别上。
例如,自定义一个 TradeCode 属性,表示商品编号,要求该属性为可读可写属性,并设置其访问级别为 public,代码如下:
private string tradecode = ""; public string TradeCode { get { return tradecode; } set { tradecode = value; } }由于属性的 set 访问器中可以包含大量的语句,因此可以对赋予的值进行检查,如果值不安全或者不符合要求,就可以进行处理操作,这样可以避免因为给属性设置了错误的值而导致的异常。
【实例 2】首先创建一个控制台应用程序,在默认的 Program 类中定义一个 Age 属性,设置访问级别为 public,因为该属性提供了 get 访问器和 set 访问器,因此它具有可读可写属性;然后在该属性的 set 访问器中对属性的值进行控制,控制只能输入 1~70 之间的数据,如果输入其他数据,就会提示相应的信息。代码如下:
class Program { private int age; //定义字段 public int Age //定义属性 { get //设置get访问器 { return age; } set //设置set访问器 { if (value > 0 && value < 70) { age = value; } else { Console.WriteLine("输入数据不合理!"); } } } static void Main(string[] args) { Program p = new Program(); //创建Program类的对象 while (true) { Console.Write("请输入年龄: "); p.Age = Convert.ToInt16(Console.ReadLine()); //为年龄属性赋值 } } }第 24 行代码用来创建类的对象,创建类的对象时,使用 new 操作符。程序运行结果为:
请输入年龄: 30
请输入年龄: 140
输入数据不合理!
请输入年龄: -5
输入数据不合理!
请输入年龄:
C# 中支持自动实现的属性,即在属性的 get 访问器和 set 访问器中没有任何逻辑,代码如下:
public int Age { get; set; }
使用自动实现的属性时,就不能在属性设置中进行属性的有效验证,例如,在实例 2 中,不能检查输入的年龄在 0~70 之间。另外,如果要使用自动实现的属性,则必须同时拥有 get 访问器和 set 访问器,如果只有 get 或者只有 set 的代码,就会出现错误,例如,下面的代码是不合法的:
public int Age { get; }