标记(Token)
关键字(Keyword)
- 关键字是对编译器具有特殊意义的预定义保留标识符
- 为了帮助编译器解释代码,C#中的某些单词具有特殊地址与含义,即关键字。
- 关键字提供具体的语法,编译器根据其语法来解释程序员书写的表达式。
编译器利用关键字识别代码的结构与组织方式,因为编译器对这些单词有着严格的解释,开发人员只能按照C#的语言规则将关键字放在特定的位置。一旦程序员违反规则,编译器就会报错。
C#1.0之后没有引入任何新的保留关键字,后续版本中,一些构造使用了上下文关键字(contextual keyword),它们在特定位置才有意义。除了那些位置,上下文关键字没有任何意义。这样所有C#1.0代码都完全兼容后续版本。
- 操作符(Operator)
标识符(Identifier)
C#使用标识符标识开发人员编写代码的构造。分配标识符之后,以后就能用它引用所标识的构造。因此,开发人员应分配有意义的名称,不要随意分配。
标识符有两种基本的大小写风格
- CLI创建者的Pascal大小写(PascalCase),要求标识符每个单词的首字母大写。
- camel大小写(camelCase),除了第一个字母小写,其他与pascal风格一样。
标识符规范
- 注重标识符的清晰而不是简短
- 不要再标识符名称中使用单词缩写
- 不要使用不被广泛接受的首字母缩写词,即使被广泛接受非必要也不要使用。
- 下划线虽然合法,但标识符一般不要包含下划线、连字号、非字母或数字。
- C#不适用匈牙利命名法,即为名称附加类型缩写前缀。
- 标点符号
- 文本:字面值
算法
using System;
namespace TestApp
{
class Calculator
{
/*使用递归运算*/
public int SumFromOneToX(int number)
{
if(number == 1)
{
return 1;
}
else
{
int result = number + SumFromOneToX(number - 1);
return result;
}
}
}
class Program
{
static void Main(string[] args)
{
//递归
//var calculator = new Calculator();
//int result = calculator.SumFromOneToX(100);
//算法
int number = 100;
int result = (1 + number) * number / 2;
Console.WriteLine(result);
Console.ReadKey();
}
}
}
类型
- 什么是类型(Type)
- 类型在C#语言中的作用
- C#语言的类型系统
- 变量、对象与内存
什么是类型
一个变量声明所指定的数据的类型称为数据类型,简称类型,是具有相似特征和行为的个体的分类。
类型(Type)又称为数据类型(DataType)
A data type is a homogeneous collection of values, effectively presented, equipped with a set of operations which manipulate these values.
- 类型是数据在内存存储的型号
- 小内存容纳大尺寸数据会丢失精确度,发生错误。
- 大内存容纳小尺寸数据会导致浪费
- 编程语言的数据类型与数据的数据类型不完全相同
强类型语言与弱类型语言的比较
- C语言示例:IF条件
- JS语言示例:动态类型
- C#语言对弱类型/动态类型的模仿
类型在C#语言中的作用
C# 类型中所包含的信息
- 存储此类型变量所需的内存空间大小
- 此类型的值最大最小值范围
- 此类型所包含的成员
- 此类型由那个基类派生而来
- 程序运行时,此类型的变量在分配在内存的什么位置。
// 打开性能监视器
$ perfmon
- 此类型所允许的运算或操作
误区:引用类型保存在堆上,值类型保存在栈上
变量的值是在它声明的位置存储的,所以,假定一个类中有一个int类型的实例变量,那么在这个类的任何对象中,该变量的值总是和对象中的其他数据在一起,也就是在堆上。只有局部变量,即方法内部声明的变量和方法参数在栈上。对于C#2.0+,很多局部变量并不完全存放在栈上。
脆弱的栈内存
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Text.RegularExpressions;
namespace TestApp
{
class BadKls
{
public void BadMethod()
{
int x = 100;
this.BadMethod();
}
}
class Program
{
static void Main(string[] args)
{
BadKls kls = new BadKls();
kls.BadMethod();//Error: System.StackOverflowException
}
}
}
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Text.RegularExpressions;
namespace TestApp
{
class Program
{
static void Main(string[] args)
{
unsafe
{
//Process is terminating due to StackOverflowException.
int* p = stackalloc int[999999];
}
}
}
}