揭秘C# 8可空引用类型:如何用!运算符避免Null异常并提升代码健壮性

第一章:C# 8可空引用类型的背景与意义

在 C# 的早期版本中,引用类型默认是“可空的”,但编译器不会对此提供静态检查。这导致了运行时频繁出现 NullReferenceException 异常,成为最常见的程序错误之一。C# 8 引入了**可空引用类型**(Nullable Reference Types)特性,旨在通过编译时静态分析帮助开发者识别潜在的空引用使用问题,从而提升代码健壮性。

解决“十亿美元错误”

托尼·霍尔(Tony Hoare)曾将 null 的发明称为“十亿美元的错误”。在以往的 C# 开发中,字符串、类实例等引用类型变量可以被赋予 null 值,而调用其成员时若未做判空处理,便会引发异常。C# 8 允许开发者显式标注引用类型是否可为空,使编译器能发出警告。 例如,在启用可空上下文后:
// 启用可空引用类型(在 .csproj 中设置)
<Nullable>enable</Nullable>

string name = null;        // 警告:可能为 null
string? optionalName = null; // 合法:显式声明可空
string greeting = "Hello, " + name.ToUpper(); // 编译器警告
上述代码中,string 被视为不可为空,赋 null 值会触发警告;而 string? 明确表示可空引用类型。

项目配置与启用方式

要启用该特性,需在项目文件中添加配置:
  • 全局启用:<Nullable>enable</Nullable>
  • 局部控制:使用 #nullable enable 或 #nullable disable 指令
  • 还原默认行为:#nullable restore
语法含义
string非空引用类型(不可为 null)
string?可空引用类型(允许为 null)
该特性的核心价值在于将原本运行时的风险提前到编译阶段发现,显著减少空引用异常的发生概率,提升大型项目的可维护性与安全性。

第二章:可空引用类型的核心机制解析

2.1 理解可空引用类型的设计初衷与编译器支持

C# 8.0 引入可空引用类型,旨在解决长期存在的“空引用异常”问题。通过静态分析,编译器能在编译期提示潜在的 null 引用风险,提升代码健壮性。
设计动机
在传统 C# 中,引用类型默认可为空,但调用其成员时可能引发 NullReferenceException。可空引用类型通过语法区分:例如 string? 表示可空引用,string 表示非空,从而启用编译器警告。
编译器支持机制
启用可空上下文后,编译器跟踪变量是否可能为 null,并发出警告。例如:
string? nullableName = null;
int length = nullableName.Length; // 编译器警告:可能为 null
上述代码中,nullableName 被声明为可空字符串,访问其 Length 属性时,编译器会提示潜在 null 引用,促使开发者添加判空逻辑。
  • 可空注解上下文由 #nullable enable 启用
  • 编译器通过数据流分析推断 null 状态
  • 开发者可使用 ! 操作符断言非空

2.2 启用可空上下文:项目配置与语法开关

在 C# 8.0 引入可空引用类型后,开发者可通过配置可空上下文来启用更严格的 null 安全检查。默认情况下,该特性处于禁用状态,需手动开启。
项目文件配置
通过修改项目文件(.csproj)中的 <Nullable> 元素,可控制可空上下文的行为:
<PropertyGroup>
  <TargetFramework>net6.0</TargetFramework>
  <Nullable>enable</Nullable>
</PropertyGroup>
上述配置启用了可空注解和警告。enable 值表示全面启用可空上下文,编译器将对引用类型进行静态空值分析。
可选配置值
  • disable:关闭可空上下文,不产生空值警告
  • warnings:仅启用警告,不影响类型系统
  • annotations:仅启用可空注解(如 string?)
  • enable:完全启用,推荐用于新项目

2.3 静态空状态分析:编译时的潜在空引用警告

静态空状态分析是一种在编译阶段检测潜在空引用问题的技术,能够在代码运行前识别出可能导致 `NullPointerException` 的路径。
分析机制原理
编译器通过数据流分析追踪变量的赋值与使用路径,判断其是否可能为 null。例如,在 Java 中启用注解(如 `@Nullable`)可辅助分析:

@Nullable
String getName() { ... }

