VS使用:
- visual studio msdn:F1
- 创建C#项目:控制台应用程序
- 调试并运行:F5,需要ReadKey
- 直接运行:Ctrl+F5,不需要ReadKey
- .cs:C#程序源文件
基本知识
- 各种using:调用微软提供的命名空间,命名空间中包含了很多个类
- Main方法是程序的入口
- C#程序是由类组成的,而不是命名空间
- 蓝色的,比如using,namespace,static,void,string,class是关键字,所有关键字都是小写的
- 注释:///用在类、方法、属性前面,不能用来解释单个变量
- Console.WriteLine();会换行
Console.Write();不会换行 - 标识符只能由英文、数字、下划线组成,开头不能是数字
- bool值是true or false
数据类型
数据类型 | 默认值 |
---|---|
double | 0.0 |
int | 0 |
bool | false |
char | ‘a’ |
string | null |
数组
- 赋值:
char[,] ch={{'g','b'},{'h','a'}};
char[,] ch=new char[2,2]{{'g','b'},{'h','a'}};
- 获取长度:
一维
int[] age=new int[4];
Console.Write(age.Length);
二维:GetLongLength():获取多维数组中第几维的长度
int[,] array = new int[2,2] { { 1,2 },{ 3,4 } };
Console.WriteLine(array.GetLongLength(0));
foreach的使用
foreach(string x in names)
不可以对x进行赋值,它是迭代变量
int[] array = new int[] {1,2,3,4,5,6};
foreach(int i in array)
{
Console.WriteLine(i);
}
继承
- Object类是所有类的基类 只有单继承 就是说 只能声明有一个基类
- 如果子类有与基类同名方法(覆盖)则必须用new让编译器知道
- 先调用基类构造函数再调用子类的
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp2
{
public class Pet
{
public string Name;
public void PrintName()
{
Console.WriteLine("Pet's Name is:"+Name);
}
}
public class Dog : Pet { }
class Program
{
static void Main(string[] args)
{
Dog dog = new Dog();
dog.Name = "java";
dog.PrintName();
Console.ReadKey();
}
}
}
Result:
Pet's Name is:java
- 隐藏
数据成员:声明名称、类型相同的成员即可
函数:声明相同函数前面
让编译器知道:new
public class Dog : Pet
{
new public void PrintName()
{
Console.WriteLine("Dog's Name is:"+Name);
}
}
Result:
Dog's Name is:java
- 程序设计的依赖倒置原则:
程序设计要依赖于抽象类(Pet)而不依赖于具体类(Dog)
多态
- 通过指向派生类的基类引用,调用虚函数,会根据引用所指派生类的实际类型,调用派生类中的同名重写函数
- 通过一个基类引用指向派生类,但只能访问派生类中的基类部分
Pet dog = new Dog();
dog.Name = "java";
dog.PrintName();
Console.ReadKey();
Result:
Pet's Name is:java
- 虚方法/抽象方法:
- 声明virtual的方法是虚方法
- virtual方法可以有函数体
- virtual方法可以不用让类声明abstract
- 派生类中override virtual方法就可以重写
- abstract方法不可以有函数体,声明方法后直接分号,比virtual还要虚
类
- abstract抽象类不可以有实例
- 有抽象成员的必须声明abstract类
- abstract类可以有抽象、非抽象成员