C# – 冷知识 (新手)

替 Action/Func Parameter 设置名字

public static void MatchBracket(string value, string bracket, Action<int, int, string> action) { 
    
}

Action/Func 的 parameter 是不可以设置名字的, 只能声明类型, 对调用的人不友好.

Can you name the parameters in a Func<T> type?

有 2 个方法可以让它好一些.

1. 用 delegate 声明

public delegate void Action(int start, int end, string valueInBracket);
public static void MatchBracket(string value, string bracket, Action action)
{

}

虽然在调用的时候依然无法智能提示, 但至少有个地方可以找到.

2. 用 Tuple

public static void MatchBracket1(string value, string bracket, Action<(int Start, int End, string ValueInBracket)> action)
{

}

调用时可以看到提示

缺点就是结构换了. 可能不习惯.

使用的时候要解构 (而且不能直接在 parameter 里解, 要拿出来才能解), 或者干脆把它当对象用会更好一些.

MatchBracket1(value, "{}", matchInfo =>
{
    var (start, end, valueInBracket) = matchInfo;
});

 它也不支持写 params 

 

隐式类型转换

有一个 class Person

public class Person
{

}

我们尝试拿一个 int 强转到 Person 

它会直接报错。

加上隐式类型转换操作符

public class Person
{
  public static implicit operator Person(int number)
  {
    return new Person();
  }
}

这样就不会再报错

逻辑很简单,当强转的时候,操作符方法会被调用,参数是 55,然后返回一个 Person 实例。

日常例子

复制代码
[ApiController]
[Route("api")]
public class PersonController(
  ApplicationDbContext db
) : ControllerBase
{
  [ODataAttributeRouting]
  [EnableQuery]
  [HttpGet("people")]
  [Produces(MediaTypeNames.Application.Json)]
  [ProducesResponseType(StatusCodes.Status200OK)]
  public ActionResult<IQueryable<Person>> GetPeople()
  {
    return db.People;
  }
}
复制代码

GetPeople 方法要求返回 ActionResult 实例,但是代码最终返回的是 IQueryable,结果没有报错。

原因就是 ActionResult 内部实现了隐式类型转换操作符

 

posted @   兴杰  阅读(87)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· 【全网最全教程】使用最强DeepSeekR1+联网的火山引擎,没有生成长度限制,DeepSeek本体
历史上的今天:
2018-01-03 Angular 学习笔记 ( PWA + App Shell )
点击右上角即可分享
微信分享提示