【C#基础知识 5】2. 基本语法 -- 2.4 属性

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 属性的优点
  1. 封装

    • 通过属性,可以控制对字段的访问,提高数据的安全性。
    • 可以在 set 访问器中添加验证逻辑。
  2. 代码重用

    • 属性可以被多次使用,避免重复代码。
    • 提高代码的可重用性和可维护性。
  3. 提高可读性

    • 属性名可以清晰地描述其功能。
    • 通过属性访问字段,代码更易于理解和阅读。
  4. 灵活性

    • 可以在不改变类接口的情况下,修改字段的实现细节。
    • 例如,可以在 get 或 set 访问器中添加日志记录或性能计数。
  5. 多态性

    • 通过继承和接口实现多态性,提高代码的灵活性和可扩展性。
2.4.4 属性的缺点
  1. 复杂性增加

    • 对于小型项目,使用属性可能会增加不必要的复杂性。
    • 需要额外的时间来设计和管理属性结构。
  2. 学习曲线

    • 对于初学者,理解属性的概念和使用方法可能需要一些时间。
  3. 性能开销

    • 属性访问可能会带来一定的性能开销,尤其是在性能敏感的应用中。
  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#中的属性。属性是组织代码的重要工具,有助于提高代码的封装性、可读性和可维护性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路飞VS草帽

感谢支持~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值