展开

关键词

C#7.3 新增功能

C# 7.3 版本有两个主要主题。 第一个主题提供使安全代码性能与不安全代码性能一样好功能。 第二个主题提供现有功能增量改进。 此外,在此版本中添加了新编译器选项。 01 启用更高效安全代码 你应能够安全地编写性能与不安全代码一样好 C# 代码。 安全代码可避免错误类,例如缓冲区溢出、杂散指针和其他内存访问错误。 这些新功能扩展了可验证安全代码功能。 02 提升了现有功能 以下功能提供了语言中功能改进。 这些功能提升了在编写 C#效率。 2.1 元组支持 == 和 != C# 元组类型现在支持 == 和 !=。 此版本添加了三个新规则,以帮助编译器选取明显选择: 当方法组同时包含实例和静态成员时,如果方法在不含实例接收器或上下文情况下被调用,则编译器将丢弃实例成员。 你将注意到此更改,因为当你确定哪个方法更好时,你将发现多义方法重载具有更少编译器错误。 03 新编译器选项 新编译器选项支持 C# 程序新版本和 DevOps 方案。

25910

【《Effective C#》提炼总结】提高Unity中C#代码质量21条准则

这个差别就带来了如下规则: ● 编译时常量(const)仅能用于数值和字符串。 ● 运行时常量(readonly)可以为任意类型。 综上,在编译器必须得到确定数值时,一定要使用const。例如特性(attribute)参数和枚举定义,还有那些在各个版本发布之间不会变化值。 C#提供了4种不同函数来判断两个对象是否“相等”。 这里有一些规则,可以帮你尽量降低GC工作量: 1)若某个引用类型(值类型无所谓)局部变量用于被频繁调用例程中,那么应该将其提升为成员变量。 2)为常用类型实例提供静态对象。 原则12 区分值类型和引用类型 ● C#中,class对应引用类型,struct对应值类型。 ● C#不是C++,不能将所有类型定义成值类型并在需要时其创建引用。

