C# 13前瞻:Extensions

饭宝  金牌会员 | 2024-6-29 09:51:51 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 891|帖子 891|积分 2673

从C#3开始,拓展方法这一特性就得到了广泛的应用。
此功能允许你可以或许使用实例方法的语法调用某个静态方法,以下是一个获取/创建文件的静态方法:
  1. public static async Task<StorageFile> GetOrCreateFileAsync(this StorageFolder folder,string name)
  2. {
  3. var item = await folder.TryGetItemAsync(name) as StorageFile;
  4. item ??= await folder.CreateFileAsync(name);
  5. return item;
  6. }
复制代码
可以采取如下方式调用此方法,但可读性较差:
  1. await Extensions.GetOrCreateFileAsync(folder, "FileName");
复制代码
通过为方法的第一个参数添加this标志,我们还可以如许调用
  1. await folder.GetOrCreateFileAsync("FileName");
复制代码
拓展方法在C#的发展中有着举足轻重的作用,System.Linq就使用了大量拓展方法极大简化了数据查询:
  1. //筛选最高温大于30°C的每日天气数据并按照天气类型分组
  2. var result = forecasts.Where(p => p.MaxTemperature > 30).GroupBy(p => p.WeatherType);
复制代码
而现在,可拓展的内容不再局限于方法
我们可以拓展属性、索引器(有参属性)、静态成员乃至运算符等内容
注意:extensions功能尚未正式进入C#13的预览版,以下示例根据语言提案/Build 2024演示中的相关内容编写,正式版语法可能有所不同
目前的Roslyn实现在feature/roles分支,可以自行编译尝试
示例1:隐式拓展

假定有以下类型
  1. public class DailyWeather
  2. {
  3. public int MaxTemperature { get; set; }
  4. public int MinTemperature { get; set; }
  5. public string WeatherType { get; set; }
  6. public List<HourlyWeather> HourlyForecasts { get; set; }
  7. public class HourlyWeather
  8. {
  9. public int Temperature { get; set; }
  10. public string WeatherType { get; set; }
  11. }
  12. }
复制代码
界说以下隐式拓展(implicit extension)
拓展的语法与类十分相似,它可以访问该类中的任意非private或protected成员,但不能有实例字段
[code]public implicit extension DailyWeatherExtension for DailyWeather{//拓展属性:平均温度public int AverageTemperature => (int)Math.Round(HourlyForecasts.Average(p => p.Temperature));//拓展索引器:获取/修改某小时预告public HourlyWeather this[int index]{get => HourlyForecasts[index];set => HourlyForecasts[index] = value;}//拓展运算符:通过比力最高温大小支持">"/"
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

饭宝

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表