首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【深入浅出C#】章节 2:数据类型和变量:变量和常量声明和初始化

避免潜在错误:通过显式地为变量赋予初始值,可以避免因为忘记赋值而导致逻辑错误和运行时异常。 提高代码可读性和维护性:变量初始化使代码更加清晰和易于理解。...通过在声明时初始化变量,可以明确地表达变量意图和初衷,使代码更易读,并且更容易维护。 支持编译器优化:在某些情况下,编译器可以利用变量初始值进行优化,以提高程序性能。...五、默认值和可空类型 5.1 变量默认值规则C#中,变量在声明但未被显式赋值时会被赋予一个默认值。...5.2 使用可空类型处理可能为空变量 在C#中,可空类型(Nullable Types)允许我们类型(Value Types)变量进行处理,使其具有表示为空能力。...例如: const int MaxValue = 100; const string Greeting = "Hello"; 常量命名规则: 常量命名通常使用大写字母,以增加其可读性和标识性。

38220

C#7.3 新增功能

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

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

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

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

1.7K30

C#7.0 新增功能

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

1.3K10

万字长文带你掌握C++11中auto和decltype用法和区别

C#、JavaScript、PHP、Python 等,程序员在定义变量时可以不指明具体类型,而是让编译器(或者解释器)自己去推导,这就让代码编写更加方便。...C++11 赋予 auto 关键字新含义,使用它来做自动类型推导。也就是说,使用了 auto 关键字以后,编译器会在编译期间自动推导出变量类型,这样我们就不用手动指明变量数据类型了。...当程序员使用 decltype(exp) 获取类型时,编译器将根据以下三条规则得出结果: 如果 exp 是一个不被括号( )包围表达式,或者是一个类成员访问表达式,或者是一个单独变量,那么 decltype...,很难看出会有什么错误,但在使用 Base 类时候,如果传入一个 const 类型容器,编译器马上就会弹出一大堆错误信息。...; *p3 = 19; //赋值报错 在 C++ 中无法将一个变量完整类型输出,我们通过变量赋值来判断它是否const 修饰;如果被 const 修饰那么赋值失败,如果不被 const 修饰那么赋值成功

37210

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

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

60030

探索C# 10.0关键新特性

}}如果文件中成员较多,这样写法显得很冗长。...;优点简化代码:Top-level Statements 可以减少应用程序中冗余代码,使代码更加简洁明了。...Target-typed new expressions(目标类型new表达式)编译器现在可以根据变量目标类型推断构造函数参数类型。...new 表达式时,我们省略了类型名 Person,而是在 new 后面直接使用了目标类型 Person,编译器会自动推断出类型。...总结其实C# 10.0还有很多新特性,以上只是C# 10.0部分重要新特性一部分,此外还包括可空引用类型进一步改进、record structs等,所有这些新功能都使C#语言更加现代化和易用,感兴趣可以通过更新到最新版本

26241

C# 学习笔记(3)—— 类和结构体

;但若使用 const 修饰字段,如果没有在定义字段时初始化,就会产生编译错误 如前所述,你也可以使用 static 关键字来声明静态字段,区别就是静态字段必须通过类来访问 属性 属性是字段扩展。...根据面向对象语言封装思想,字段最好设为 private,因为这样可以防止客户端之间字段进行篡改,从而保证了内部成员完整性。...于是为了访问类中私有字段,C# 提供了属性这种机制,用来字段进行灵活控制和访问 public class Person { private string name; public...编译器会自动生成一个函数体为空无参实例构造函数 可以对实例构造函数指定访问级别 构造函数必须与类同名 构造函数不允许有返回类型 2、静态构造函数 静态构造函数用于初始化类中静态成员,在创建第一个实例或引用任何静态成员之前...,索引器将大大地简化类中数组成员地访问。

23110

【C++】基础:Effective C++高效编程建议

使用相同形式 new 和 delete 17. 在一个独立语句中将 new 出来对象存入智能指针 18. 使接口易于正确使用,而难以错误使用 19. 视类设计为类型设计 20....只要可能就用const 将某些东西声明为 const 有助于编译器发现使用错误。...使接口易于正确使用,而难以错误使用 好接口易于正确使用,而难以错误使用。你应该在你所有接口中为这个特性努力。 使易于正确使用方法包括在接口和行为兼容性上与内建类型保持一致。...预防错误方法包括创建新类型,限定类型操作,约束对象值,以及消除客户资源管理职责。 tr1::shared_ptr 支持自定义 deleter。...这条规则并不适用于内建类型及 STL 中迭代器和函数对象类型。对于它们,传值通常更合适。 21.

8310

解析C#类中构造函数

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

3.2K50

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

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

2.3K90

动态装载和使用类型

作者:微软 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类型参数来解析成员引用

66330

编写代码良好习惯——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#编译器实现源码。

70831

C语言:自定义类型——联合和枚举

1.3 联合体大小 特点2提到,编译器只为联合体最大成员分配足够空间,那联合体大小就一定等于最大成员变量大小吗??...联合体大小要遵循以下两个特点: 1、联合大小⾄少是最⼤成员大小。 2、当最⼤成员大小不是最大对齐数整数倍时候,就要对⻬到最⼤⻬数整数倍。...1.4 相同成员结构体和联合体对比 我们再⽐⼀下相同成员结构体和联合体内存布局情况。 这说明使用联合体是可以节省空间!!!...、枚举常量是遵循作⽤域规则,枚举声明在函数内,只能在函数内使⽤ 枚举有作用域概念,在一个函数内部使用,出了函数就不能用了,但是#define定义标识符没有作用域概念,他是一个全局都可以使用常量。...2.3 枚举类型使用 使用方法:使⽤枚举常量给枚举变量赋值 那是否可以拿整数给枚举变量赋值呢? 在C语⾔中是可以,但是在C++是不⾏,C++类型检查⽐ 较严格。

14110

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编译器同样规则,但是,在如何处理嵌套元组和动态类型方面,可能会有微妙差别。

1.1K30

abstract virtaul override new 及多态

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

75430

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#会在需要时候隐式它们转换到大一点类型.

1K120

类和对象:运算符重载

_day; } 该代码就是“”运算符重载,之后通过使用”“就可以对比日期类两个对象(根据该运算是否有意义来决定)。 使用时代码就是如此:d1 == d2。...**检测是否自己给自己赋值 返回*this **:要复合连续赋值含义 //作为成员函数,赋值运算符重载函数: // 用Date类型引用返回使得可以连续赋值 Date& operator=(const...尝试将其定义为非成员函数会导致编译错误,因为编译器期望赋值运算符是类成员。 语义问题:赋值运算符语义是将一个对象值设置为另一个对象值。...这是为了保持语言一致性和防止潜在错误使用。 因此,当尝试将赋值运算符重载为全局函数时,编译器会报错,因为它违反了C++规则和赋值运算符预期行为。...如果类中包含了其他自定义类型作为其成员变量,并且这些自定义类型重载了赋值运算符 =,那么在进行类实例赋值操作时,编译器会尝试调用这些成员变量类型赋值运算符来完成赋值(MyQueue)。

9010

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

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

2.9K20

__attribute__机制介绍

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

2.9K11
领券