ZetCode

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 关键字 - 语言参考

本教程演示了如何在 C# 中使用 field 关键字来处理自动实现的属性和索引器的后备字段。

作者

我叫 Jan Bodnar,是一位热情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直撰写编程文章。到目前为止,我撰写了超过 1,400 篇文章和 8 本电子书。我拥有超过十年的编程教学经验。

列出所有 C# 教程