C# 属性 示例分解
在本篇文章中,我们会看到如何在示例中使用C#属性。
C#中属性是什么?
C#中,属性是字段的扩展,当隐蔽实现细节的时候,属性允许类读、写、关闭私有字段。
在C#中,属性其实是一种专有的getter和setter函数方法,此函数封装了一个私有变量。get属性访问器用于返回数值,set访问器用于分配新值。简单来说,属性是用来从类中的私有字段get和set数据。
( get : 返回 set : 分配)
C# 属性语法
下面是属性定义的模板
1 <Access Modifier> <Return Type> <Property Name> 2 { 3 get { 4 // get accessor 5 // return value 6 } 7 8 set { 9 // set accessor 10 // assign a new value 11 } 12 }
从上面的范例模板可以看到,当我们从属性中读取数值时,get访问块执行这些语句;相似地 ,当我们分配数值给属性的时候,set访问块执行。
下面看一下属性定义的实例:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Drawing; 6 using System.Windows.Forms; 7 8 namespace PropertyDemo 9 { 10 class Employee 11 { 12 //私有字段 13 private string name; 14 15 //公共属性访问私有字段 16 public string Name 17 { 18 get { return name; } 19 set { name = value; } 20 } 21 public Employee(string name) 22 { 23 this.name = name; 24 } 25 } 26 public class Programs 27 { 28 static void Main(string[] args) 29 { 30 //构造函数 31 Employee employee = new Employee("Shekh Ali"); 32 //调用Name属性的get语句块 33 string XM = employee.Name; 34 Console.WriteLine("Name is:{0}",XM); 35 36 //调用Name属性的set语句块 37 employee.Name = "Mark Adams"; 38 Console.WriteLine("Name is :{0}",employee.Name); 39 40 //从此例可以看出,programs类中无法再访问name私有字段,只有访问Name属性; 41 } 42 } 43 }
从上面 的示例可以看出,通过访问公共的属性我们可以看到私有字段name现在显露出来了。如果我们想要读取name字段的值,我们必须用employee的实例对象来调用Name属性。类似地,如果我们想要设置name字段的新值,我们必须要调用Name属性的set词句块。
get访问器和set访问器不仅限于读取或写入值到属性里面,而且允许我们在set或get语句块中做非常复杂的运算或业务逻辑。
1 public string Name 2 { 3 get { 4 if (string.IsNullOrEmpty(name)) 5 { 6 // Business Logic 7 name = "Name is not available !"; 8 } 9 return name; 10 } 11 12 set { 13 name = value; 14 } 15 }
C# 只读属性
只有get访问器而没有set访问器的属性称为只读属性。
只读属性允许我们只读取私有字段的值。
1 class Employee 2 { 3 private string name; 4 5 // ReadOnly Property 6 public string Name 7 { 8 get { 9 return name; 10 } 11 } 12 // Constructor 13 public Employee(string name) 14 { 15 this.name = name; 16 } 17 } 18 public class Programs 19 { 20 21 public static void Main(string[] args) 22 { 23 Employee employee = new Employee("Shekh Ali"); // Constructor 24 string name = employee.Name; // Calling get block of the ReadOnly property 25 26 Console.WriteLine($"Name : {name}"); 27 employee.Name = "Mark Adams"; // Calling set block to assign the new value. 28 Console.WriteLine($"Name : {employee.Name}"); 29 30 Console.ReadLine(); 31 } 32 33 }
从上面 的示例中可以看出,当我们试图在构造函数之外尝试设置属性值的时候,程序会抛出错误信息。
C# 只写属性
类似地,正如我们已经创建的只读属性那样,我们也能创建只写属性。只写属性只有set语句块,没有get语句块;它允许我们只能设置值,而不能读取值。
如果我们尝试读取值,程序会抛出一个错误信息。
1 private string name; 2 // WriteOnly Property 3 public string Name 4 { 5 set { 6 name =value; 7 } 8 }
在C#中,自动实现的属性同时包含get访问器和set访问器,而没有任何业务逻辑。
它使代码更加清晰易读,并且在get或set块中不需要额外的业务逻辑或计算时使用。
1 // Auto Implemented Property 2 3 public string Name { get; set; }
对于自动实现的属性,编译器会在内部创建私有字段,这些属性只能通过属性的getter或setter访问。
C# 静态属性
在C#中,用static关键字标记的属性称为static属性。