3 c#核心编程
- Main()
c#要求所有的程序逻辑都包含在一个类型定义中,Program类中的Main()方法作为程序的入口点。
Program类也称作应用程序对象,一个可执行程序可以有多个应用程序对象,但必须指定具体的入口点。
Environment: get environment info - Console
Console.WriteLine("os {0}, cd {1}, ld {2}, is 64 {3}, machine name {4}", Environment.OSVersion, Environment.CurrentDirectory,
Environment.GetLogicalDrives()[0], Environment.Is64BitOperatingSystem, Environment.MachineName);
数据类型
object类派生的类型: Type, String, Array, Exception, Delegate, ValueType
ValueType类型的派生是结构或枚举,不是类
System.ValueType重载System.Object定义的虚方法。来实现值类型对值操作,复制或传递等数据类型ValueValuestring: System.String
字符串拼接: +
逐字字符串: @
相等性: string是引用类型,但是相等性操作符被定义为比较字符串对象的值
字符串是不可变的: 每一次字符串修改是分配了新的字符串
StringBuilder: System.Text
调用stringbuilder的成员都是直接修改对象内部的字符数据。checked关键字: 检查数据溢出的情况
unchecked: 禁止溢出抛出异常
byte b1 = 100;
byte b2 = 250;
//without checked is 94
//checked is
byte sum = checked((byte)(b1 + b2));
Console.WriteLine("add byte 100 + 250 is {0}", sum);
var: 隐式局部类型 用来创建隐式类型的本地变量而不必指定具体的数据类型。编译器将自动推断实际的数据类型。
var不是关键字,因为我们可以将之作为变量,参数的名字,但var标记与数据类型时,编译器视之为关键字。
可以用var表示任何类型,包括数组和泛型类型及自定义类型
局限:
1,只能用于方法或属性范围的本地变量, 不能定义返回值,参数或自定义类型的字段。
2,必须赋初值,且不能为null.因为null不能判断实际的数据类型
3,强类型,在编译时确定数据类型后将不再进行改变
4,多与linq查询结合使用迭代结构
for 循环关键值只在循环域中可见
foreach 适合线性逐项遍历某个集合,不能向前或间隔等。集合可以是任何实现IEnumerable接口的类。
while 执行语句知道满足某个终止条件
while()
{}
do
{}while();条件结构
if/else 只能用于布尔表达式,不能用于-1/0这样的值
布尔表达式一旦被确定为false,其他的表达式就不会再被检查
switch
switch(number/string/enum)
{
case XX: {}; break;
…
default;
}
4 编程结构
参数修饰符
默认 按值传递,调用者的原始值和被调用方法的变量之间的值互相不影响
out 按引用传递,输出参数由被调用方法赋值
ref 按引用传递,调用者赋初值,关键字行为根据参数是值类型还是引用类型有区别按值传递引用类型: 被调用方法中可以修改对象的状态数据,但不能改变对对象的引用 按引用传递引用类型: 被调用方法中可以修改对象的状态数据,也可以改变对对象的引用
params 参数数组
将一组可变数量的相同类型的参数作为单独的逻辑参数传递。能且只能是最后一个参数有params修饰符 static double Cal(params double[] values) 1, Cal(1.2,2.2,3.3); 2, double[] data = {1,2.2,3,3,3,3}; Cal(data); 3, Cal().
可选参数
方法调用者不指定不必要的参数,而是使用参数的默认值。
但是,可选参数的值必须在编译时确定且必须位于方法签名的最后。DataTime.Now的值在运行时确定static double DefalutParam(string name, string param = "default param"); DefalutParam("name"); DefalutParam("name","optional");
命名参数
允许在调用方法时乱序指定参数的值static void DisplayFancyMessage(ConsoleColor textColor = ConsoleColor.Blue, ConsoleColor backgroundColor = ConsoleColor.White, string message = "Test Message"){...} DisplayFancyMessage(message: "example");
重载
一组名字相同,但是参数类型或是数量不同的方法。数组
是一组相同数据类型(int, string, class)的数据点
var 隐式语法分配数组,初始化列表中每一项的类型应该是相同的
多维数组:矩形数组, 交错数组: 数组的上界不同
System.ArraySort Algorithm(windows) 内省排序法 IntroSort() <=3 swap 1/2,1/3,2/3 3< <16 插入排序法 InsertionSort() Log2\N > 0 先采用快速排序法 PickPivotAndPartition() Log2\N = 0 再使用堆排序法 HeapSort()
- 枚举类型 enumeration
enum: 自定义的名/值对的数据类型
enumerator: 实现了IEnumerable的类或结构
enum EmpType { Low=10, Medium, Large} // 11,12,13
enum EmpType { Low=10, Medium=13, Large=15}
低层存储 enum EmpType:byte { Low=10, Medium=13, Large=15}
System.Enum - 结构类型 struct
C#的new关键字会调用默认的构造函数,并且给每个字段赋默认值
结构类型的构造函数必须为每一个字段赋值 - 值类型和引用类型
System.ValueType重载System.Object定义的虚方法。来实现值类型对值操作,复制或传递等
值类型复制后,两个变量的操作是独立的
引用类型复制后,都指向同一块内存,相互之间互相影响
包含引用类型的值类型 值类型中一旦包括了引用类型属性,引用类型属性字段会指向同一块内存,其他值类型属性字段的值仍然是互相独立的。
按值传递引用类型: 被调用方法中可以修改对象的状态数据,但不能改变对对象的引用
按引用传递引用类型: 被调用方法中可以修改对象的状态数据,也可以改变对对象的引用 - 可空类型
数值数据类型(char, bool)都是值类型,一旦实例化自动有默认值(0,”,false), 所以值类型不会有值null
可空数据类型是值类型后加”?”, 定义域中增加null
?实际是创建一个泛型System.Nullable, 提供了一组可空变量类型可以使用的成员集合, 派生自struct
局部可空变量必须赋一个初始值或是null才能使用,null == null => true
?? 可空类型赋值。 if(!a.HasValue) a = true;