C#学习笔记

第一部分:OOP

一. 变量与表达式

1.值类型:

//(1)整数类型:
sbyte、byte、short、ushort(unsigned)、int、uint、long、ulong //signed:有正负之分的

//(2)浮点类型:
float、double、decimal

//(3)文本和布尔类型:
bool、char //一个Unicode字符,存储0—65535之间的整数

//(4)结构类型:
struct //point、size、datetime

//(5)枚举类型
enum

2.引用类型:

//(1)类类型:
class /string为字符串类
//(2)接口类型:
interface:
(3)委托类型:
delegate
//(4)数组类型:
array

3. 运算符

// 优先级从高到低
(1)++、-- (用作前缀)、+、- (一元)
(2)* 、/、%
(3)+、-
(4)=、*=、/=、%=、+=、-=
(5)++、-- (用作后缀)

!& | ++ -- > 算术运算符 > 关系运算符 > && > || (逻辑运算符)> 赋值运算符

4.数组

(1)声明一维数组:(三段代码效果一致),例:

//数组是引用类型,它的元素相当于类的成员变量,因此数组一经分配空间,
//其中的每个元素也被按照成员变量同样的方式隐式初始化(数值类型是0;引用类型是null)
int[] a = new int[3];
a[0] = 3;
a[1] = 5;
a[2] = 9;
int[] a = {3,5,9 };
int[] a = new int[] { 3, 5, 9 };

(2)foreach循环

foreach (< baseType > < name > in < array >)
{
    body_statement;
}

注意:foreach是只读式遍历

(3).声明二维数组,如下:

int[,] a = {{1,5,9},{2,5,9},{3,5,9}};

getlength()方法的使用:如下:

//获取各个维度的长度
a.GetLength(0),a.GetLength(1)

二.流程控制

1.switch:

// 不能随便贯穿,必须有break;除非几个case连起来,中间没有别的语句
switch (exp) 
{
    case const1:
        statement1;
        break;
    case const2:
        statement2;
        break;
        ......
    case constN:
        statementN;
        break;
    default:
        statementN_default;
        break;
}

2.for:

// 包含:初始化部分、循环条件部分、迭代部分、循环体部分
for(init_statement;test_exp;alert_statement) 
{
    body_statement
}

3.while:

// 包含:初始化部分、循环条件部分、循环体部分、迭代部分
// 当循环不是特别规则的时候,大多选用while
[init_statement]
while(test_exp) 
{
    body_statement;
    [alter_statement;]
}

4.循环的中断

break //立即终止循环
continue //立即终止当前的循环(继续执行下一次循环)
return //跳出循环及包含该循环的函数

三、类

写程序就是写类

1.字段、方法

写类就是写变量和函数,而字段就是变量,方法就是函数

构造方法(constructor):构造方法的主要作用是完成对象的初始化
(1)构造方法的方法名与类名相同
(2)构造方法没有返回类型,也不能写void
初始化最常见的任务就是把带进来的参数赋值到字段里面去,例:

public Person(string n,int a)
{
    name=n;
    age=a; 
} 

默认构造方法:如果用户没有定义任何构造方法,则系统会自动产生一个publlic Person(){}

析构方法:由于C#自动进行对象的释放,所以用户一般不定义析构方法

this:指这个对象本身,常用于:
(1)访问这个对象的字段和方法
(2)区分字段和局部变量
(3)用于构造方法调用另一个构造方法,注意其位置,例:

public Person():this(0,"")()
{
//  构造方法的其他语句;
}

2.属性(property)、索引(indexer)

对字段和方法的扩充
属性的书写:

private string _name;
public string Name
{
    get{return _name;}
    set{_name = value;} // value表示传进来的参数
}

//可简写为
public string Name { set; get; }

对属性进行访问:

Person p = new Person();
p.Name= "Li Ning"; //set
console.WriteLine(p.Name); //get

属性与字段的比较:
(1)属性可以只读(只有get)或者只写(只有set)
(2)属性可以进行有效性检查:if…
(3)属性可以计算得到的数据:

public string Info
{
    get{ return "Name:" + Name + ",Age:" + Age; }
}

(4)可以定义抽象属性

索引的定义:

修饰符 类型名 this[参数列表]
{
    set{ }
    get{ }
}

3.类的继承

C#采用单继承,所
有的类都直接或者间接的继承至object类
除了继承父类的成员外,子类还可以:添加新的成员,隐藏或修改父类的成员

字段隐藏

class A
{
    public int a;
}
class B:A
{
    new public int a; //new
}

与父类同名的方法
(1)定义同名、但参数列表与父类不用的方法,这称为对父类方法的重载(overloading)
(2)定义同名且参数列表也与父类相同的方法,这称为新增加一种方法,用new表示
(3)定义同名且参数列表也与父类相同的方法,而且父类的方法用了abstractvirtual进行了修饰,子类的同名方法用了override进行了修饰,这称为虚方法的覆盖(overriding)

base
(1)修改父类方法的同时,又利用了父类的方法:

void sayHello()
{
    base.sayHello();
    console.WriteLine("My school is:"+ school);
}

(2)定义构造方法的同时,调用父类的构造方法,最后再增加一些信息:

Student(string name,int age,string school)
{
    this.school=school;
}

as运算符:常用于父类与子类的转换:

Student s3 = p1 as Student;//被如果能转换,s3被赋值;如果不能转换,s3的值为null

注意:as只能应用于引用类型,与强制类型转换有区别