void printLength(String input) {
    String name = getName();
    System.out.println(name.length()); // 编译器警告:可能空引用
}
上述代码中,`getName()` 被标注为可为空,编译器会标记调用 `name.length()` 存在风险。
主流语言支持对比
语言空安全特性实现方式
Kotlin内置类型系统区分 String? 与 String
Java可选依赖注解与检查工具
C#可配置nullable上下文开启后生效

2.4 引用类型的可空注解语法:T? 与 T 的语义差异

在现代静态类型语言中,如 Kotlin 或 Swift,`T?` 与 `T` 的差异体现了类型系统对空安全的严格控制。`T` 表示一个非空引用类型,编译器保证其始终持有有效对象;而 `T?` 是 `T` 的可空变体,允许值为 `null`。
语法对比示例

val nonNull: String = null // 编译错误
val nullable: String? = null // 合法
上述代码中,`String` 类型变量不可接受 `null`,而 `String?` 显式声明可空性,通过 `?` 注解扩展类型定义。
类型操作约束
  • 对 `T?` 类型直接调用方法会触发编译警告或错误
  • 必须通过安全调用操作符(如 `?.`)或非空断言(`!!`)处理潜在空值
该机制推动开发者显式处理空值逻辑,显著降低运行时空指针异常风险。

2.5 编译器警告分类与严重性控制策略

编译器警告是代码质量的重要反馈机制,合理分类与控制其严重性有助于提升开发效率与代码健壮性。
常见警告类型
  • 语法兼容性警告:如使用废弃API
  • 潜在逻辑错误:未初始化变量、空指针解引用
  • 类型不匹配:隐式转换可能导致精度丢失
严重性分级策略
通过编译器标志可精细化控制警告处理行为。以GCC为例:

// 启用常用警告并将其视为错误
gcc -Wall -Wextra -Werror -Wno-unused-parameter source.c
该命令中,-Wall启用主流警告,-Werror将所有警告升级为错误,而-Wno-unused-parameter则选择性屏蔽特定警告,实现灵活管控。
项目级配置建议
级别推荐标志适用场景
开发-Wall -Wextra快速发现问题
发布-Wall -Werror确保构建纯净

第三章:! 运算符的原理与应用场景

3.1 ! 运算符的本质:取消空警告的强制断言

在 TypeScript 中,`!` 运算符被称为“非空断言操作符”,用于显式告诉编译器某个值**肯定不为 null 或 undefined**。
语法与作用
该操作符常用于类型检查严格场景下,开发者明确知道变量已被初始化但编译器无法推断时:

let el: HTMLElement | null = document.getElementById('app');
console.log(el!.innerHTML); // 强制断言 el 不为 null
上述代码中,`getElementById` 返回可能为 `null`,但开发者确认元素存在,使用 `!` 避免类型错误。
风险与注意事项
  • 滥用 `!` 可能掩盖潜在的运行时错误
  • 应优先使用条件判断或可选链(?.)进行安全访问
  • 仅在确保值存在的上下文中使用
正确使用 `!` 能提升类型系统灵活性,但也要求开发者承担更多责任。

3.2 在真实代码中安全使用!运算符的边界条件

在TypeScript开发中,非空断言运算符`!`能有效消除编译器对null/undefined的警告,但需谨慎处理边界条件。
常见误用场景
当访问可能未初始化的DOM元素时,错误地使用`!`会导致运行时异常:
// 危险写法
const el = document.getElementById('app')!;
el.innerHTML = 'Hello'; // 若元素不存在则崩溃
该代码假设元素必然存在,缺乏容错机制。
安全实践建议
  • 优先使用可选链(?.)和空值合并(??)替代强制断言
  • 仅在明确保证变量已初始化时使用!
  • 结合类型守卫进行前置判断
// 推荐写法
const el = document.getElementById('app');
if (el) {
  el.innerHTML = 'Hello'; // 安全访问
}
通过显式检查确保运行时安全,避免依赖非空断言。

3.3 ! 运算符与异步编程、LINQ查询的协同处理

