解读经典《C#高级编程》第七版 Page50-68.核心C#.Chapter2

前言

本篇讲述Main方法,控制台,注释,预处理指令,编程规范等。这些概念比较琐碎,为避免长篇大论,主要以列举要点的方式来说明。

01

Main方法

  1. Main方法并不是所有应用类型的入口方法,它只是控制台程序、Winform程序的入口方法。
  2. 创建项目时自动生成的Main方法,其修饰符是未指定的(未指定时默认为private),这说明入口方法并不要求public修饰符。
  3. 可以为应用程序指定多个Main方法,但编译时你必须显式的告诉编译器以哪个方法作为入口,否则编译会报错。所谓显式的告诉编译器,就是:

# 如果用csc.exe命令行编译,要带上参数 /main 并指定入口方法。命令行编译还有很多功能,比如编译类库等,但平常我们并不会用到命令行,了解原理就行。

# 如果在Visual Studio中,则可在项目属性中可设置入口方法。

  1. 可以给Main方法传递参数,以提供不同的功能。

static void Main(string[] args)

cmd中调用:test.exe a b c

02

控制台程序

如果要开发界面应用,一般会用WPF项目或者Winform项目,如果要写不需要界面的应用,一般会用Windows服务项目。所以控制台项目似乎没什么用,我主要用它写一些测试代码,用于研究语言和类库的一些不熟悉的功能。

为了实现一些基本的交互,会用到的方法:

Console.WriteLine();     //输出

Console.ReadKey();       //暂停和接受用户输入

03

注释

单行注释://

多行注释:/*  */

XML注释(类注释,方法注释等):///

之所以称之为XML注释,是因为在其编译的时候,其注释可以输出到标准化的XML格式文档中,然后可以通过工具软件生成类库帮助文档。接触过Java的同学应该知道Java有个JavaDoc工具可以生成项目的类库说明,非常实用。但.Net似乎没有提供原生工具,只是有些第三方工具提供这种功能,所以大家将XML注释输出生成为文档的行为并不是很流行。

04

预处理器指令

预处理器指令的概念来自于C和C++,对于C#来说,预处理器指令是由编译器处理的,影响的是编译过程。

  1. #define, #undef, #if, #elif, #else, #endif, #pragma

这些命令组合在一起,实现条件编译(即某些代码可以不被编译)。

这些预处理器指令基本不会用到,一些高级的场合可能才会使用,比如你要开发一个通用类库,而这个类库要支持不同的.Net版本。

  1. #warning, #error, #line

用于编译时输出警告,或者提示编译错误。

  1. #region, #endregion

用于定义一个代码区域,使得整个代码区域可以折叠。这个功能我日常常用,可以说不可或缺。因为我习惯于强类型编程,在使用LINQ创建对象时,可能需要生成几十个字段的POCO类,我一般用工具软件生成创建对象的代码,其中就包含了#region,#endregion,这段工具生成的代码平时是折叠的,这样避免了编程中过多的滚动屏幕而浪费时间。

05

C#编程规则

  1. 标识符规则:标识符是给变量、用户定义的类型(如类和结构)和这些类型的成员指定的名称。标识符规则:

# 尽管可以包含数字字符,但它们必须以字母或下划线开头。

# 不能把C#关键字用作标识符。

如果一定要用关键字做标识符名称,则可以加上@。虽然我从来不会这样用,但这提醒我们之前讲过的C#编译器是怎么理解@符号?@符号表示的是“将字符串理解为原本的含义”,同样的解释可以用在这里。比如:

string string = "xxxx";    //错误

string @string = "xxxx";    //正确

  1. 编程风格约定(非强制)

# 不使用任何前缀

传统编程语言会习惯使用变量名前缀,用于表示变量类型,比如strValue表示string类型,intValue表示int类型。但C#中不建议如此做,这是因为C#作为面向对象编程的语言,以及强大的IDE,使用前缀带来的编程便利性优势已经基本消失。

