C#基础知识大杂烩

                                    目录

面试准备.... 2

第一章: 基础加强一.... 2

第二章:基础加强二.... 2

变量作用域... 2

封装... 2

继承... 2

里氏替换原则... 3

New关键字... 3

Base关键字... 3

第三章:访问修饰符 虚方法  静态 抽象类实现多态.... 3

访问修饰符... 3

虚方法... 3

静态成员... 4

抽象方法... 4

小技巧... 4

第四章:字符串常用函数.... 5

字符串常用方法... 5

简单工厂设计模式... 5

顺便说:... 6

值类型和引用类型... 6

ref. 7

第五章:接口 类型转换 异常处理 参数修饰符.... 10

接口... 10

类型转换... 12

异常处理... 12

参数修饰符... 14

Ref out. 15

第六章:StringBuilder 垃圾回收 ArrayList  Hashtable  List与Dictionary. 15

StringBuilder. 15

垃圾回收... 15

集合.... 15

第七章:装箱拆箱... 16

第八章:序列化... 17

面试准备

熟悉word、excel文件的导入以及导出;对线程有一定的了解,在项目中能够熟练运用;了解正则表达式的基本知识;

第一章: 基础加强一

封装继承多态

第二章:基础加强二

变量作用域

。。。

封装

封装成类就叫封装

继承

子类继承父类,子类拥有父类一切东西,还可以进行添加

里氏替换原则

要父类的时候给子类是可以的

New关键字

New放在方法名前,为了隐藏父类中与子类同名的方法(不推荐使用,此处写上是为了能看懂别人的代码)

Base关键字

:base调用基类的构造函数

这样是调用父类中第二个有参的构造函数,如果去掉Base默认调用无参构造函数

注意执行顺序是:先调用父类的构造函数,然后再执行子类自己的构造函数。 

第三章:访问修饰符 虚方法  静态 抽象类实现多态

访问修饰符

子类修饰符必须小于等于父类的修饰符

比如 父类(Person) 用 internal 子类(student)用public,会提示一下错误:

错误1可访问性不一致: 基类“ConsoleApplication2.Person”比类“ConsoleApplication2.Student”的可访问性低

虚方法

(多态)父类中虚方法virtual子类中重写,当父类型的子类(即Person类型的Student),使用该方法的时候,是每个子类不同的方法。比如people[i]数组是英国人,people 是父类,使用的方法就是英国人的方法

虚方法特点总结:

1>  虚方法在父类中必须有实现。

2>  子类继承父类后,可以选择对虚方法进行重写也可以选择不重写。

3>  当方法的标记是virtual或者override的时候都可以重写。

静态成员

内存中只存储一份,普通成员new一个多一份

不过,静态类到程序关闭才释放内存

静态类不用实例化对象,不用new,一般工具类用静态类,里面是静态方法

如 SQLHelper

抽象方法

1>  使用abstract关键字标记方法

2>  抽象方法在父类中不能有任何实现,所以抽象方法没有方法体。

3>  抽象成员必须写在抽象类中。

4>  抽象类是不能被实例化的。不能直接new一个抽象类的对象。

5>  抽象类中既可以有抽象成员,也可以有实例成员。

6>  抽象成员不能是私有的。

7>  子类继承抽象类后,对于抽象类中的抽象成员子类必须重写(因为父类中没有默认实现),除非子类也标记为abstract。

抽象方法和虚方法都可以实现多态,父类中需要默认实现的时候用虚方法,不需要用抽象方法,抽象方法不能被实例化

应用场景:在既需要统一的接口,又需要实例变量或缺省的方法的情况下,就可以使用它

https://blog.csdn.net/lamyuqingcsdn/article/details/50501871

小技巧

Shift+alt+f10 自动创建代码

当字母下方有小横杠的时候,证明编译器特别想告诉你什么,这是按Shift+alt+f10

第四章:字符串常用函数

第六节课,

课前疑点::base  简单工厂模式

字符串常用方法

视频12345主要是字符串的一些常用方法,百度一下了解即可

参考文档:http://www.cnblogs.com/xiaoshi657/p/4525124.html

简单工厂设计模式

返回类型是父类类型,在里面动态返回子类,         

private static JiSuanQi GetJiSuanObject(int n1, string czf, int n2)

        {

            JiSuanQi jsq = null;

            switch (czf)

            {

                case "+":

                    jsq = new Add(n1, n2);

                    break;

                case "-":

                    jsq = new Sub(n1, n2);

                    break;

                case "/":

                    jsq = new Div(n1, n2);

                    break;

            }

            return jsq;

        }
View Code

顺便说:

现在的程度理解:多态是 定义一个虚拟的或者抽象的父类  然后给不同的子类,(子类就是该父类的各种表现形态)

值类型和引用类型

栈类型比堆类型效率高

栈类型直接释放 缺点不能存储大小不规定的

堆类型需要调用垃圾回收