在现代C#开发中,`!`(非空断言)运算符与异步编程、LINQ查询结合使用时,可显著提升类型安全与代码简洁性。
异步方法中的非空断言
当异步操作返回可能为空的对象时,开发者可通过 `!` 明确告知编译器该值不为空,避免警告:
public async Task ProcessUserAsync()
{
    var user = await GetUserByIdAsync(123)!;
    Console.WriteLine(user.Name); // 编译器信任user非空
}
此处 `!` 告知编译器 `GetUserByIdAsync` 返回结果在当前上下文中确定非空,消除了潜在的 null 警告。
LINQ查询中的类型推断优化
在LINQ查询中,结合 `!` 可强化类型推断:
var names = users.Where(u => u!.Age > 18).Select(u => u.Name);
即使 `users` 包含可空引用类型,`u!` 确保后续访问安全,同时保持查询表达式的流畅性。

第四章:规避Null异常的工程实践

4.1 在数据访问层中结合!运算符优化实体映射逻辑

在现代ORM框架中,实体映射常面临空值处理的复杂性。通过引入非空断言运算符`!`,可显著提升类型安全与代码简洁性。
非空断言的合理使用场景
当数据访问层能确保底层查询返回非空结果时,使用`!`可避免冗余的空值检查,提升性能。
public User GetUserById(int id)
{
    var entity = context.Users.Find(id)!;
    return new User 
    { 
        Id = entity.Id, 
        Name = entity.Name! 
    };
}
上述代码中,`Find(id)!`表明该ID必然存在,跳过null判断;`Name!`表示数据库约束保证此字段非空,编译器据此消除警告并优化类型推导。
映射效率对比
方式空值检查性能开销
传统判空显式if判断中等
!运算符编译期断言低

4.2 使用!运算符处理第三方库或遗留API的空性盲区

在集成第三方库或调用遗留API时,TypeScript往往无法准确推断返回值的可空性。此时,开发者可通过非空断言运算符 `!` 显式声明值不为 null 或 undefined。
典型使用场景
当确定DOM元素必然存在时,可安全使用 `!`:
const canvas = document.getElementById('game-canvas')!;
const context = canvas.getContext('2d');
上述代码中,`!` 告知编译器 `getElementById` 的返回值非空,避免类型检查错误。
风险与权衡
  • 滥用 `!` 可能掩盖真实运行时错误
  • 建议配合注释说明断言依据
  • 优先使用类型守卫或条件判断
应在充分验证上下文安全的前提下使用该操作符,以平衡类型安全与开发效率。

4.3 单元测试中验证!运算符使用的合理性与风险点

在单元测试中,`!` 运算符常用于断言条件的否定逻辑。然而,不当使用可能导致测试语义模糊或掩盖潜在缺陷。
常见误用场景
  • !null 判断替代空值检查,忽略未初始化对象
  • 对复杂表达式取反,降低可读性
  • 在异步测试中过早断言,导致误报
代码示例与分析
func TestUserValidation(t *testing.T) {
    user := NewUser("")
    if !user.IsValid() { // 明确语义:验证失败预期
        t.Log("Passed: empty user is invalid")
    } else {
        t.Error("Expected invalid, got valid")
    }
}
上述代码中,`!user.IsValid()` 清晰表达了“期望验证失败”的意图,配合合理注释提升可维护性。关键在于确保被取反的操作本身具有明确布尔语义,避免嵌套否定。
风险规避建议
风险点应对策略
逻辑反转错误使用表意函数如 assert.False()
可读性差拆分复杂条件,命名解释意图

4.4 团队协作中对!运算符的代码审查规范建议

在TypeScript项目中,非空断言运算符(`!`)虽能简化类型推导,但滥用将削弱类型安全。团队应建立统一审查标准,降低维护成本。
代码审查检查清单
  • 确认使用 `!` 前已进行显式空值检查
  • 禁止在公共API参数中使用 `!`
  • 要求添加注释说明为何值必然非空
推荐写法示例

function processUser(user?: User) {
  // 显式判断后访问属性
  if (!user) throw new Error("User required");
  console.log(user.name); // 安全解包
}
该写法通过条件判断确保类型守卫,避免依赖 `!` 运算符,提升代码可读性与安全性。

第五章:总结与未来展望