33730
  • 广告
    关闭

    90+款云产品免费体验

    提供包括云服务器,云数据库在内的90+款云计算产品。打造一站式的云产品试用服务,助力开发者和企业零门槛上云。

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    C#7.0 新增功能

    C# 7.0 引入了元组语言支持,可利用更有效新元组类型向元组字段赋予语义名称。 每个表达式都允许检查对象及其属性以确定该对象是否满足所寻求模式。 使用 when 关键字来指定模式其他规则。 is 模式表达式扩展了常用 is 运算符以查询关于其类型对象,并在一条指令分配结果。 调用方控制是否复制返回值。 在分配返回值时省略 ref 修饰符表示调用方需要该值副本,而不是存储引用。 不可向 ref 本地变量赋予标准方法返回值。 编译器无法知道异步方法返回时,引用变量是否已设置为其最终值。 添加 ref 局部变量和 ref 返回结果可通过避免复制值或多次执行取消引用操作,允许更为高效算法。 在创建位掩码时,或每当数字二进制表示形式使代码最具可读性时,以二进制形式写入该数字: public const int Sixteen = 0b0001_0000; public const int

    18010

    CA1047:不要在密封类型中声明受保护成员

    规则 ID CA1047 类别 设计 修复是中断修复还是非中断修复 非中断 原因 公共类型是 sealed(在 Visual basic 中为 NotInheritable),并声明了一个受保护成员或受保护嵌套类型规则不报告 Finalize 方法冲突,这些方法必须遵循此模式。 规则说明 类型声明受保护成员使继承类型可以访问或重写该成员。 按照定义,不能从密封类型继承,这表示不能调用密封类型受保护方法。 对于此错误C# 编译器会发出警告。 如何解决冲突 若要解决此规则冲突,请将成员访问级别更改为专用,或使类型可继承。 何时禁止显示警告 不禁止显示此规则发出警告。 使类型保持当前状态可能会导致维护问题,而且不会带来任何好处。 配置代码以进行分析 使用下面的选项来配置代码库哪些部分要运行此规则。 例如,若要指定规则应仅针对非公共 API 图面运行,请将以下键值添加到项目中 .editorconfig 文件: dotnet_code_quality.CAXXXX.api_surface = private

    9130

    解析C#类中构造函数

    《解析C#类中构造函数》 一.  C#构造函数概述: C#中类包含数据成员和函数成员。函数成员提供了操作类中数据某些功能,包括方法、属性、构造器和终结器、运算符和索引器。 (2).希望类仅通过调用某个静态成员函数来实例化(对象实例化工厂方法)   4.基类构造函数使用:   编译器在调用基类构造器前,会初始化任何使用了简化语法字段,以维持源代码给人留下 为了使代码“可验证”,类实例构造器在访问从基类集成任何字段之前,必须先调用基类构造器。如果派生类构造器没有显示调用一个基类构造器,C#编译器会自动生成对默认基类构造器调用。 2.    类型构造器调用: JIT编译器必须决定是否生成代码来调用它,而CLR必须确保调用是线程安全。 2.     JIT编译器在生成一个类型构造器调用,这个调用添加位置情况: (1).JIT编译器可以刚好在创建类型第一个实例之前,或者刚好在访问类一个非继承字段或成员之前生成这个调用。即为精确语义。

    55450

    C#开发人员应该知道13件事情

    本文讲述了C#开发人员应该了解到13件事情,希望C#开发人员有所帮助。 1. 开发过程 开发过程是错误和缺陷开始地方。使用工具可以帮助你在发布之后,解决掉一些问题。 类型陷阱 C#一个主要优势是其灵活类型系统; 类型安全有助于早期发现错误。通过强制实施严格类型规则编译器能够帮助你保持正确编码实践。 等价比较 有两种类型等价: 引用相等,这意味着两个引用,引用了同一个对象。 值平等,这意味着两个不同对象是等值。 此外,C#提供了多种方法来测试等价。最常见方法是使用: ==和! C#编译器会警告你这个潜在错误,但是有许多类似的情况,编译器不会对意外引用相等发出警告。 3. 类陷阱 封装你数据 类负责正确地管理数据。 这些额外代码可能产生更多错误,使得代码更难以读取和调试。 类型转化时,经常会遇到以下两种情形: 表达式运行时类型编译器能推断出类型更加具体。转换指示编译器将表达式当做更具体类型来处理。

    38690

    动态装载和使用类型

    作者:微软 Reflection提供诸如Microsoft Visual Basic.NET和JScript语言编译器使用底层结构来实施隐性后绑定。绑定是定位与某一特定类型相对应声明过程。 Visual Basic.NET使你可以在你代码中使用隐性后绑定;VisualBasic.NET编译器调用helper 方法,使用Reflection获得对象类型。 在以下代码例子中, Visual Basic.NET编译器通过Reflection隐性地 来一在编译时不知类型对象调用方法。 可用成员是指那些在类型或任何基本类型中定义那些成员。如果指明BindingFlags.NonPublic,任何访问级别的成员都会在返回中。 Double  Int64 Single, Double  Single Double  Non-reference type Reference type  Type类有Get方法,可使用Binder类型参数来解析成员引用

    20930

    编写代码良好习惯——C#

    二、readonly(运行时常量)和const(编译时常量)   1、const只可用于基元类型、枚举、字符串,而readonly则可以是任何类型;   2、const在编译时将替换成具体常量,这样如果在引用中同时使用了 const和readonly两种值,则readonly再次改变将会改变设计初衷,这是需要重新编译所更改程序集,以重新引用新常量值。    ,这样占用了更多CPU时间;   3、事件能在运行时响应,具有更多灵活性,可以对同一个事件关联多个响应;   4、通行规则是处理一个派生类事件是,重写方式较好。    四十三、避免过度使用反射   1、Invoke成员使用参数和返回值都是System.Object,在运行时进行类型转换,但出现问题可能性也变得更多了;   2、接口使我们可以得到一个更为清晰、也更具可维护性系统 ;   3、ILDasm是一个IL反汇编工具,可以帮助我们洞察细节;   4、Shared Source CLI是一个包含.NET框架内核和C#编译器实现源码。

    17231

    C# 7.3新特性一览

    通过一个相对较小版本,C# 7.3解决了一些自C# 1和2以来长期悬而未决问题。 重载解析 从C# 1.0开始,重载解析规则设计就相当有问题。 根据这些错误选出方法优先级,编辑器要么会报没有匹配方法,要么会报匹配不明确。 C# 7.3把其中部分检查移到了重载解析期间,而不是重载解析之后,这样,错误匹配就不会导致编译器错误。 理想情况下, 这个自定义ValueTuple类型会遵循与C# 7.3编译器同样规则,但是,在如何处理嵌套元组和动态类型方面,可能会有微妙差别。 根据这些错误选出方法优先级,编辑器要么会报没有匹配方法,要么会报匹配不明确。 C# 7.3把其中部分检查移到了重载解析期间,而不是重载解析之后,这样,错误匹配就不会导致编译器错误。 理想情况下, 这个自定义ValueTuple类型会遵循与C# 7.3编译器同样规则,但是,在如何处理嵌套元组和动态类型方面,可能会有微妙差别。

    18130

    abstract virtaul override new 及多态

    virtaul  virtaul 关键字用于修饰方法、属性、索引器或事件声明,并使它们可以在派生类中被重写(为了被重写abstract 及virtaul 都不能是私有的) 调用虚方法时,将为重写成员检查该对象运行时类型 New关键字主要用来区别派生类和基类同名方法选择问题,通过隐藏基类方法,达到使编译器调用正确方法目的。Override主要用来基类方  法和虚方法进行重写。 ,并且其参数与传递参数兼容),则 C# 编译器将选择最佳方法进行调用。 如果使用类型为 C、B 或 A 变量访问 D 实例, DoWork 调用将遵循虚拟继承规则,即把这些调用传送到类 C  DoWork 实现。 由于密封类从不用作基类,所以有些运行时优化可以使密封类成员调用略快。 在对基类成员进行重写派生类上成员、方法、字段、属性或事件可以将该成员声明为密封成员

    24430

    C# 7.0简而言之 -- 02. C#基础 (1)

    变量代表着一个存储位置, 随着时间变化, 这个位置可能含有不同值. 与之相对常量则表示不可变值: const int y = 355; C#里面所有的值都是类型实例. 构造函数就像一个方法, 但是方法名和返回类型变成了类型名: [image.png] 实例成员 vs 静态成员 太简单了略.... 静态类所有成员必须是静态. ] 与之相对, 值类型不可以为null: [image.png] 存储开销 值类型实例精确地占用了字段所需要内存, 例如 Point就占用了8字节: [image.png] 引用类型需要为引用和对象分配单独内存 不管你是否设置了 /checke编译器开关, 在编译时算出表达式总是进行溢出检查的话, 除非你使用unchecked操作符. int x = int.MaxValue + 1; // 编译时错误 int 它们没有自己操作符, C#会在需要时候隐式它们转换到大一点类型.

    526120

    C语言与C++面试知识总结

    (reference to const),用于形参类型,即避免了拷贝,又避免了函数修改; 修饰成员函数,说明该成员函数内不能修改成员变量。 修饰成员变量,修饰成员变量使所有的对象只保存一个该变量,而且不需要生成对象就可以访问该成员。 who(),是通过类(Base)具体对象(b)来调用,编译期间就能确定了,所以它可以是内联,但最终是否内联取决于编译器。 另外还可以定义与 struct Student 不冲突 void Student() {}。 C++ 中 由于编译器定位符号规则(搜索规则)改变,导致不同于C语言。 此类对象可以有效存储指向类型名称指针。type_info 类还可存储适合比较两个类型是否相等或比较其排列顺序编码值。类型编码规则和排列顺序是未指定,并且可能因程序而异。

    15941

    __attribute__机制介绍

    GNU CC需要使用 –Wall,这是控制警告信息一个很好方式。下面介绍几个常见属性参数。 2. format 该属性可以使编译器检查函数声明和函数实际调用参数之间格式化字符串是否匹配。 或strfmon参数表格式规则该函数参数进行检查。 4. const 该属性只能用于带有数值类型参数函数上,当重复调用带有数值参数函数时,由于返回值是相同。所以此时编译器可以进行优化处理,除第一次需要运算外, 其它只需要返回第一次结果。 ))声明,编译器只调用了函数一次,以后只是直接得到了相同一个返回值。 使用该属性struct或者union类型进行定义,设定其类型每一个变量内存约束。

    1.7K10

    C++ lambda表达式

    ,可在(参数)后添加mutable限定符使值捕获数据可在函数体里修改。      使用lambda表达式时,编译器会产生未命名类未命名对象,且有一个调用运算符成员函数,实际使用时会调用该调用运算符成员函数。 该未命名类不包含默认构造函数、赋值运算符、默认析构函数,而是否包含默认拷贝、移动构造函数与捕获数据成员类型有关。 引用传递:auto Lambda = [&intVal](){cout << ++intVal << endl;}; Lambda();,引用传递是否被修改取决于intVal是否const类型,如果被修改则会同时修改外部数据 表达式介绍,如有错误望交流指正。

    9140

    什么?CC++面试过不了?因为你还没看过这个!

    (reference to const),用于形参类型,即避免了拷贝,又避免了函数修改; 修饰成员函数,说明该成员函数内不能修改成员变量。 修饰成员变量,修饰成员变量使所有的对象只保存一个该变量,而且不需要生成对象就可以访问该成员。 who(),是通过类(Base)具体对象(b)来调用,编译期间就能确定了,所以它可以是内联,但最终是否内联取决于编译器。 另外还可以定义与 struct Student 不冲突 void Student() {}。 C++ 中 由于编译器定位符号规则(搜索规则)改变,导致不同于C语言。 此类对象可以有效存储指向类型名称指针。type_info 类还可存储适合比较两个类型是否相等或比较其排列顺序编码值。类型编码规则和排列顺序是未指定,并且可能因程序而异。

    56850

    c++系列之二 指向成员函数指针(烧脑)

    为了使文章读起来通俗有趣,翻译君并未一字一句一板一眼地翻译,并大量使用了诙谐词汇(如“码农”)。另外,原文某些地方分段不太合适(小学语文可能是体育老师教。。) 看起来好像编译器根本不鸟p值是什么,只介意p类型。别着急,咱先吊吊胃口,把答案留到后面的章节。现在,我们所能知道是,编译器准确地知道要调用哪个函数。这就是所谓“静态绑定”。 所以,静态成员函数不是类一部分,成员函数指针语法常规函数指针并不成立,例如上面例子中静态成员函数指针。 C++类型转换规则 非虚函数情形 我们在前面一节看到,成员函数指针并不是常规指针,所以,成员函数指针(非静态)不能被转换成常规指针(当然,如果哪个脑残真想这么做的话,可以使用汇编技术来暴力解决),因为成员函数指针代表了 成员函数指针和常规指针对比 不同情形下成员函数指针转换规则 如何使用成员函数指针数组来解决特定设计问题 编译器是如何解释成员函数调用 扩展:成员变量指针 http://luodw.cc/2015

    1.6K20

    第7章 类

    这样,用户使用接口任何部分都只需要引入一个文件。 在自定义或重载与输出有关函数时,应尽量减少格式控制,这样可以增强该函数适用性,由用户自行决定是否换行或进行其它格式控制。 例如,如果类中包含一个其他类类型成员且这个成员类型没有默认构造函数,那么编译器将无法初始化该成员。 为了使友元用户可见,通常把友元函数自己声明与类本身放置在同一个头文件中(类外部)。 通过区分成员函数是否const,可以对其重载。常量对象只能调用 const函数,而非常量对象会优先调用 普通函数。 不完全类型,一个类在声明之后定义之前状态。 如果成员声明中使用了类中尚未出现名字,则编译器将会在定义该类作用域中继续查找。

    34640

    《C++Primer》第十六章 模板与泛型编程

    编译器只能检查语法错误,比如忘记分号或者变量名拼错。 第二个阶段:编译器遇到模板使用时。 对于函数模板调用,编译器通常会检查实参数目是否正确,还能检查参数类型是否匹配;对于类模板,编译器可以检查用户是否提供了正确数目的模板实参 第三个阶段:模板实例化。 Bolb<int> ia; Blob<int> ia2 = {0,1,2,3,4}; 2.3 在模板作用域内引用模板类型 举个例子,我们data成员使用了两个模板:vector和shared_ptr, ,考虑下面例子: template <typename T> void f(T &p); 其中函数参数p是一个模板类型参数T引用,需要记住非常重要两点: 编译器会应用正常引用绑定规则 const 但是C++在正常绑定规则外定义了两个例外规则,允许这种绑定: 第一个例外规则:当我们将一个左值(如i)传递给函数右值引用参数,且此右值引用指向模板类型参数(如T&&)时,编译器推断模板类型参数为实参左值引用类型

    16410

    C++11标准常用特性---统一初始化

    1、在给结构体赋值时候,可以使用一大括号来进行赋值,赋值过程中会按照结构体成员顺序来进行赋值; struct initTest { int nNum; string str; }; initTest o = { 1, "初始化" }; //第一种初始化方式 initTest o2{ 1, "初始化" }; //第二种初始化方式 初始化类型是否按照顺序指定呢? 传入一个错误类型试试,看下编译器会提示什么。 ? 错误提示.png 从编译器错误提示中可以看到,第一个参数类型已经被确定为int类型。 ;每个派生类必须实现自己构造函数哪怕基类构造函数已经够用了.非静态数据成员不能在声明地方初始化.它们只能在构造函数中初始化. C++11为这些问题提供了解决方案.C++11允许构造函数调用另一个构造函数(叫做委托构造).这允许构造函数利用其它构造函数行为而只需增加少量代码.C#,java和D语言都提供了这种功能.

    37330

    C#学习笔记之一】C#关键字

    C#关键字 关键字是编译器具有特殊意义预定义保留标识符。它们不能在程序中用作标识符,除非它们有一个 @ 前缀。例如,@if 是有效标识符,但 if 不是,因为 if 是关键字。 下面是列出所有的关键字在 C# 程序任何部分都是保留标识符: abstract as base bool break byte case catch char checked class const 参考) 修饰符用于修改类型类型成员声明。 本节介绍 C# 修饰符: 修饰符 用途 访问修饰符 public private internal protected 指定声明类型类型成员可访问性。 var 使编译器能够确定在方法作用域中声明变量类型。 where 将约束添加到泛型声明。(另请参见where)。 yield 在迭代器块中使用,用于向枚举数对象返回值或发信号结束迭代。

    68050

    扫码关注腾讯云开发者

    领取腾讯云代金券