# Pascal规范:单词首字母大写

名称空间、类、类成员(包括字段,属性)的名称都遵循此规范(除了部分遵循camel规范)。

# camel规范:名称中第一个单词首字母小写,其他单词大写

类的私有成员,方法的参数名遵循camel规范。

# 属性和方法

C#属性有getter,setter访问器,其实际上类似于方法。属性的使用便利性,容易让人忍不住将其应用范围不断扩大,但这并不总是合适的。那么问题就来了,什么时候适合将某成员设计为属性,而什么情况应该设计为方法?一般规则如下:

## 不要定义只写属性。如果你要定义一个只写属性,那它更合适使用方法实现,而不是用属性实现。

## 读取属性不应该花费太长时间和太多资源。比如如果读取一个属性还需要先连接数据库,再从数据库提取数据,那它应该实现为get方法而不是属性。

## 读取属性值不应该有负面效应。比如读取属性过程中后改变了一些数据,这是不应该的。

## 读取属性值应该和读取顺序无关。比如一个属性如果读取之后,会意外的被除了setter之外的其他方法改变,那么它不应该设计为属性。

## 设置属性值应该和设置顺序无关。设置属性值都不应该依赖任何其他前提,也不应该出现在某种情况下会抛出异常的可能。

# 字段

## 字段应该总是私有的。

## 常量和只读字段可以设为公有。

# 我的补充

有些人还是会将私有字段以_开头,比如 _userName。我不建议这么做。因为前面讲到了,不建议变量命名使用前缀,而 _ 也是一种特殊的前缀。且私有字段使用camel表示法,已经能和Pascal表示法的属性/方法分开了,没有必要再加一个 _ 来区分。

也有些人又说,我使用前缀是为了避免私有字段和初始化方法的参数间的命名冲突(因为按照规范,两者都是使用camel命名规范),这其实是好解决的,用this就可以了。比如:

下一篇将开始解读第三章“对象和类型”,这章主要阐述C#的对象化编程特性,这是很值得深入探讨的部分。

觉得文章有意义的话,请动动手指,分享给朋友一起来共同学习进步。

欢迎关注本人微信公众号,更及时的关注最新文章(每周三篇原创文章,以及多篇专题文章):

附文:

c# 利用注释summary生成文档

C#预处理器指令

上一篇:解读经典《C#高级编程》第七版 Page45-50.核心C#.Chapter2

原文地址:https://www.cnblogs.com/holyknight17/p/10221256.html

时间: 2024-08-11 05:54:07

解读经典《C#高级编程》第七版 Page50-68.核心C#.Chapter2的相关文章

c#高级编程第七版 学习笔记 第二章 核心c#

第二章 核心C# 本章内容: 声明变量 变量的初始化和作用域 C#的预定义数据类型 在c#程序中使用条件语句.循环和跳转语句执行流 枚举 名称空间 Main()方法 基本的命令行c#编译器选项 使用System.Console执行控制台I/O 使用内部注释和文档编制功能 预处理器指令 C#编程的推荐规则和约定 2.1 第一个c#程序 2.1.1 代码 using System; namespace Wrox { Public class MyFirstClass { static void Ma

随笔C#高级编程(第七版)

一.对象   和   类型 结构和类的区别在于它们的存储方式.访问方式(类存储在堆(heap)上的引用类型,而结构是存储在栈(stack)上的值类型 ) ps:区别  引用类型  和  值类型  ,请回忆(两个孩子手上的棒棒糖)   和   (两个孩子抢遥控器看电视)的例子 ref 参数迫使变量通过  引用传递的方式参与方法,当然调用该方法时也需要添加 ref 关键字 out 关键字 使得函数可以有多个返回 C#  方法重载的一些小限制: 两个方法不能仅在返回类型上有区别 两个方法不能仅根据参数

《C#高级编程第七版》多线程之Events