云原生架构的持续演进
现代企业正加速向云原生转型,Kubernetes 已成为容器编排的事实标准。以下是一个典型的生产级 Deployment 配置示例,包含资源限制与健康检查:
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-service
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - name: web
        image: nginx:1.25
        resources:
          requests:
            memory: "128Mi"
            cpu: "250m"
          limits:
            memory: "256Mi"
            cpu: "500m"
        livenessProbe:
          httpGet:
            path: /health
            port: 80
          initialDelaySeconds: 30
          periodSeconds: 10
可观测性体系构建
完整的可观测性需涵盖日志、指标与链路追踪。下表列出常用开源工具组合:
类别工具用途
日志收集Fluent Bit轻量级日志采集,支持 Kubernetes 环境
指标监控Prometheus多维度时间序列数据抓取与告警
链路追踪Jaeger分布式请求跟踪,定位性能瓶颈
服务网格的落地挑战
在实际部署 Istio 时,常因 mTLS 配置不当导致服务间调用失败。建议采用渐进式启用策略,先将命名空间标记为 `istio-injection=disabled`,再通过 PeerAuthentication 和 DestinationRule 控制流量安全策略。同时,使用 Kiali 可视化服务拓扑,快速识别调用异常节点。某金融客户通过该方式,在两周内完成核心交易链路的灰度接入,未引发任何线上故障。
YOLOv8作物病害检测实战源码 这是一套基于YOLOv8n的农田病虫害目标检测系统,对叶片照片做目标检测,识别健康叶片、褐斑病、白粉病、锈病四类,并给出对应防治建议。全流程纯CPU可跑,配套交付完整Python源码、9章实战教程(md/html/pdf三种格式)、100张自造样本及YOLO标签、训练曲线与混淆矩阵截图、Tkinter界面和答辩PPT。 系统围绕五项功能展开:同一套推理逻辑覆盖图像、视频、摄像头三种来源;图形界面选文件即检测,画面叠彩色框标注病名与置信度,右侧面板同步给出症状与防治措施;检测记录自动写入CSV,统计页一键生成四类病害占比饼图;训练结束自动产出损失与精度曲线;内置防治建议文案库,检测命中即回填面板。 选型用YOLOv8n nano档,参数量约320万、权重约6.2MB,CPU单帧几十毫秒,小样本训练5到8分钟完成。数据由data_gen.py程序化绘制100张叶片图,固定随机种子,重跑分布一致,不依赖公开数据集。依赖全部锁版本,教程第7章整理了19条真实报错及排查方法,第8章给出换模型档、换PlantVillage数据集的迁移路径。 适合做计算机视觉方向课程设计或毕业设计的学生,也适合智慧农业方向想了解检测模型如何落进业务面板的学习者。不需要GPU,不需要系统学过目标检测,教程第3章会按需补齐原理。 使用时先pip install -r requirements.txt装好依赖,download_data.py下载预训练权重,data_gen.py生成样本后train.py训练,完成后用main.py infer批量检测或main.py gui启动界面。 立即下载

相关推荐

数据挖掘实战:决策树 + 聚类 + 关联规则,零 Key 离线可跑(Python 源码)

数据挖掘实战包。用 Python 标准库实现 CART 风格决策树、K-Means 聚类与 Apriori 关联规则,在虚构「星河便利店」会员表和购物篮上跑通分类、分群与购物篮分析,并给出准确率、轮廓系数、支持度/置信度/提升度。零第三方依赖、零 API Key 即可离线跑通。含 4 个样例、离线冒烟、中文 README(含「使用方法」)。均为作者原创可运行源码。MIT。作者 blog.youkuaiyun.com/mtl1994

[学习笔记]解决因C#8.0的语言特性导致EFCore实体类型映射的错误

今天下午在排查一个EF问题时,遇到了个很隐蔽的坑,特此记录。

jevonsflash的专栏 892

产业园区如何高效对接企业技术需求与高校科研成果?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

VS .Net8 去掉空值警告

在.NET 8中,如果你遇到了频繁的空引用异常(NullReferenceException)警告,这可能是因为启用了代码分析器(Code Analyzer),特别是与可空引用类型(Nullable Reference Types)相关的规则。这些规则旨在帮助开发者避免空引用异常,提高代码的健壮性。可空引用类型是C# 8.0引入的一项特性,它允许开发者明确地声明一个引用类型变量是否可以为null。

fkdw27的博客 1502

