Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >5个鲜为人知的C#/.NET开发秘籍:从时间处理到安全配置的实战技巧

5个鲜为人知的C#/.NET开发秘籍:从时间处理到安全配置的实战技巧

作者头像
郑子铭
发布于 2025-07-09 01:35:11
发布于 2025-07-09 01:35:11
9200
代码可运行
举报
运行总次数:0
代码可运行

欢迎来到新一期的5个C#和.NET开发技巧!抱歉过去两个月断更——上次更新还是在二月份——这段时间确实忙得不可开交,而且撰写这些技术文章总比预期耗时更长。

本期内容包含:避免直接使用DateTime.Now、Entity Framework Core的全局查询过滤器、并发集合、用户密钥管理、Base64Url编码技巧。

每个开发者都有独特的编程风格,这很好。但我们都会掌握一些他人可能不知道的技巧。本文我将分享个人最常用的5个C#/.NET开发秘籍。有些你可能熟悉,有些或许陌生,也可能某些并不适用于你的场景。

这些技巧的呈现方式不会长篇大论,而是通过简明描述和示例代码展示核心思想。如果对任何技巧有疑问,欢迎在评论区留言。若某主题需求旺盛,我会专门为它撰写完整文章。

示例代码基础

本文大部分示例基于以下类定义、枚举和列表:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public classProduct
{
    publicint Id { get; set; }
    publicstring? Title { get; set; }
    publicint Stock { get; set; }
    public Status Status { get; set; }
    publicbool Available { get; set; }
}

publicenum Status
{
    Ordered,
    Delivered,
    Delayed,
    Unknown
}

List<Product> products = 
[
    new() { Id = , Title = "7Up", Status = Status.Ordered, Stock = , Available = true },
    new() { Id = , Title = "Chips", Status = Status.Ordered, Stock = , Available = true },
    // 其他产品数据...
];

技巧1:避免直接使用DateTime.Now

(适用版本:.NET 1+)

这个标题可能有些绝对,但为了简洁我保留了它。大多数开发者会直接用DateTime.Now获取当前时间——这本就是它的设计目的,不是吗?但它存在一些可能引发重大问题的缺陷:

  • • 受服务器时区影响,当不同时区客户端共用数据库时会导致时间数据不可靠
  • • 难以在单元测试中模拟,导致测试结果不稳定

解决方案是使用DateTimeOffset.UtcNow

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var timestamp = DateTime.Now; // 能用但不推荐

// 替代方案
var timestamp = DateTimeOffset.UtcNow; // 更优选择

为了支持单元测试,可以创建返回DateTimeOffset的接口,在需要时注入依赖:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface IDateTimeProvider
{
    DateTimeOffset GetCurrentTime();
}

// 生产环境实现
public class DateTimeProvider : IDateTimeProvider
{
    public DateTimeOffset GetCurrentTime() => DateTimeOffset.UtcNow;
}

// 测试环境可模拟实现

技巧2:EF Core全局查询过滤器

(适用版本:Entity Framework Core)

当需要频繁对某实体应用相同查询条件时(比如99%的场景只需要查询可用商品),EF Core的全局查询过滤器能消除重复代码。以下是不使用过滤器的常规做法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using (var context = new ProductsContext())
{
    var availableProducts = context.Products
        .Where(x => x.Available)
        .ToList();
}

在DbContext的OnModelCreating方法中配置全局过滤器:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Product>()
        .HasQueryFilter(x => x.Available);
}

之后所有查询都会自动应用该条件。如需临时禁用,使用IgnoreQueryFilters()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var allProducts = context.Products
    .IgnoreQueryFilters()
    .ToList();

技巧3:并发集合的使用

(适用版本:.NET Framework 4+)

标准集合类型(如List)非线程安全,多线程操作时需要手动加锁。并发集合(如ConcurrentDictionary)内置线程安全机制:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var concurrentDict = new ConcurrentDictionary<int, Product>();

Parallel.ForEach(products, product =>
{
    concurrentDict.TryAdd(product.Id, product);
});

