public string Name { get; set; }这等同于
private string _name; public string Name { get => _name; set => _name = value; }使用 field 关键词改一下如下:
public string Name { get => field; set => field = value; }再来看一个实际一点使用示例:
internal static class FieldKeywordSample { public static string Name { get; set => field = value?.Trim() ?? string.Empty; } = string.Empty; }这个示例我们每次对 setter 做了一个 Trim() 的操作,并且保证不给 field 设置 null, null 时设置为 string.Empty 。这在之前版本我们就得先声明成下面这样:
internal static class FieldKeywordSample { private static string _name; public static string Name { get => _name; set => _name = value?.Trim() ?? string.Empty; } = string.Empty; }需要声明这个字段并且 getter 也需要写完整,即使没有特殊逻辑直接返回了字段。使用 field 关键词之后就无需声明字段了,并且如果是直接返回或者设置 value 就可以使用自动属性的写法,如下:
public int Num { get => field > 0 ? field : 0; set; } public int Num2 { get; set => field = value > 0 ? value : 0; }所以之前这个功能也被称为半自动属性,public string Name { get; set; } 则是完全自动属性。除了这样 getter/setter 直接使用,我们也可以在 getter 返回之前、setter set 之前以及之后做一些自定义的操作,如下:
internal static class FieldKeywordSample { public static string Name { get; set => field = value?.Trim() ?? string.Empty; //set; } = string.Empty; public static string Description { get => field ?? string.Empty; set { Console.Write(">>>"); Console.WriteLine(field); Console.WriteLine($"Before set description, {nameof(value)}: {value}"); field = value?.Trim()!; // CS0103: The name 'field' does not exist in the current context // Console.WriteLine($"After set description, {field}"); Console.WriteLine("After set description"); Console.Write(">>>"); Console.WriteLine(field); } } = default!; public static void Run() { Name = " Hello "; Console.WriteLine(Name); Console.WriteLine(Name.Length); // 堆代码 duidaima.com Console.WriteLine(Description is not null); Description = " World "; Console.WriteLine(Description); Console.WriteLine(Description.Length); } }输出结果如下:
dotnet tool update -g dotnet-execute --prerelease