国央企创新负责人如何快速掌握本地科技资源分布与匹配情况?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

国央企创新负责人如何实现科技成果的精准识别与高效筛选?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

C# 项目的 nullable 检查

.Net6 生成的项目, 默认会启用 nullable 检查, 这样会大大避免 NullReferenceException异常, csproj 文件设置, <PropertyGroup> <TargetFramework>net6.0</TargetFramework> <Nullable>enable</Nul...

诸葛建站 2044

高校技术转移办公室人员如何系统化管理科技成果信息?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

.NET webapi 在<Nullable>enable<Nullable>启用的情况下如何不验证不带?的属性

目前.net 6 实验成功。

lds993的博客 359

Cisco Packet Tracer 7.3免登录技巧:3种方法快速跳过注册界面(附详细截图)

本文针对Cisco Packet Tracer 7.3启动时遇到的登录界面问题,提供了三种合法高效的解决方案。详细介绍了如何利用官方访客模式快速启动、注册思科账号实现一劳永逸登录,以及通过调整本地安装配置优化启动流程,帮助网络学习者与备考者绕过繁琐步骤,快速进入实验环境。

weixin_29305337的博客 739

LEC/FORMAL --- PARTIII debug

lec(logic equivalence checking)又叫formal check,是对ic design的综合,PR前后的设计进行逻辑对比检查的工具/手段,保证综合不改变rtl原始的logic function。目前用的较多的就是C家的formal工具。接下来介绍一下lec过程中遇到的问题以及debug手段。...

sinat_27691203的博客 7709

C# 8可空引用类型揭秘:如何用!运算符精准消除编译警告

掌握C# 8可空引用类型核心技巧,精准应对编译器警告。通过!运算符在确信不为空的场景下消除冗余检查,提升代码清晰度与性能。适用于类型转换、异步加载等常见情境,兼顾安全与效率。C# 8 可空引用!运算符实用指南,值得收藏。

ByteShoal的博客 297

【全解析 | PTA】浙大版《Python 程序设计》题目集-第一章

Python浙大版PTA题解

wzhh_的博客 5527

为什么你的C#代码仍崩溃于Null?C# 8!运算符正确使用姿势全揭秘

掌握C# 8可空引用!运算符,有效避免空引用异常。详解其在方法参数、属性和集合中的应用,揭示编译时检查与强制非空断言的核心技巧。提升代码健壮性,减少运行时崩溃,值得收藏。

ProceShoal的博客 416

RTKLIB中RTK定位原理(一)

1 模型 1.1 非差观测值 非差观测值与RTKLIB中PPP定位原理——观测模型部分中一致。 1.2 单间单差观测值 若两个接收机距离较近,经过站间单差,电离层对流层延迟可消除,卫星s的钟差以及初始相位被消除,中依然包含接收机初始相位。 1.3 站间星间双差观测值 经过站间星间双差,接收机钟差及初始相位被消除。 2 EKF参数估计 2.1 EKF法则 EKF法则与RTKLIB中PPP定位原理——观测模型部分中一致。 2.2 状态变量与时间更新 (1)状态变量 在RTK...

papunzal的博客 3817

从零开始!在 Windows 上安装与配置 Dify

这篇博客将详细介绍如何在 Windows 系统上部署 Dify,适合零基础用户。从 Docker 和 WSL 的安装配置开始,逐步指导用户设置 Git、Docker 环境以及 Dify 配置文件,解决可能遇到的端口冲突等问题,最终完成 Dify 的启动和测试。通过简明易懂的步骤,帮助用户在本地成功运行 Dify,实现模型供应商配置,让 Dify 项目在 Windows 平台上顺利上线。

qq_49035156的博客 5万+

揭秘PHP可为空类型:如何用?type避免致命错误并提升代码健壮性

掌握PHP 7.1 可为空类型(?type)用法,有效避免空值引发的致命错误。适用于函数参数、返回值声明,提升代码健壮性与可读性。通过类型提示明确支持null,减少运行时异常。实用技巧值得收藏。

ProcePerch的博客 613

【AGC】【serverless】【云函数】云函数常见问题

