C#基础知识 2:基本语法
2.4 属性
属性 是类或结构中的成员,用于提供对字段的受控访问。属性允许您定义如何读取、写入或计算字段的值。以下是属性的详细讲解,包括其优点、缺点以及代码示例。
2.4.1 属性的基本概念
属性 是类或结构中的成员,提供对字段的受控访问。属性可以包含 get
和 set
访问器,分别用于读取和写入字段的值。
示例:
csharp
public class Person
{
// 私有字段
private string name;
private int age;
// 公共属性
public string Name
{
get { return name; }
set { name = value; }
}
public int Age
{
get { return age; }
set
{
if (value >= 0)
{
age = value;
}
else
{
throw new ArgumentException("Age cannot be negative.");
}
}
}
}
2.4.2 属性的声明和使用
属性声明 包括属性的类型、名称和访问器(get
和 set
)。
示例:
csharp
public class Person
{
// 私有字段
private string name;
// 公共属性
public string Name
{
get { return name; }
set { name = value; }
}
}
属性使用 通过对象访问属性。
示例:
csharp
class Program
{
static void Main(string[] args)
{
Person person = new Person();
person.Name = "Alice"; // 使用set访问器设置值
Console.WriteLine(person.Name); // 使用get访问器获取值
}
}
2.4.3 属性的优点
-
封装:
- 通过属性,可以控制对字段的访问,提高数据的安全性。
- 可以在
set
访问器中添加验证逻辑。
-
代码重用:
- 属性可以被多次使用,避免重复代码。
- 提高代码的可重用性和可维护性。
-
提高可读性:
- 属性名可以清晰地描述其功能。
- 通过属性访问字段,代码更易于理解和阅读。
-
灵活性:
- 可以在不改变类接口的情况下,修改字段的实现细节。
- 例如,可以在
get
或set
访问器中添加日志记录或性能计数。
-
多态性:
- 通过继承和接口实现多态性,提高代码的灵活性和可扩展性。
2.4.4 属性的缺点
-
复杂性增加:
- 对于小型项目,使用属性可能会增加不必要的复杂性。
- 需要额外的时间来设计和管理属性结构。
-
学习曲线:
- 对于初学者,理解属性的概念和使用方法可能需要一些时间。
-
性能开销:
- 属性访问可能会带来一定的性能开销,尤其是在性能敏感的应用中。
-
内存消耗:
- 每个属性访问都会占用一定的内存,可能导致内存消耗增加。
2.4.5 属性的代码示例
以下是一些详细的代码示例,展示了如何声明和使用属性。
示例1:简单的属性
文件1:Person.cs
csharp
public class Person
{
// 私有字段
private string name;
// 公共属性
public string Name
{
get { return name; }
set { name = value; }
}
}
文件2:Program.cs
csharp
using System;
class Program
{
static void Main(string[] args)
{
Person person = new Person();
person.Name = "Alice"; // 使用set访问器设置值
Console.WriteLine(person.Name); // 使用get访问器获取值
}
}
示例2:带有验证逻辑的属性
文件1:Person.cs
csharp
public class Person
{
// 私有字段
private string name;
private int age;
// 公共属性
public string Name
{
get { return name; }
set { name = value; }
}
public int Age
{
get { return age; }
set
{
if (value >= 0)
{
age = value;
}
else
{
throw new ArgumentException("Age cannot be negative.");
}
}
}
}
文件2:Program.cs
csharp
using System;
class Program
{
static void Main(string[] args)
{
Person person = new Person();
person.Name = "Bob";
person.Age = 30;
Console.WriteLine($"Name: {person.Name}, Age: {person.Age}");
try
{
person.Age = -5; // 尝试设置负年龄
}
catch (ArgumentException ex)
{
Console.WriteLine($"Error: {ex.Message}");
}
}
}
示例3:只读属性
文件1:Person.cs
csharp
public class Person
{
// 私有字段
private string name;
private int age;
// 构造函数
public Person(string name, int age)
{
this.name = name;
this.age = age;
}
// 只读属性
public string Name
{
get { return name; }
}
public int Age
{
get { return age; }
}
}
文件2:Program.cs
csharp
using System;
class Program
{
static void Main(string[] args)
{
Person person = new Person("Charlie", 25);
Console.WriteLine($"Name: {person.Name}, Age: {person.Age}");
// 尝试修改只读属性(编译错误)
// person.Name = "David"; // 错误:无法为只读属性赋值
}
}
示例4:自动实现属性
文件1:Person.cs
csharp
public class Person
{
// 自动实现属性
public string Name { get; set; }
public int Age { get; set; }
}
文件2:Program.cs
csharp
using System;
class Program
{
static void Main(string[] args)
{
Person person = new Person();
person.Name = "Eve";
person.Age = 28;
Console.WriteLine($"Name: {person.Name}, Age: {person.Age}");
}
}
示例5:带有逻辑的属性
文件1:Person.cs
csharp
public class Person
{
// 私有字段
private string name;
private int age;
// 公共属性
public string Name
{
get { return name; }
set { name = value; }
}
public int Age
{
get { return age; }
set
{
if (value >= 0 && value <= 120)
{
age = value;
}
else
{
throw new ArgumentException("Age must be between 0 and 120.");
}
}
}
// 计算属性
public string AgeCategory
{
get
{
if (age < 18)
{
return "Minor";
}
else if (age < 65)
{
return "Adult";
}
else
{
return "Senior";
}
}
}
}
文件2:Program.cs
csharp
using System;
class Program
{
static void Main(string[] args)
{
Person person = new Person();
person.Name = "Frank";
person.Age = 45;
Console.WriteLine($"Name: {person.Name}, Age: {person.Age}, Age Category: {person.AgeCategory}");
try
{
person.Age = 150; // 尝试设置无效年龄
}
catch (ArgumentException ex)
{
Console.WriteLine($"Error: {ex.Message}");
}
}
}
通过以上详细讲解和代码示例,您可以更好地理解和使用C#中的属性。属性是组织代码的重要工具,有助于提高代码的封装性、可读性和可维护性。