C#的学习历程
C#的世界
1.NET Framework包括公共语言运行库,和.NET Framework类库
NET Framework会将C#程序编译成MSIL中间语言。它产生的汇编程序是可执行文件。
2.标准数值格式化字符
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _2018_05_04_AM_1520_格式化数字字符串
{
class Program
{
static void Main(string[] args)
{
/*
* 格式化数字字符串
* 格式说明符的语法由3个字段组成:索引号、对齐说明符、格式字段(format field)
* 格式:{ index , alignment :format }
* index 为索引,是必需要填写的,表示是哪一个需要进行格式化;
* alignment 为对齐说明符,由自己决定是否需要填写;是一个整数,其中正整数表示的是字段右对齐,负整数表示的是左对齐,填写的数字表示的是长度(宽度);
* format 为格式字段,来指定由index选择的数字的表现形式;需注意冒号后面紧跟格式说明符,中间不能由空格。
* 格式说明符 是一个字母字符;精度说明符 是可以选择是否需要,由1~2位数字组成。
* 具体请看下面的例子
*/
double first = 1234.56789;
double second = -12.3456789;
/*
* 标准数字格式说明符
*/
Console.WriteLine("格式说明符:");
Console.WriteLine("货币C、c(不区分大小写) |{0, 15 :C}|{1, -15 :c3}|", first, second);
/*
* 把值格式化为货币,货币符号取决与程序所在的PC的区域自动设置
* 精度说明符 设置的是小数位的位数;如果不设置 精度说明符 那么会自动取2位小数。
*/
Console.WriteLine("十进制D、d(不区分大小写) |{0, 15 :D}|{1, -15 :d4}|", 107, -29);
/*
* 十进制数字字符串,需要注意,只能和整数类型配合使用;如果是其他类型会报错,提示格式说明符无效
* 精度说明符 设置的是整个字符串的位数;如果实际数字位数小于给出的精度说明位数,则在左边补0。
*/
Console.WriteLine("定点F、f(不区分大小写) |{0, 15 :F}|{1, -15 :f3}|", first, second);
/*
* 带有小数的十进制数字字符串
* 精度说明符 设置的是小数位的位数;如果不设置 精度说明符 那么会自动取2位小数。
*/
Console.WriteLine("常规G、g(不区分大小写) |{0, 15 :G}|{1, -15 :g4}|", first, second);
/*
* 在没有说明符的情况下,会根据值转换为定点或科学记数法表示的紧凑形式
* 精度说明符 设置的是整个字符串的位数;如果实际数字位数小于给出的精度说明位数,并不会进行任何补0操作;不设置,则按原样显示
*/
Console.WriteLine("十六进制X、x(区分大小写) |{0, 15 :x5}|{1, -15 :X}|", 107, -29);
/*
* 十六进制数字的A~F会根据格式说明符的大小写来进行匹配,X 匹配A~F ;x 匹配a~f
* 精度说明符 设置的是整个字符串的位数;如果实际数字位数小于给出的精度说明位数,则在左边补0。补充:字符串的位数是按转成了十六进制的字符串的位数。
*/
Console.WriteLine("数字N、n(不区分大小写) |{0, 15 :N}|{0, -15 :n5}|", first, second);
/*
* 和定点相似,但在每三个数字的一组中有逗号或空格分隔符,从小数点向左数,取决于程序所在的PC的区域设置
* 精度说明符 设置的是小数位的位数;如果不设置 精度说明符 那么会自动取2位小数。
*/
Console.WriteLine("百分比P、p(不区分大小写) |{0, 15 :P}|{1, -15 :p6}|", first, second);
/*
* 表示百分比,数字会乘以100
* 精度说明符 设置的是小数位的位数;如果不设置 精度说明符 那么会自动取2位小数。
*/
Console.WriteLine("往返过程R、r(不区分大小写)|{0, 15 :R}|{1, -15 :r3}|", first, second);
/*
* 保证输出字符串后,如果使用Parse方法将字符串转化成数字,则该值与原始值一样。
* 精度说明符 设置了也并没有对数据有影响。
*/
Console.WriteLine("科学记数法E、e(区分大小写)|{0, 15 :E}|{1, -15 :e10}|", first, second);
/*
* 具有尾数和指数的科学记数法。指数前加的字母E 是根据说明符的大小写进行匹配的
* 精度说明符 设置的是小数位的位数。
*/
Console.ReadKey();
}
}
}
结果:
上述代码参考:https://www.jb51.net/article/140501.htm
3.数组的用法
一维数组的初始化
int[] grade = new int[4];
for (int i = 0; i <= 3; i++)
{
grade[i] = i;
}
foreach(int item in grade){
Console.Write("{0},", item);
}
Console.ReadLine();
数组的长度是数组.Length
二维数组的初始化
继承与多态
继承
- 继承的定义:继承机制是使用现有类派生出新的类所建立的分层式结构。
- 基类的生与死都有构造函数与析构函数所掌握,他们都不能被继承。
继承的方法:
class Education:School
基本就是这样进行继承
继承的东西为:基类的属性,方法。但是却没有继承基类的构造函数。 - This关键字可以引用到对象本身所属类的成员,简单的说,当我们实例化一个类A的对象B时,使用this关键字就是指向对象B,或是与对象有关的成员。
要注意属于静态类的字段,属性或方法是无法使用this关键字的。
3.如果想要使用基类的构造函数,就要使用base关键字
class 派生类:基类
{
public 构造函数():base()
{
//构造函数程序段
}
}
例如:
class Father{
public Father(string fatherName){
}
}
class Son:Father{
public Son(string sonName):base(sonName){
}
}
这就是调用基类函数参数的构造函数
注意,不能在静态方法中使用base关键字
3. 隐藏基类成员,包括属性和方法
方法:new public string showTime()
多态
1.方法名相同,传递的参数不同,产生重载
2.覆盖:
注意事项:
- 派生类的方法前面加上override关键字,表示调用自己的方法,而非基类方法。
- 静态方法不能被覆盖,被覆盖的基类方法须冠上virtual,abstract,override关键字
- 覆盖的派生类方法需使用与父类相同的派生词。
public virtual void calcMoney
:定义虚拟方法,计算薪资可以让子类覆盖
public override void calcMoney
:覆盖基类方法
接口和抽象类
- 定义抽象类
abstract class 类名称{
public abstract 数据类型 属性名称 {get;set;}
}
例:
abstract class Staff
{
private string name;
public Staff(string staffName)
{Name = staffName;}
public abstract void showMessage();//不能加程序块的那种大括号啊!!
}
注意:定义抽象类时不能使用private,protected访问权限修饰词,也不能使用new 运算符来实例化对象,static或sealed这些关键字也不能使用。
2.密封类
Define:不能被继承,简单地说就是无法产生派生类,所以又称为“最终类”。
sealed class Person:Provisonal{
public sealed override void showMessage(){
程序段。
}
}
3.接口
interface IScholl
{
int subject{get;set;}
void showMessage();
}
注意:类是可以实现多个接口的。
class Stduent :ISchool,IGrade{}
泛型和集合
集合
- .NET Framework 通过“System.Collection”命名空间提供了集合类和接口。
- “索引键/值” 是配对的集合,值存入时可以指定对象类型的索引键,以便于使用索引键来提取相应的值。
列举IDictiionary的成员- Count:获取ICollection项数
- Items:获取或设置索引键的指定表项
- Keys:集合中所有表项的索引键
- Values:集合中所有表项的值
使用下标
- ArrayList arrylist = new ArrayList[6];
相比Array的优点的是可以加入多种数据类型。 - Queue
Queue fruit = new Queue(); fruit.Enqueue(name[i])'
3.Stack:后进先出
创建泛型
- 注意添加
System.Collections.Generic
- 使用泛型可以大大改进原有的问题,例如传值的时候,传入的是两个不同的数据类型的 数组,除了这点差别,方法其他事没什么差别的。
class 泛型名称<类型变量列表>{}
private T[] items= new T[5];
委托
- 定义:主要就是把“方法”视为变量来传递。委托是一种类型,代表具有特定参数列表和返回类型的方法引用。
- 委托类型派生自
Ddlegate
类,委托类是密封的,不能作为其他类的派生来源。 - 例子
public delegate bool Speculation(int numerical);//定义一个委托方法,含有一个变量
Speculation evenPredicate;//声明委托变量
evenPredicate = ewn Speculation(IsEven)//将方法传递
private static List<int> ArrayPercolate(int[] intArray,Speculation special)//这里会将委托对象当做参数进行传递
** 功能**:用委托 ,将方法寄托在委托对象上面,就像上面的IsEven,这个便是一个方法,然后,直接,就可以用对象调用方法,的方式,使用这个方法。