C#基础知识(学习之路)

版权声明:本文为博主原创文章,版权归本人所有,允许第三方转载,但转载时请务必保留作者名,并注明出处链接,否则本人将保留追究其法律责任的权利。 https://blog.csdn.net/qq_39357403/article/details/85009444

第一部分:OOP

一. 变量与表达式

1.值类型:

(1).整数类型:sbyte(signed:有正负之分的)、byte、short、ushort(unsigned)、int、uint、long、ulong
(2).浮点类型:float、double、decimal
(3).文本和布尔类型:char(一个Unicode字符,存储0—65535之间的整数)、bool
(4). 结构类型:sruct(point、size、datetime)
(5). 枚举类型:enum

2.引用类型:

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

3. 运算符

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

4.数组

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

            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 };

注意:数组是引用类型,它的元素相当于类的成员变量,因此数组一经分配空间,其中的每个元素也被按照成员变量同样的方式隐式初始化(数值类型是0;引用类型是null)

(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:

            switch (exp) {
                case const1:
                    statement1;
                    break;
                case const2:
                    statement2;
                    break;
                    ......
                case constN:
                    statementN;
                    break;
                default:
                    statementN_default;
                    break;
            }

注意:不能随便贯穿,必须有break;除非几个case连起来,中间没有别的语句

2.for:

包含:初始化部分、循环条件部分、迭代部分、循环体部分

            for (init_statement;test_exp;alert_statement) {
                body_statement
            }

3.while:

(包含:初始化部分、循环条件部分、循环体部分、迭代部分)

            [init_statement]
            while (test_exp) {
                body_statement;
                [alter_statement;]
            }

注意:当循环不是特别规则的时候,大多选用while

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.常用算法:遍试、迭代、递归

猜你喜欢

转载自blog.csdn.net/qq_39357403/article/details/85009444
今日推荐