最近因为工作需要学习C#,简单总结下C#中我之前没有见过的语言特性
- 1Main1方法第一个字母使用大写
控制台输入输出
* 输出 `System.Consolve.WriteLine()/Write()`
* 两者之间的区别:`WriteLine` 输出回车
* 输入 `System.Consolve.ReadLine()/Read()/Key`
* 区别:
`ReadLine `读取一行
`Read` 返回与读取的字符值对应的整数。
`ReadKey` 返回用户的单次输入
- 字符串插值
- 在Write函数调用总为字符串字面值附加$
例:string name = "Jack"; System.Consolve.Write($"your name: {name}");
输出:your name : Jack;
- 在Write函数调用总为字符串字面值附加$
- 复合格式化:
string.Format("hello world {0} {1}", 参数1, 参数2...)
- C# 允许在字符串前使用 @符号,指明转义序列不被处理
- C# 在
Write
中使用+
操作符连接字符串 $ 与 @ 结合使用
:System.Consolve.WriteLine($@"your full name is : {firstname} {lastname}")
注:VisionPro8.2不支持- 输出左右大括号:
$"{{ {price:C2} }}"
结果为:{$1, 234.56}
- 使用
System.WriteLine() 和 System.Environment.NewLine
输出回车,而不要用\n
- 将
null
值赋给string
变量和为变量赋值 " "也是不一样的概念。
数据类型(基本数据类型、引用、数组)
- 浮点数精度由有效数位的个数决定,而不是由一个固定值。浮点数在计算机中使用二进制表示,转换成10进制可能造成精度丢失。建议高精度的数据使用
decimal
- 虽然理论上一个二进制位足以容纳一个布尔类型的值,但
bool
实际大小是一个字节 void
本质上不是数据类型,它只是指出没有数据类型这一事实。checked?
暂时放置- 每个数据类型都包含一个
Parse()
方法,允许将字符串转换为对应的数值类型。从C#2.0起,所有基缘数值类型都包含静态方法TryParse()
方法,他转换失败不引发异常,而是返回 false- 用法
double number;
string input;
double.TryParse(input, out number);
- 用法
- 所有类型都支持
ToString
方法,用它提供类型的字符串表示。大多数类型的ToString()
方法只是返回数据类型的名称,而不是数据的字符串表示。只有在类型显示实现了 ToString() 的前提下才会返回字符串表示。 - 一个类型要么是值类型,要么是引用类型
- 为引用类型的变量分配实际数据的内存区域称为堆
- 如对象在逻辑上是固定大小、不可变的值,就考虑定义成值类型。如在逻辑上是可引用、可变的东西,就考虑定义成引用类型。
- 基元类型的默认值:
- 引用类型初始化为
null
- 数值类型初始化为
0
- bool 初始化为
false
- char 初始化为
\0
- 引用类型初始化为
- 在C# 中只有赋值、调用、递增、递减、await和对象创建表达式才能作为独立的语句使用。
- 在C#中,浮点数 0 除以 0 会得到 “Not a Number”,输出为
NAN
- 赋值操作符首先计算要赋的值,再进行赋值
函数
- 要为方法使用名词或者动词短语
- C#不支持全局方法,一切都必须写在一个类声明中
System.Environment.GetCommandLineArgs()
返回由命令行参数组成的数组。- 引用类型,函数定义和函数调用都需要添加引用修饰符
- ref 与 out
- 区别 ref 只能传入饮用后的参数,而out在使用前必须先声明(C#7.0 以后不需要再声明)
- in 只读引用
- ref 与 out
- C# 使用
params
关键字声明方法中数组参数可变- 参数数组必须是最后一个参数
- 方法的唯一性取决于方法名、参数类型或参数数量的差异。
- 将核心功能放到单一方法中供其他重载方法调用,以后就只需在核心方法中修改,其他方法将自动受益
- 要尽量为所有参数提供好的默认值
- 要提供简单方法的重载,必须参数的数量要少
- 考虑从最简单到最复杂组织重载
异常
- 要在抛出的异常中描述异常为什么发生。顺带说明如何防范最佳
- catch块必须从最具体到最不具体排列
- 避免捕捉无法从中完全恢复的异常。这种异常不处理比不正确处理好
- 避免在重新抛出前捕捉和记录异常。要允许异常逃脱,直至他被正确处理
- 要在捕捉并重新抛出异常时使用空的throw语句,以便保留调用栈。
- 要通过抛出异常而不是返回错误码来报告执行失败。
- 不要让公共成员将异常作为返回值或者out参数。抛出异常来指明错误,不要把它们作为返回值来指明错误。
- 不要用异常来处理正常的、预期的情况,用它们处理异常的、非预期的情况。
预处理指令
- 常见用法
- 控制何时以及如何包含代码
- 处理不同平台之间的差异
- 调试
- 指令
#error和#waning
指令分别生成错误和警告消息#region, #endregion
声明代码区域
数组
- 数组声明
stirng[] languages;
- 由于数组大小不需要作为变量声明的一部分,所以可以在运行时指定数组大小
- 二维数组与交叉数组
- 二维数组
int[,] cells;
- 交叉数组
int [][] cells;
- 区别:交叉数组行的元素数量可以不同,但二维数组不可以。
- 二维数组
- System.Array
Sort()
排序
BinarySearch
二分搜索
Reverse()
反转
Clear()
将数组中每个元素都设置为默认值 - 成员方法
GetLength()
获取特定维度的数组长度Rank()
获取数组维度
- 字符串可以作为数组读取,但不能修改
string
string
字符串不可变,没有提供修改字符串内容的机制。- 如有多个内容需要修改,比如要经理多个步骤构造一个长字符串,可以考虑使用
System.Text.StringBuilder
StringBuilder 包含 Append()、AppendFormat()、Insert()、Remove()和Replce()
等方法。 string.Compare(字符串1,字符串2,是否忽略大小写_默认忽略)
;比较两个字符串string.Format()
; 返回特定格式的结果。Length()
: 获得当前字符串中字符的个数ToUpper
:将字符串转换为大写ToLower()
:将字符串转换为小写Equals(LessonTwo, StringComparison.OrdinalIgnorCase)
:比较两个字符串,忽略大小写Split()
:分割字符串,返回字符串类型的数组Substring()
:截取字符串IndexOf()
: 判断字符串在字符串中第一次出现的位置LastIndexOf()
:判断字符串在字符串中最后一次出现的位置StartWith()
: 判断以。。。开始EndWith()
: 判断以。。。结束Replace()
: 将字符串中某个字符串替换成一个新的字符串Contains()
:判断字符串是否包含某个字符串Trim()
: 去掉字符串中前后的空格TrimEnd()
: 去掉字符串中结尾的空格TrimStart()
: 去掉字符串中前面的空格IsNullOrEmpty()
: 判断一个字符串是否为空或者为nullJoin()
: 将数组按照指定的字符串连接,返回一个字符串