值类型进行赋值的时候是把数据拷贝了一个副本进行赋值,因为数据直接存储在栈中,所以把栈拷贝了一份即把数据拷贝了一份。

引用类型赋值,是把栈中的对象的地址拷贝了一份,因为栈中是存储的对象的地址,而对象的数据都存储在了堆中,所以引用类型赋值,只是把对象的地址赋值给了另外一个变量

值类型, 栈

Int   short  byte  char bool double float struct enum(枚举) decimal

引用类型,堆

string 数组 类 接口 委托

string s = "a";

 

第五章:接口 类型转换 异常处理 参数修饰符

接口

个人理解:接口也是父类,另一种形式的父类,可以多继承必须实现…..

用的时候,你定义一个接口,给你一个实现这个接口的子类就可以

 

class Program

    {

        static void Main(string[] args)

        {

            IUSB usb = new USBDisk();

            usb.Read();

            usb.Write();

            Console.ReadKey();

        }

}

public interface IUSB

    {

        void Read();

 

        void Write();

    }

 

    public class USBDisk : IUSB

    {

        public void Read()

        {

            Console.WriteLine("read......");

        }

        public void Write()

        {

            Console.WriteLine("write......");

        }

}
View Code

什么是接口

  1. 接口就是一种规范,协议(*),约定好遵守某种规范就可以写通用的代码。
  1. 定义了一组具有各种功能的方法。(只是一种能力,没有具体实现,像抽象方法一样,“光说不做”)

接口存在的意义:多态。多态的意义:程序可扩展性。最终→节省成本,提高效率。

接口解决了类的多继承的问题

接口解决了类继承以后体积庞大的问题。

先从语法角度看一下接口,与抽象类类似。

案例(继承了一个类,同时实现了其他接口)

鸟-麻雀sparrow['spærəu] ,鸵鸟ostrich['ɔstritʃ] ,企鹅penguin['pengwin] ,鹦鹉parrot['pærət]

鸟能飞,鸵鸟,企鹅不能。。。你怎么办

子类继承抽象类,实现接口,父类在最前边,接口在后边,接口可以多继承

接口中的成员必须不能有实现,接口不能实例化。

接口中的成员不能有访问修饰符,隐式公开public

接口中可以有属性、方法、索引器等(其实都是方法),但不能有字段

接口中的所有成员必须被子类中全部实现,除非子类是抽象类,把接口中的成员标记为抽象的。

总结:

目前学了 虚方法  抽象类  接口三个,都是为了实现多态!

虚方法有默认方法  抽象类  可以单继承没有默认方法,接口,可以多继承

类型转换

  1. 只有在内存存储上存在交集的类型之间才能进行隐式转换。(不是很理解)
  2. 不能用Cast转换string/int,只能用Convert。Convert.ToInt32/Convert.ToString

将字符串转换成“数值类型”(int、float、double):

  1. int.Parse(string str); 、int.TryParse(string str,out int n);//很常用,推荐。
  2. double.Parse(string str);、double.TryParse(string str,out double d);
  3. Parse()转换失败报异常,TryParse()转换失败不报异常。

再说as与直接类型转换:(*)

