C# field 关键字
上次修改时间:2025 年 4 月 19 日
本教程探讨如何在 C# 中使用 field 关键字来声明自动实现的属性的后备字段。
field 关键字在 C# 12 中引入,提供了一种显式引用自动实现的属性的后备字段的方法,从而在保持简洁语法的同时,能够在属性访问器中实现自定义逻辑。
理解 field 关键字
在 C# 中,自动实现的属性会自动创建一个私有的后备字段。在 C# 12 之前,开发人员没有直接方法在自定义 getter 或 setter 逻辑中访问此字段。field 关键字通过允许显式引用后备字段来解决这个问题。
field 的主要特点
- 仅可在属性或索引器访问器中使用。
- 引用编译器生成的自动实现属性的后备字段。
- 无需手动声明后备字段即可实现自定义逻辑。
- 不是独立的变量;它是一个上下文关键字。
field 的基本用法
此示例演示如何使用 field 来验证属性值。
Program.cs
class Person
{
private string _name = "Unknown";
public string Name
{
get => field;
set => field = string.IsNullOrEmpty(value) ? "Unknown" : value;
}
}
var person = new Person();
person.Name = "";
Console.WriteLine(person.Name);
person.Name = "Alice";
Console.WriteLine(person.Name);
Name 属性使用 field 来确保后备字段永远不会设置为空字符串或 null 字符串。
$ dotnet run Unknown Alice
具有自定义 Getter 逻辑的属性
此示例使用 field 来修改属性的 getter。
Program.cs
class Product
{
public decimal Price
{
get => field * 1.1m; // Apply 10% markup
set => field = value < 0 ? 0 : value;
}
}
var product = new Product();
product.Price = 100;
Console.WriteLine(product.Price);
product.Price = -50;
Console.WriteLine(product.Price);
Price 属性使用 field 在 getter 中应用标记并在 setter 中阻止负值。
$ dotnet run 110 0
将 field 与索引器一起使用
此示例演示索引器中的 field。
Program.cs
class Scores
{
public int this[int index]
{
get => field;
set => field = value >= 0 && value <= 100 ? value : throw new ArgumentException("Score must be between 0 and 100.");
}
}
var scores = new Scores();
scores[0] = 85;
Console.WriteLine(scores[0]);
try
{
scores[1] = 150;
}
catch (ArgumentException e)
{
Console.WriteLine(e.Message);
}
索引器使用 field 来验证分数,确保它们在有效范围内。
$ dotnet run 85 Score must be between 0 and 100.
将 field 与 Init-Only 属性结合使用
此示例显示了带有 init-only 属性的 field。
Program.cs
class Configuration
{
public string ConnectionString
{
get => field;
init => field = string.IsNullOrWhiteSpace(value) ? throw new ArgumentException("Invalid connection string") : value;
}
}
var config = new Configuration { ConnectionString = "Server=localhost" };
Console.WriteLine(config.ConnectionString);
try
{
var invalidConfig = new Configuration { ConnectionString = " " };
}
catch (ArgumentException e)
{
Console.WriteLine(e.Message);
}
ConnectionString 属性使用 field 来强制执行有效的初始化。
$ dotnet run Server=localhost Invalid connection string
使用 field 进行延迟初始化
此示例演示了属性中的 field 用于延迟初始化。
Program.cs
class DataCache
{
public string Data
{
get => field ??= LoadData();
set => field = value;
}
private string LoadData() => "Loaded from source";
}
var cache = new DataCache();
Console.WriteLine(cache.Data);
cache.Data = "Custom data";
Console.WriteLine(cache.Data);
Data 属性使用 field 在首次访问时延迟初始化后备字段。
$ dotnet run Loaded from source Custom data
最佳实践
何时使用 field 关键字
- 仅当访问器中需要自定义逻辑时才使用
field。 - 保持访问器逻辑简单以保持可读性。
- 与验证结合使用以强制执行业务规则。
- 当标准的自动实现的属性足够时,避免过度使用
field。
来源
本教程演示了如何在 C# 中使用 field 关键字来处理自动实现的属性和索引器的后备字段。
作者
列出所有 C# 教程。