if (concurrentDict.TryGetValue(, out var foundProduct))
    Console.WriteLine($"找到产品:{foundProduct.Title}");

注意

  • • 在单线程场景可能有轻微性能损耗
  • • ConcurrentBag等类型不保证元素顺序

技巧4:用户密钥管理

(适用版本:Visual Studio 2015, .NET Core 1+)

敏感信息不应存储在appsettings.json中。Visual Studio的"管理用户密钥"功能可将开发环境密钥存储在用户个人目录:

  1. 1. 右键项目 → 选择"管理用户密钥"
  2. 2. 首次使用会生成secrets.json文件(路径:%APPDATA%\microsoft\UserSecrets\<GUID>\
  3. 3. 添加密钥:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "Products": {
    "ConnectionString": "你的连接字符串"
  }
}

通过配置系统读取:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var config = new ConfigurationBuilder()
    .AddUserSecrets<Program>()
    .Build();

Console.WriteLine(config["Products:ConnectionString"]);

生产环境推荐使用Azure Key Vault或AWS Secrets Manager。

技巧5:Base64Url编码助手

(适用版本:.NET 9)

传统Base64编码会产生URL不友好字符(+/=)。.NET 9新增的Base64Url工具类:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var bytes = Encoding.UTF8.GetBytes("Coffee with milk");
var standardBase64 = Convert.ToBase64String(bytes); // 含特殊字符
var urlSafe = Base64Url.EncodeToString(bytes); // URL友好格式

