C# 属性:初学者的全面指南

你好,未来的编程巨星!今天,我们将踏上一段激动人心的旅程,探索 C# 属性的世界。别担心如果你之前从未写过一行代码——我会成为你的友好向导,我们将一步步解决这个问题。在本教程结束时,你将成为属性专家!

C# - Properties

什么是属性?

在我们深入之前,让我们想象你有一个存钱罐。你可以把钱放进去,也可以把钱拿出来,但你不能直接访问存钱罐的内部。C# 中的属性工作原理类似——它们提供了一种访问和修改类中私有字段值的方式,同时仍然控制着这种访问是如何发生的。

为什么使用属性?

  1. 封装:它们帮助隐藏类的内部工作原理。
  2. 灵活性:你可以更改数据的存储方式,而不需要更改访问方式。
  3. 验证:你可以在设置数据之前添加检查,确保数据有效。

现在,让我们用一些代码来实践!

基本属性语法

下面是一个属性的最简单形式:

public class Person
{
private string name;

public string Name
{
get { return name; }
set { name = value; }
}
}

在这个例子中,Name 是我们的属性。它与私有字段 name 关联。getset 部分称为访问器。

访问器

属性有两个主要的访问器:

  1. get:检索属性的值
  2. set:为属性分配新值

让我们分解我们的 Name 属性:

public string Name
{
get { return name; } // 这是获取器
set { name = value; } // 这是设置器
}

当你访问属性(例如 person.Name)时,会调用获取器。当你分配一个值(例如 person.Name = "John")时,会调用设置器。

自动实现的属性

C# 为不需要任何特殊逻辑的简单属性提供了一个简写形式:

public class Person
{
public string Name { get; set; }
}

这会创建一个名为 Name 的属性,并有一个隐藏的后备字段,由 C# 管理为你。这就像魔法一样!

带有逻辑的属性

现在,让我们给我们的属性添加一些魔力:

public class BankAccount
{
private decimal balance;

public decimal Balance
{
get { return balance; }
set
{
if (value < 0)
{
throw new ArgumentException("余额不能为负");
}
balance = value;
}
}
}

在这里,我们确保余额永远不能为负。如果有人尝试设置一个负余额,我们会抛出一个异常。这就像为你的存钱罐配备了一个保镖!

只读和只写属性

有时,你可能想要限制对你的属性的访问:

public class SecretAgent
{
private string codeName = "007";

// 只读属性
public string CodeName
{
get { return codeName; }
}

// 只写属性
public string Mission
{
set { Console.WriteLine($"新任务:{value}"); }
}
}

詹姆斯·邦德会赞同这种保密级别的!

表达式体属性

对于简单属性,C# 6.0 引入了一种更简洁的语法:

public class Circle
{
public double Radius { get; set; }

// 使用表达式体的只读属性
public double Area => Math.PI * Radius * Radius;
}

=> 语法就像是在说 "这个属性由以下表达式定义"。它简短、甜蜜,而且充满数学气息!

抽象属性

在抽象类中,你可以定义抽象属性,派生类必须实现它们:

public abstract class Shape
{
public abstract double Area { get; }
}

public class Square : Shape
{
public double Side { get; set; }

public override double Area => Side * Side;
}

这就像为属性创建了一个蓝图,你的 "子" 类必须填写。

属性方法表

下面是一个属性相关方法的便捷表格:

方法 描述 示例
get 检索属性值 get { return name; }
set 设置属性值 set { name = value; }
init 仅在对象初始化时设置属性值 public string Name { get; init; }
value 在设置器中表示被分配的值 set { if (value != null) name = value; }

结论

恭喜你!你已经迈出了进入 C# 属性世界的第一步。记住,属性就像是你的类的私有字段的训练有素的管家——它们管理访问,执行规则,并保持整洁。

在你继续编程之旅时,你会发现属性无处不在。它们是编写干净、可维护的 C# 代码的重要组成部分。继续练习,很快你就能像专业人士一样使用属性!

快乐编程,愿你的属性总是得到妥善保护!??‍??‍?

Credits: Image by storyset