2.1 第一个C#程序
using System; // 导入命名空间 namespace Test { // 命名空间 internal class Program { // 类声明 static void Main(string[] args) { // 方法声明 Console.WriteLine("Hello World"); // 语句 } } }
2.2 语法
using System; namespace Test { internal class Program { static void Main(string[] args) { Console.WriteLine("Hello World"); } } }
2.2.1 标识符和关键字
标识符是程序员为类、方法、变量等选择的名字。
System Test Program Main args Console WriteLine
关键字是对编译器有特殊意义的名字。 特殊情况 @+关键字 作标识符
using namespace internal class static void string
2.2.2 字面量、标点与运算符
字面量是静态的嵌入程序中的原始数据片段 (例如: int x=12; 中的12就是字面量)
标点有助于划分程序结构。(例如: { } ; )
运算符 + - * / % . 等
2.2.3 注释
// 注释内容 /* 注释内容 */ /// XML注释 /** * * **/
2.3 类型基础
2.3.1 预定义类型
数值类型:
int uint short ushort long ulong
sbyte(-127~128) byte(0~256) decimal(128) double float
逻辑值: bool
字符: char(2个字节)
引用类型: string object
2.3.2 自定义类型
使用 class
2.3.3 类型转换
隐式转换:转换中没有信息丢失,总能成功。 (例如:int ⇒ long)
显示转换:信息可能会丢失,不一定成功。 (例如:long ⇒ int)
int x=10; long y=x; // 隐式转换 x=(long)y; // 显示转换
2.3.4 值类型和引用类型
值类型的变量或常量的内容仅仅是一个值。 (例如:struct int …. char)
引用类型变量或常量中的内容是一个含值对象的引用。
引用类型可以赋值为 字面量null。
值类型想要赋值为null,需要使用可空修饰符 ?
string str=null; int? x=null;
存储开销对比
- 值类型实例占用的内存大小就是存储字段所需的内存。CLR使用整数倍的大小来分配,可能浪费
- 引用类型 除了对象所占用的字段大小外,需要额外的管理空间开销。
2.4 数值类型
2.4.1 数值字面量
十六进制:0x 开头
二进制:0b 开头
指数表示:E/e
数值后缀:F D M(decimal) U(uint) L(long) UL
2.4.2 算术运算符
+ - * / %
自增自减:++ - -
位运算符:~(取反) & | ^ << >>
2.5 布尔类型和运算符
== !=
&& ||
? :
2.6 字符和字符串
转义字符: \ ”符号”
字符串拼接:+
字符串插值:$
字符串忽略转义字符:@
字符串比较:CompareTo()
2.7 数组
2.7.1 一维数组
char[] chs=new char[5]; chs[0]='A'; chs[1]='B'; for(int i=0;i<chs.Length;i++){ chs[i]='A'; } foreach(var ch in chs){ Console.Write(ch+" "); }
2.7.2 多维数组
// 二维数组 int[,] ints=new int[][]; for(int i=0;i<ints.GetLength(0);i++){ for(int j=0;j<ints.GetLength(1);j++){ ints[i][j]=i*3+j; } } // 交错数组 int[][] ints2=new int[][]{ new int[] {1,2,3}, new int[] {4,5}, new int[] {6,7,8,9} };
2.8 变量和参数
2.8.1 栈和堆
栈是存储局部变量和参数的内存块。
函数进入,栈分配一个;离开函数,就会释放一个。
堆是保护对象的内存块。新创建的对象会分配在堆上并返回其引用。
程序执行中,堆会被新创建的对象不断填充;.NET 运行时的垃圾回收器会定期从堆释放对象。
2.8.2 明确赋值
- 局部变量在读取前必须赋值
- 调用方法必须提供实际的参数
- 运行时会自动初始化其他变量(例如字段和数组元素)
2.8.3 默认值
所有引用类型 null
所有数字和枚举类型 0
char ‘\0’
bool false
default 关键字获取类型的默认值
2.8.4 参数
参数传递方式
ref 按引用传递 传入 参数使用前必须初始化
out 按引用传递 传出 可以在传入前不赋值,但必须在函数结束前赋值。
无修饰符 按值传递 传入
params 修饰符
只能修饰方法中的最后一个参数,它能使方法接受任意数量的指定类型参数,必须声明为数组
void Method(int x,params string[] strs){ for(int i=0;i<strs.Length;i++){ Console.WriteLine(x); } } void Main(){ Method(4,{"aa","bb","cc"}); }
命名参数
void Method(int x,int y){ Console.WriteLine(x+" "+y); } void Main(){ Method(y:2,x:4); }
var 隐式局部变量
编译器根据值确定类型。
var x=10; var y='A'; var z=true;
2.9 表达式和运算符
表达式本质上是值。最简单的表达式是常量和变量。
12 1230 1+(1230)
2.9.1 基础表达式
Math.Sqrt() 等。
2.9.2 空表达式
是没有值的表达式。 (例如: Console.Write(1) 没有值)
2.9.3 赋值表达式
= += -= *= /= %= << = >> =
2.10 null 运算符
2.10.1 null 合并运算符 ??
string str1=null; string str2=s1??"nothing"; // 如果s1为null,str2赋值为 "nothing"
2.10.2 null 条件运算符 ?.
string x = "abc"; string z = x?.ToUpper(); // 如果x不为null,z=x.ToUpper();
2.11 语句
if if-else for while do-while switch continue break goto return
using 语句块
2.12 命名空间
命名空间是一系列类型名称的领域。 (例如: System.Security.Cryptography)
namespace 关键字为其中的类型定义了命名空间。
using 和 using static 指令
using static System.Console void Main(){ WriteLine("Hello World"); }
设置命名空间别名
using T=System.Console; void Main(){ T.WriteLine("Hello World"); }
外部别名
使用 extern alias
标签:语言,C#,void,基础,运算符,int,类型,null,string From: https://www.cnblogs.com/Swbna/p/16878910.html