以上就是本期的5个C#/.NET开发技巧。无论这些技巧对你来说是新知还是旧识,希望都能有所启发。如果你有独家技巧想要分享,欢迎在评论区留言——它们可能会出现在下期内容中!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-07-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DotNet NB 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
腾讯前端面试题
JavaScript 使用 Number 类型来表示数字(整数或浮点数),遵循 IEEE 754 标准,通过 64 位来表示一个数字(1 + 11 + 52)
gogo2027
2022/09/09
1.1K0
前端高频面试题(四)(附答案)
JavaScript中的对象是引用类型的数据,当多个实例引用同一个对象时,只要一个实例对这个对象进行操作,其他实例中的数据也会发生变化。而在Vue中,我们更多的是想要复用组件,那就需要每个组件都有自己的数据,这样组件之间才不会相互干扰。所以组件的数据不能写成对象的形式,而是要写成函数的形式。数据以函数返回值的形式定义,这样当我们每次复用组件的时候,就会返回一个新的data,也就是说每个组件都有自己的私有数据空间,它们各自维护自己的数据,不会干扰其他组件的正常运行。
helloworld1024
2022/08/31
6450
2023秋招前端面试必会的面试题_2023-03-15
JSONP 核心原理:script 标签不受同源策略约束,所以可以用来进行跨域请求,优点是兼容性好,但是只能用于 GET 请求;
gogo2027
2023/03/15
1.1K0
有哪些前端面试题是必须要掌握的_2023-02-27
很多网站的资源后面都加了版本号,这样做的目的是:每次升级了 JS 或 CSS 文件后,为了防止浏览器进行缓存,强制改变版本号,客户端浏览器就会重新下载新的 JS 或 CSS 文件 ,以保证用户能够及时获得网站的最新更新。
用户10377405
2023/02/27
6690
京东前端面试题
变量提升的表现是,无论在函数中何处位置声明的变量,好像都被提升到了函数的首部,可以在变量声明前访问到而不会报错。
bb_xiaxia1998
2022/09/09
3560
【原创】前端面试知识体系(一)
我的博客来源:https://1024bibi.com/2018/01/01/%E5%89%8D%E7%AB%AF%E9%9D%A2%E8%AF%95%E7%9F%A5%E8%AF%86%E4%BD%93%E7%B3%BB%EF%BC%88%E4%B8%80%EF%BC%89/
达达前端
2023/10/08
3810
前端常考面试题(必备)_2023-05-19
渐进式网络应用(PWA)是谷歌在2015年底提出的概念。基本上算是web应用程序,但在外观和感觉上与原生app类似。支持PWA的网站可以提供脱机工作、推送通知和设备硬件访问等功能。
用户10357900
2023/05/19
2950
腾讯前端一面面试题总结_2023-02-27
⽤webpack优化前端性能是指优化webpack的输出结果,让打包的最终结果在浏览器运⾏快速⾼效。
var_1024
2023/02/27
1.3K0
20道前端高频面试题(附答案)
垃圾回收:JavaScript代码运行时,需要分配内存空间来储存变量和值。当变量不在参与运行时,就需要系统收回被占用的内存空间,这就是垃圾回收。
loveX001
2022/11/18
4510
2022秋招前端面试题(六)(附答案)
事件流是网页元素接收事件的顺序,"DOM2级事件"规定的事件流包括三个阶段:事件捕获阶段、处于目标阶段、事件冒泡阶段。
helloworld1024
2022/08/08
1.2K0
前端面试如何回答,这些题目或许可以给你一些提示
(3)让函数的 this 指向这个对象,执行构造函数的代码(为这个新对象添加属性)
loveX001
2022/11/15
6840
一年经验如何准备前端面试
NaN 指“不是一个数字”(not a number),NaN 是一个“警戒值”(sentinel value,有特殊用途的常规值),用于指出数字类型中的错误情况,即“执行数学运算没有成功,这是失败后返回的结果”。
loveX001
2022/12/15
4060
2022秋招前端面试题(三)(附答案)
默认情况下, TCP 连接会启⽤延迟传送算法 (Nagle 算法), 在数据发送之前缓存他们. 如果短时间有多个数据发送, 会缓冲到⼀起作⼀次发送 (缓冲⼤⼩⻅ socket.bufferSize ), 这样可以减少 IO 消耗提⾼性能.
helloworld1024
2022/08/07
7810
熬夜整理最近前端面试知识点
层叠上下文是HTML元素的三维概念,这些HTML元素在一条假想的相对于面向(电脑屏幕的)视窗或者网页的用户的z轴上延伸,HTML元素依据其自身属性按照优先级顺序占用层叠上下文的空间。
loveX001
2022/10/13
3620
大厂前端面试考什么?2
JSONP 核心原理:script 标签不受同源策略约束,所以可以用来进行跨域请求,优点是兼容性好,但是只能用于 GET 请求;
loveX001
2023/01/04
6370
来自大厂 10+ 前端面试题附答案(整理版)
在谷歌下css设置字体大小为12px及以下时,显示都是一样大小,都是默认12px。
loveX001
2022/09/22
5100
前端面试中小型公司都考些什么
XSS 攻击指的是跨站脚本攻击,是一种代码注入攻击。攻击者通过在网站注入恶意脚本,使之在用户的浏览器上运行,从而盗取用户的信息如 cookie 等。
loveX001
2022/10/28
8450
京东前端面试题
这里首先定义了两个变量f和g,我们知道变量是可以重新赋值的。后面是一个匿名自执行函数,在 if 条件中调用了函数 g(),由于在匿名函数中,又重新定义了函数g,就覆盖了外部定义的变量g,所以,这里调用的是内部函数 g 方法,返回为 true。第一个条件通过,进入第二个条件。
loveX001
2022/09/07
4420
前端一面常见面试题及答案_2023-02-27
(2)HTTP劫持: (访问⾕歌但是⼀直有贪玩蓝⽉的⼴告),由于http明⽂传输,运营商会修改你的http响应内容(即加⼴告)
用户10377376
2023/02/27
4870
阿里前端常考面试题
Nginx 是一款轻量级的 Web 服务器,也可以用于反向代理、负载平衡和 HTTP 缓存等。Nginx 使用异步事件驱动的方法来处理请求,是一款面向性能设计的 HTTP 服务器。
loveX001
2022/12/16
8050
相关推荐
腾讯前端面试题
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验