is运算符:判断一个对象是不是某个类(及其子类)的实例:

if(p is Person)

4.修饰符

访问修饰符:public、private、internal、protected

static(静态的)
static的字段、方法、属性是属于整个类的,而不是某一个实例的。所以不能使用this…(与this相对)
static变量可以用来表示"全局变量"

const与readonly
const相当于静态常量,如Math.PI
readonly相当与不可改量,只能赋一次值,如String.Empty。在构造方法中赋值,或者在声明时就赋值。
注意:const只能用于基本及string
readonly只能修饰字段,而const还可以修饰局部变量

sealed与abstra
sealed类,不可继承
abstract类,不可实例化

5.接口(interface)

:帮助实现多重继承
(1)定义一个接口:接口是一系列方法

public interface IStringList
{
    void Add(string s);//普通的方法
    int Cout{get;}//比较特殊的方式;属性
    string this [int index]{get;set;}//比较特殊的方式:索引器
}

注意:public abstract 这两个关键字不写出来
(2)实现接口:

class 类名:[父类] ,接口,接口,接口
{
public 方法()
{
//定义的时候没有实现,现在将它具体实现
}

6.结构和枚举

(1)struct:值类型
每个字段在定义时,不能给初始值
构造方法中,必须给每个字段进行赋值
是sealed的,是不能被继承

struct Point
{
    public double x,y;
    public Point(int x,int y)
    {
        this.x=x;
        this.y=y;
    }
    public double R()
    {
        return Math.Sqrt(x*x+y*y);
    }
}

(2)枚举:本质是有意义的整数:

enum MyColor    //后面可以跟一个	:int
{
    Red,
    Green=1,
    Blue=2
}

赋值与比较:如下:

MyColor c=MyColor.Red;
if(c==MyColor.Red)
switch(c){case MyColor.Red:*********}

与字符串的转换:如下:

Console.WriteLine(c.ToString()); //转成红绿蓝
c=(MyColor )Enum.Parse(typeof(MyColor),"Red");

四、C#高级特性

1.委托

大体上相当于函数指针,但它类型更安全,是引用类型
C#定义了很多的委托:

Action<T1,T2>
Func<T1,T2,Tresult>; //new Func<double,double>(Math.Sin);

委托具有多播的功能:使用运算符±,+=,-=,可以动态地增减其中的函数,提高了程序的灵活性

2.事件

大致上相当于回调函数,事件的类型是一个委托
事件的声明:public event 委托名 事件名;
事件的注册与移除:事件名+=或-=(在事件所在类的外面,只能用以上两个运算符)
事件的发生(激发):事件名(参数列表)

3.lamda表达式:

4.运算符重载:

5.异常处理:

try{......}
catch(Exception e1){......}
catch(Exception e2){......}
catch(最一般的Exception e){}
finally{......}	 //无论怎么样都会走到这里来,甚至包括try里面有return

五、基础类及常用算法

1.类型转换

任何事物都是object类的子类,任何对象都有一下方法:ToString()、 Equals(), GetType()、 MemberwiseClone()等
类型转换函数:System.Convert、 int.Parse(string)、 int.TryParse(string)

2.几个常用类

数字、文字、日期

(1)Math类:提供了相关的数学方法

Abs() //绝对值
Sin()、 Cos()、 Tan()
Round() //四舍五入
Exp()、 log() //对数指数
Pow() //乘方

(2)Random类:得到的都是伪随机数

.Next(100) //0到100之间,不含100
.NextDouble() //0到1之间

(3)DateTime:是值类型

new DateTime(y,m,d,h,m,s)
.Now
.ToString(“yyyy-MM-dd HH:mm:ss”)
.AddMinute(5)
.Year、 .Month、 .Day、 .Date
TimeSpan //两个日期相减,可以得到一个TimeSpan

(4)String类:

==(内容是否相等)、 +(连接)、 [];
.Lenth() 长度、 .Indexof()取下标 、 .LastIndexof() 反向去查找;
.StartWith() 使…开始、 .EndsWith;
.Substring(idx,len)求字符串,注意第二个参数;
.Trim()去空格 、 .TrimEnd()去掉末尾空格 、 .PadLeft() 左边填充空格、 .Insert () 、 .Remove();
.Split(’;’)分割 、 string.Join可以把字符串连接起来;

(5)String及StringBuilder

String //内容不可变
StringBuilder //内容可变:.Append、 .Remove 、 .Replace 、 .Length 、 .ToString

3.数组、集合、泛型

(1)数组:控制长度,控制类型

(2)集合:不控制长度,不控制类型
 

//System.Collections命名空间;
Arraylist //相当于动态数组,实现IList;
Hashtable //相当于键/值的集合,实现IDictonary; 用[]进行访问,表示获取、增加、删除、修改; 用于查询时,比线性搜索效率更高,可用于程序的优化;
Stack和Queue

(3)泛型:不控制长度,控制类型

 // 具有更好的类型检查和性能;
 //System.Collections.Generic名称空间;
 //列表:
List/LinkedList SortedList //List的Add方法,Count属性,[i]索引器;foreach的遍历;

 //字典:
Dictionary SortedDictionary;

 //集:
HashSet SortedSet //Hashtable的[]索引,可以表示获取/加入/修改/删除(置为null);foreach的遍历;
Stack,Queue;

(4)使用foreach访问数组和集合

4.常用算法:遍试、迭代、递归

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值