1、云函数添加了AUTH触发器后,在用户执行注册、销户、登录、登出动作时,云函数的event对象会自动触发返回相应信息。比如我在“层”的压缩包里放了config/config.txt,那么我在云函数里怎么调用这个文件?层的目录是:/dcache/layer,函数的目录是/dcache/layer/func。在云函数里往云数据库里插入数据返回的是180000,这是正常吗?已经按照文档在后台对应的云函数里配置了,所需的AUTH触发器。层的用法和放在函数里的用法是相同的。云函数里的层如何调用?

华为开发者联盟 839

揭秘C# 6中的?.运算符:如何避免NullReferenceException并提升代码健壮性

掌握C# 6空传播运算符(?.)有效避免NullReferenceException,提升代码健壮性。适用于对象链式调用,简化判空逻辑,减少冗余代码。轻松应对成员访问与方法调用中的null风险,让程序更安全高效,值得收藏。

ProcePerch的博客 268

Mac用户必看:PD虚拟机网络初始化失败的3分钟修复指南(附详细截图)

本文针对Mac用户在Parallels Desktop(PD虚拟机)启动时遇到的“网络初始化失败”问题,提供了快速诊断与修复指南。核心原因是macOS系统更新后权限未正确授予。文章通过详细的三步修复法(关闭进程、修改配置文件、重新授权重启),帮助用户在3分钟内恢复虚拟机网络连接,并附有排查清单与预防建议。

weixin_29231027的博客 538

Java 部分笔试题解析

合法的 try 语句块必须包含 try 块,并且至少包含一个 catch 块或一个 finally 块。给定一个长度为n的数组,数组中的每个元素,表示一根水管的长度,水管可以在任意位置锯开。调用 sleep() 方法、创建新线程、高优先级线程进入就绪状态只会暂停或抢占线程的执行,而不会终止线程的运行。A.抽象类中可以包含非抽象的普通方法,接口中的方法必须是抽象的,不能有非抽象的普通方法。接口中的成员变量必须是常量(static final),而抽象类可以有普通成员变量。

博客 2579

揭秘C# 6空条件运算符:如何优雅实现链式调用避免Null异常

轻松避免Null异常,掌握C# 6空传播的链式调用技巧。适用于对象层级调用场景,通过?.运算符安全访问成员,简化判空逻辑,提升代码可读性与健壮性。高效开发必备,值得收藏。

PixelGlow的博客 634

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

为什么顶尖C#工程师都在用?.运算符?揭秘空值处理的现代编程范式

掌握C# 6 空传播运算符(?.)轻松避免空引用异常,提升代码健壮性。适用于链式属性访问、集合操作等场景,简化判空逻辑,减少冗余if语句。关键优势在于安全高效,大幅提高开发效率。值得收藏。

PixelStream的博客 1021

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

为什么顶尖团队都在用C# 6空传播?揭秘高可维护代码的秘密

掌握C# 6空传播链式调用,轻松避免空引用异常,提升代码健壮性。适用于对象深度访问、API响应处理等场景,简化判空逻辑,使代码更简洁易读。这一特性被顶尖团队广泛采用,显著增强可维护性,值得收藏并点击了解实际应用技巧。

FastSolve的博客 442

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

VS中.net项目多版本常用配置

本身不带Form的.Net项目及带Form的.Net项目配置略有不同,涉及WPF时,使用True,特性重复时添加: false

祝紫山(大可山人)博客[GDI+,WPF, .Net图形图像] 4599

【译】尝试使用Nullable Reference Types

随着.NET Core 3.0 Preview 7的发布,C#8.0已被认为是“功能完整”的。这意味着它们的最大亮点Nullable Reference Types,在行为方面也被锁定在.NET Core版本中。它将在C#8.0之后继续改进,但现在可以认为它与C#8.0的其余部分一样是稳定的。 目前,我们的目标是尽可能多地收集关于可空性使用过程中的反馈以发现问题,同时收集有关在.NET...

FK2015139136的博客 800
上一篇: 你真的懂MapControllerRoute和MapRazorPages的优先级吗?,一次讲透ASP.NET Core 8路由排序逻辑
下一篇: 【.NET高级特性必知】:扩展方法调用优先级的3大陷阱及规避策略
fastdebug
博客等级 码龄11年 149粉丝 2006原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值