按照范例,将代码稍加变动,打出来了,如下所示 using System; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; using System.Text; namespace Demo2 { class Program { static void Main(string[] args) { const int taskcount

c#高级编程第七版 学习笔记 第三章 对象和类型

第三章 对象和类型 本章的内容: 类和结构的区别 类成员 按值和按引用传送参数 方法重载 构造函数和静态构造函数 只读字段 部分类 静态类 Object类,其他类型都从该类派生而来 3.1 类和结构 类和结构都是创建对象的模板,每个对象都包含数据,并提供了处理和访问数据的方法 结构和类的区别是他们在内存中的存储方式.访问方式(类是存储在堆上的引用类型,而结构是存储在栈上的值类型)和他们的一些特征(如结构不支持继承).较小的数据类型使用结构可提高性能.但在语法上,结构和类非常相似,主要的区别是使用

C#高级编程第9版 第二章 核心C# 读后笔记

System命名空间包含了最常用的.NET类型.对应前面第一章的.NET基类.可以这样理解:.NET类提供了大部分的功能,而C#语言本身是提供了规则. pseudo-code,哈哈,秀逗code.伪代码. 必须初始化变量才能编译,否则报错.有些情况下,没有显示初始化,会被编译器默认为0去编译. 实例化一个对象需要用new关键字. 类型推断使用var 关键字. var i= 0: 系统会推断出 i 为C#的int类型,为.NET的System.Int32类型. for while或类似语句中声明的

《UNIX环境高级编程(第3版)》

<UNIX环境高级编程(第3版)> 基本信息 原书名:Advanced Programming in the UNIX Environment (3rd Edition) (Addison-Wesley Professional Computing Series) 原出版社: Addison-Wesley Professional 作者: (美)W. Richard Stevens    Stephen A. Rago 译者: 戚正伟 张亚英 尤晋元 出版社:人民邮电出版社 ISBN:9787

《Python高级编程(第2版)》中文版PDF+英文版PDF+源代码

下载:https://pan.baidu.com/s/1W11Takw5zNYknzbGL_DZcw更多分享:https://pan.baidu.com/s/1yBmXcivRHZhepu2R1Ol11Q <Python高级编程(第2版)>中文版PDF+英文版PDF+源代码中文版PDF,421页,带书签目录:英文版PDF,536页,带书签目录:配套源代码.经典书籍,讲解详细. 基于Python 3.5版本进行讲解,通过13章的内容,深度揭示了Python编程的高级技巧.从Python语言及其社

Linux - Unix环境高级编程(第三版) 代码编译

Unix环境高级编程(第三版) 代码编译 本文地址:http://blog.csdn.net/caroline_wendy 时间:2014.10.2 1. 下载代码:http://www.apuebook.com/code3e.html 2. 安装依赖库:sudo apt-get install libbsd-dev  3. 进入下载目录make 4. 复制头文件和动态链接库 sudo cp ./include/apue.h /usr/include/ sudo cp ./lib/libapue

【转】apue《UNIX环境高级编程第三版》第一章答案详解

原文网址:http://blog.csdn.net/hubbybob1/article/details/40859835 大家好,从这周开始学习apue<UNIX环境高级编程第三版>,在此,我要感谢网易的一个工程师朋友和室友,没有他们,我不会开始真正的学习这本书,希望大家以后开始慢慢进步.废话少说,直接上课后习题了. UNIX高级编程第一章习题答案: 1.1在系统上验证,除根目录外,目录l和l l是不同的. 答:这个验证有很多方法可使用命令ls .cd.vim等,目录.指向当前目录,目录..指

中文版C#高级编程第8版中的翻译错误

第180页,倒数第三行. 英文原文: If you overload == and !=, you must also override the Equals() and GetHashCode() methods inherited from System.Object; 中文译文: 在重载"=="和"!="时,还必须重载(应该是:重写)从System.Object中继承的Equals()和GetHashCode()方法. 中文版C#高级编程第8版中的翻译错误,布