C# 小知识

简介: const与readonlyreadonly为运行时常量,const为编译时常量。编译时常量比运行时常量快,性能好,但是缺乏灵活性(编译时常量需要重新编译应用程序)。

const与readonly

readonly为运行时常量,const为编译时常量。

编译时常量比运行时常量快,性能好,但是缺乏灵活性(编译时常量需要重新编译应用程序)。

编译时常量(const)仅限于数值和字符串(基元类型),C#不允许使用new来初始化一个编译时常量

const修饰的常量默认是静态的(类型)。

readonly修饰的字段可以在构造函数中被修改。

使用const较之使用readonly的唯一好处就是性能。

partial关键字

此关键字允许将类、结构或接口的定义拆分到多个文件中。

如果类的定义,其内容很多,那么分别放在不同的文件中就是一个不错的选择。

在File1.cs中

1
2
3
4
5
6
7
8
9
namespace Aiqier
{
     partial class A
     {
         int num = 0;
         void MethodA() {}
         partial  void MethodC();
     }
}

在File2.cs中

1
2
3
4
5
6
7
8
namespace Aiqier
{
     partial class A
     {
         void MethodB() {}
         partial  void MethodC() {}
     }
}

sealed关键字

当对一个类应用 sealed 修饰符时,此修饰符会阻止其他类从该类继承。类似于Java中final关键字。

new和override

Override关键字主要是提供派生类对基类方法的新实现,重写的基类方法必须和Override的方法具有相同的签名。

New关键字主要用来区别派生类和基类同名方法的选择问题,通过隐藏基类方法,达到使编译器调用正确的方法的目的。

也就是说New 关键字在作为修饰符用于向基类成员隐藏继承成员时,对于派生类该关键字指示方法是重写的新方法,但是关闭了多态性。具体调用的方法为声明时变量的方法。

C#中using语句怎么用?

说道using的话,首先要说的就是.Net中的两种资源,也就是托管资源和非托管资源。

托管资源:由CLR管理分配和释放的资源,即从CLR里new出来的对象。

非托管资源:不受CLR管理的对象,如Windows内核对象,文件,数据库连接,套接字,COM对象。

这里要注意,假如说你的类型需要显式释放资源,那么一定要继承IDispose接口。

而这个IDispose接口就是为using语法糖提供便利,那种在finall处调用Dispose函数的try-catch-finally语句块,其实和using语句生成的IL代码基本上完全一致。

c#类型转换

值类型

值类型的类型转换,可以理解为用一个类型A的值去初始化一个类型B的变量。

变宽转换

如果是变宽转换,那么不会有问题。比如32位的int到64位的int,或者是int到float。

变窄转换

如果是变窄转换,那么就可能有问题。(可能会发生溢出)

首先,变窄转换是需要强制类型转换的,不能像隐式转换那样,需要在括号中写入要转换的类型。

1
2
double foo = 3.5;
float bar = ( float )foo;

溢出

比如short可以存储0~32767的数字,而byte可以存储的最大值是255,那么你将一个为7的short转换为byte类型,那么不会有什么问题。但是如果你将一个大于255的short强制类型转换为byte,那就会有问题。

1
2
3
4
5
byte destinationVar;
short sourceVar = 281;
destinationVar = ( byte )sourceVar;
// sourceVar val: 281
/ destinationVar: 25

原因是这样的(源数据的最左边一位丢失了):

1
2
3
281 = 100011001
25  = 000011001
255 = 011111111

这个数值的例子摘自《c#经典入门》

可以使用checked和unchecked关键字检验溢出。

1
2
checked(<expression>)
unchecked(<expression>)

默认就是unchecked的,不写这个关键字也行。如果是checked,而且发生了溢出,就会抛出异常。

引用类型

引用类型的转换与值类型“看上去有点相反”。

首先要明确的是引用类型转换的是栈中的变量,而该变量指向的位于堆中的对象不受影响。

向上转换

将父类的引用指向子类对象是没什么问题的(多态的本质)

向下转换

与值类型的转换类似,引用类型的向下转换也会用到强制类型转换。

而这种转换并不总是有效(即便是基类到派生类的转换),转换是否成功,只有在运行的时候才会知道。

1
Child child = (Child)father;

最常见的用法是传递object对象,然后在将这个得到的对象转化为要处理的类型,(非泛型集合,发送消息机制)

as运算符

强制类型转换出现错误会抛出异常,使用asis会更加优雅。

as运算符用于在两个引用类型之间转换,转换失败后会返回一个null,并不会抛出异常。

1
2
3
4
5
6
7
ClassA a =  new ClassA();
ClassB b = a  as ClassB;
 
if (b !=  null )
{
     ......
}

无论是as还是is运算符,都比直接使用强制类型转换要安全,而且不需要使用异常检查,只需要判断结果是否为空就可以了。

类型无关的类型转换