if(p is Student){ Student stu=(Student)p; }

  1. CLR会进行两次类型检查if(检查一次){ //再检查一次 }
  2. 通过GetType(),GetType()不允许重写。

Student stu=p as Student; //推荐,效率高于第一种,如果转换失败返回null,而不会报异常。

异常处理

一个 try后面可以跟多个catch

try

            {

            }

            catch (NullReferenceException ex)

            {

                Console.WriteLine(ex.Message);

            }

            catch (DivideByZeroException ex)

            {

                Console.WriteLine(ex.Message);

            }

            catch (Exception ex)

            {

                //throw抛出异常

                Console.WriteLine(ex.Message);

            }

            finally

            {

                //比如数据库、文件、画图等操作,无论如果都有必要用//finally释放资源   

                Console.WriteLine("这里是finally中的代码1!!!");

            }
View Code

力度小的放前面,力度大的放后面,如果Exception放最前边,后边放什么都没有意思了!都不执行了!

能不使用异常,尽量不要适用异常,效率不高

如果try内有return,先执行return前代码,然后执行finally,然后执行return。 

如果catch内有return,先执行异常前代码,然后catch内return前,然后finally,然后return

参数修饰符

可变参数  Params

有多个参数的时候,可变参数放在最后,不可以有两个params

可以直接传一个数值

Add(new int[]{1,2,3})

        static void Main(string[] args)

        {

            Add(1, 2, 3, 4, 5, 6, 76, 78, 8);

        }

static int Add(params int[] nums)

        {

            int sum = 0;

            for (int i = 0; i < nums.Length; i++)

            {

                sum += nums[i];

            }

            return sum;

        }
View Code

Ref out

ref表示参数传递时按引用传递。
例如,假如我要交换2个数。
void Swap(int a,int b) { int t=a; a=b; b=t; } 这样并不能完成交换。因为参数传递时默认按值来的。
改成void Swap(ref int a,ref int b) { int t=a; a=b; b=t; } 调用时:int a=3,b=5; Swap(ref a,ref b);
然后a,b的值就被交换了。
out表示参数是传出的。一般是用作函数返回多个值时使用。
例如:Int32的TryParse函数,它用作把一个对象转化为Int32类型。
string s="123"; Int32 a; bool canParse=Int32.TryParse(s,out a);
也就是说TryParse实际有2个返回值,一个在canParse里,是一个bool值,表示是否能够转换。
另一个返回值在a里,如果能转换,a就是转换后的结果。 

ref是按引用传递,传的是栈本身的地址

out与ref用于值类型的方法参数时:

out与ref基本上是一样的,是对变量的指针里面的内容进行操作。

Ref,在传入之前必须赋值,out 在方法内必须赋值,传入之前赋值与否无所谓,用不到

ref是    有进有出,而out是       只出不进。

第六章:StringBuilder 垃圾回收 ArrayList  Hashtable  List与Dictionary

StringBuilder

以后尽可能的用stringbuilder 效率高于Format/+=,在万奇的时候项目里面的都是SB.sppend(“”)

参考资料:https://bbs.csdn.net/topics/380232504

垃圾回收

值类型的变量在栈里不需要垃圾回收,用完就释放了!

只回收堆里面的内存资源!

GC.Collect();

手动调用效率不高

集合

ArrayList/list

Arraylist(非泛型集合)  list(泛型集合)  两个集合很像,不过强烈推荐使用list非必要不必使用arraylist(微软也是推荐使用list,因为在使用arraylist的时候需要解析引用,而list在创建的时候  默认已经解析) list效率比 arraylist高,省去了类型转换,list只能添固定类型。 Arraylist能做的list都能做   arraylist不能做的list也可以做

参考资料:

需要了解的方法

Add AddRange Remove RemoveAt Insert Sort

Reverse//反转  先用Sort排序然后Reverse反转,这样可以实现倒序

必须实现 IComparable接口

参考资料:

http://www.cnblogs.com/rickie/articles/67978.html  

ArrayList 中Add方法要的是obj;类型,所以什么都可以add

arrayList.Insert(0, ""); 把字符串插入到序列[0]

ArrayList arrList = new ArrayList() { 1, 2, 3, 4, 5, 6, "aaa", false, 99.9 };

arrList.RemoveAt(1);

arrList.RemoveAt(2);//这样 删除 1、2。不是以索引的形式删除

arraylist看到2  不过效果不是很好,下次从2的开头开始看吧

(4)Add、AddRange、Remove、RemoveAt、RemoveRange、Insert、InsertRange
    这几个方法比较类似
Add方法用于添加一个元素到当前列表的末尾
AddRange方法用于添加一批元素到当前列表的末尾
Remove方法用于删除一个元素,通过元素本身的引用来删除
RemoveAt方法用于删除一个元素,通过索引值来删除
RemoveRange用于删除一批元素,通过指定开始的索引和删除的数量来删除
Insert用于添加一个元素到指定位置,列表后面的元素依次往后移动
InsertRange用于从指定位置开始添加一批元素,列表后面的元素依次往后移动

Hashtable /Dictionary

区别在于hashtable非泛型  dictionary泛型,推荐使用dictionary 更常见些

参考资料:http://www.cnblogs.com/xiaoshi657/p/4579551.html

第七章:基础加强

装箱拆箱

装箱:把值类型转换为引用类型,就叫装箱。(没有父子关系不可能发生装箱拆箱)

拆箱:拆箱:把引用类型转换为值类型,就叫拆箱。

第九章:基础加强

序列化

序列化推荐newtonsoft

序列化是将对象转换成另一种格式(XML、json、二进制byte[])+

添加类库“system.Web.Extensions.dll”

如果进行二进制序列化,不要用自动属性,是把属性对应的字段名(自动生成的,且不固定)序列化!

XML、二进制序列化要加标记[Serializable]包括该类的父类

如果不像序列化某字段 需要加标记no….

参考资料:http://www.cnblogs.com/xiaoshi657/p/4590831.html

正则表达式

参考资料:http://www.cnblogs.com/xiaoshi657/p/4601047.html

其他

equals 可以从写

MVC

Aspx引擎 和razor引擎

Aspx: <%=%>

Razor:@  自己找闭合

路由:

解析地址 找到控制器  action

路由器规则如何制定

(packages:存放所有第三方库dll/js)

RouteDebug 路由调试利器,添加DLL添加引用即可

自定义路由器规则  顺序很重要,如果把首页放到最前面,永远访问的都是首页,其他的页面就访问不到了

MVC自带的校验

Model类中的代码

JQuery ajax

MVC自带的ajax

前台代码:

MVC  过滤器

 
 
 

原文地址:https://www.cnblogs.com/xiaoshi657/p/4556190.html