之前提到的引用类型转换,是指相关类型之间的转换,比如继承关系,共享接口。

不相关的两个类型,也可以发生类型转换,这就要使用到重载运算符,你需要自己定义内部转换的原理。

需要使用到的重载运算符有: implicit(隐式类型转换) explicit(显示类型转换)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 定义ConvClassA到ConvClassB的隐式转换
public class ConvClassA
{
      public static implicit operator ConvClassB(ConvClassA op)
       {
          ......
       }
  }
   
  // 定义ConvClassB到ConvClassA的显式转换
  public class ConvClassB
  {
      public static explicit operator ConvClassA(ConvClassB op)
      {
          ......
      }
  }
相关文章
|
8天前
|
人工智能 自然语言处理 API
深入浅出LangChain与智能Agent:构建下一代AI助手
LangChain为大型语言模型提供了一种全新的搭建和集成方式,通过这个强大的框架,我们可以将复杂的技术任务简化,让创意和创新更加易于实现。本文从LangChain是什么到LangChain的实际案例到智能体的快速发展做了全面的讲解。
279547 52
深入浅出LangChain与智能Agent:构建下一代AI助手
|
9天前
|
设计模式 人工智能 JSON
一文掌握大模型提示词技巧:从战略到战术
本文将用通俗易懂的语言,带你从战略(宏观)和战术(微观)两个层次掌握大模型提示词的常见技巧,真正做到理论和实践相结合,占领 AI 运用的先机。
237786 4
|
9天前
|
NoSQL Cloud Native Redis
Redis核心开发者的新征程:阿里云与Valkey社区的技术融合与创新
阿里云瑶池数据库团队后续将持续参与Valkey社区,如过往在Redis社区一样耕耘,为开源社区作出持续贡献。
Redis核心开发者的新征程:阿里云与Valkey社区的技术融合与创新
|
9天前
|
关系型数据库 分布式数据库 数据库
PolarDB闪电助攻,《香肠派对》百亿好友关系实现毫秒级查询
PolarDB分布式版助力《香肠派对》实现百亿好友关系20万QPS的毫秒级查询。
PolarDB闪电助攻,《香肠派对》百亿好友关系实现毫秒级查询
|
3天前
|
机器人 Linux API
基于Ollama+AnythingLLM轻松打造本地大模型知识库
Ollama是开源工具,简化了在本地运行大型语言模型(ile优化模型运行,支持GPU使用和热加载。它轻量、易用,可在Mac和Linux上通过Docker快速部署。AnythingLLM是Mintplex Labs的文档聊天机器人,支持多用户、多种文档格式,提供对话和查询模式,内置向量数据库,可高效管理大模型和文档。它也是开源的,能与Ollama结合使用,提供安全、低成本的LLM体验。这两款工具旨在促进本地高效利用和管理LLMs。
92894 19
|
10天前
|
消息中间件 Cloud Native Serverless
RocketMQ 事件驱动:云时代的事件驱动有啥不同?
本文深入探讨了云时代 EDA 的新内涵及它在云时代再次流行的主要驱动力,包括技术驱动力和商业驱动力,随后重点介绍了 RocketMQ 5.0 推出的子产品 EventBridge,并通过几个云时代事件驱动的典型案例,进一步叙述了云时代事件驱动的常见场景和最佳实践。
246779 2
|
7天前
|
物联网 PyTorch 测试技术
手把手教你捏一个自己的Agent
Modelscope AgentFabric是一个基于ModelScope-Agent的交互式智能体应用,用于方便地创建针对各种现实应用量身定制智能体,目前已经在生产级别落地。
|
11天前
|
弹性计算 安全 API
访问控制(RAM)|云上安全使用AccessKey的最佳实践
集中管控AK/SK的生命周期,可以极大降低AK/SK管理和使用成本,同时通过加密和轮转的方式,保证AK/SK的安全使用,本次分享为您介绍产品原理,以及具体的使用步骤。
101886 3
|
10天前
|
自然语言处理 Cloud Native Serverless
通义灵码牵手阿里云函数计算 FC ,打造智能编码新体验
近日,通义灵码正式进驻函数计算 FC WebIDE,让使用函数计算产品的开发者在其熟悉的云端集成开发环境中,无需再次登录即可使用通义灵码的智能编程能力,实现开发效率与代码质量的双重提升。
95467 4
|
2天前
|
人工智能 自然语言处理 API
Claude3是什么?
Claude 3最近备受各大媒体瞩目,成为了AI领域备受关注的新宠。在ChatGPT推出更高版本之前,Claude 3已经被公认为是语言类AI工具中的佼佼者,特别在处理逻辑性和长篇上下文方面表现突出。然而,与此同时,Claude 3的注册流程也备受诟病,被认为是所有AI工具中最为复杂的之一。 这篇内容教大家 注册Claude 3 以及升级 教程。
13684 1
Claude3是什么?