写一篇文章 总结过去,从11年9月开始学习编程,选专业是因为喜欢玩电脑,在此之前对软件,硬件了解不多,有一个模糊的概念。因为看到,电视上那些程序员可以写出很厉害的程序,第一次觉得电脑很强大。最初对电脑有关的技术都有好奇心。
第一次看到代码,是高三的时候,同学在一个旧书店买了一个C语言程序设计,现在还记得,当时傻逼的拿笔记下了 Main()方法, 不知道什么是int,那个方法是输出两个变量的值。当时什么都不懂就抄了一遍,后来用塞班手机 下了一个python 编辑器 ,pirnt ‘hello world’ ,也什么都不懂。
高中和初中的时候什么英语单词都不认识几个也不想学,从初中到高中英语课不是睡过去就是发呆想其他的事。后来高考玩了,就随便选了个学校,专业是软件服务与外包(也不了解,只知道是要学写代码),后来到了学校,第一年主要学的是HTML CSS Java基础,用java写了“Hello World” ,当时上课也是对一些概念不懂,语法就记下来,只有少数几个知道意识, 我会的单词基本上就是从代码里学的几个。后来自己查查字典就记住了一些 。 第一年,主要是了解一下,上课学的也不好,记得学java的时候 不懂什么是类 什么是方法。
(后来查了金山词霸)class是类,method是方法 ,就是老师讲解我们就听听,记下来,后来忘记了很多。(学英语基本是高中以后,因为学编程,有时候也搜搜资料,上论坛看看,用google )
第一年的时候基本上是在寝室玩,学校有网,第一年是同学的电脑,后来是自己有了电脑,陆陆续续 会了点基础,用我们现在老师的话说 会用不知道原理。 不知到什么是API ( Application Programming Interface)学东西是通过 百度和谷歌 。 老师把一些基本的学习方法 。其他要靠自己学。当时学的时候一时一知半懂。
真正开始认真学习是12年开始的,当时多门挂科,感觉压力剧增,什么都是老师当时讲的时候会,过后就忘了。 就在网上下了一些视频。最开始的时候是 马士兵的Java视频,对编程也有了一定的认识,知道了如何查官方 API 知道了System 类型 Object类 所有了类继承,基础语法,面向对象,看了两个多月。悲剧的是我学Java的时候我们已经开始学 C#面向对象了,不过Java和C#的一些基础都差不多,还是学到了一些东西。
后来中间玩了一个月,有点厌学,学其他一些东西了( 批处理 、注册表、 灰鸽子怎么配置、web网站的渗透什么的、无线网络破解什么),学这个东西唯一的收获是 把Linux和python学好了, 为了破无线网 知道了BackTrack5 系统 一开始也不知道什么是Linux 什么都是百度 谷歌 ,勉强了解一些, 在网上找了一些基本命令 , 感觉和CMD差不多 ,也对命令行系统有一些了解,后来也是下了一些视频看 BackTrack基础讲解。
还有VPN 网络 通讯协议(TCP/UDP) 端口 (Socket),线程,进程,都是马士兵的视频里面讲的。
后来我们专业学ADO.Net 了(Connection、Command、ExectueReader),也学的不好不知道怎么写SqlHelper
我知道了我们以后都要学asp.net了 也是基础学的不好,很苦逼,我总是慢一点,当时刚刚把java基础学的差不多了,对asp.net一点也不了解一开始就是 拖控件,等到控件学完我也忘了。什么 Request,Response也不知道,对于Httl协议,最初是学HTMl的时候老师讲的那时候只是听了一下也没什么印象,不理解。后来看到了一些视频 了解一些了。
现在对于get post submit 提交 有了一些了解。现在是复 习以前学过的内容,加深印象和了解。
以前一直不知道MSDN怎么用,只知道JAVA的API 学英文也是用 一个中文的JDK文档和一个英文的对照着看会了一点。后来学的东西多了杂了 感觉都知道一点 都不精通(很苦恼)。
我的硬盘里面关于Java的视频, Python教程什么的。Linux也不研究了,也不找后台,其实一直想有个 webShell ,后来试了N多次,不能上传,只有放弃了,(最后只有在学校的机房里面开IIS 发布网站, 在里面留了一个上传控件,上传了一个aspx的文件)局域网了面试了一下什么是webShell,远程执行,查看文件都可以,就是一条可以执行存储过程的SQL语句 。关于注入,也找到过几个,搞的我现在看见网站就喜欢在地址栏后面 加个“,”或者是 and 1 =1 ,(强迫症了)。后来认真学了下 MSSQL 就发现原来在地址栏输一大堆SQL语句 ,就可以查东西了。 还有MD5算法对字符串加密解密。
其实我就是喜欢 收集、下载。下了也不学,知识还是不是我的,今年9月份来这里。没有网 所有就把电脑里面下的视频找出来看,看到了 。 发现我以前下的传智播客的视频。觉得不错就学学,后来一看就看上瘾了。基本课程都是看 杨中科讲 C#知识。
他说了一句话(学编程就想追女生,要专注行) 所以我就把其他一些乱七八糟的东西都删除了 只看 C# 只学一门语言,了解面向对象。 精力有限要合理分配,以前一直都没这个概念,什么都想学,什么都好奇。到头来什么都没有学会。
所以就开始从头学 这里做个总结,我要学的东西还很多:
学习编程为我打开了另一个世界,在编程中学习如何思考。以前是想学点东西找不到头绪,现在我已经知道自己要学什么了
基础知识 : .net是一个平台 C#是一门语言
.net可以开发 :
桌面程序、网站程序,游戏开发,嵌入式,移动设备(平板和手机)
主函数 、方法入口 static void Main(string[] args)
Static 关键字 (表示这是一个静态方法) void 返回值类型 (空)
挂号里面的是string类型数组参数
一、编译原理
1)编写源代码;
2)#编译器将C#源代码编译成MSIL;
3)将中间代码交给CLR的即时编译器(JIT)将微软中间语言转化成相对应 的机器码(CPU指令)
3)交给CPU运行机器码;
4)被CLR所管理的代码叫做托管代码,不能够被CLR管理的代码叫做非托管代码,非托管代码运行效率较高,但是相对安全性较低;托管代码运行效率较低,但代码相对是安全的;
二、变量
1. 常见的数据类型:int double float char string
2. 分值类型和引用类型
值类型存储于栈空间、值类型存储于堆空间
结构也是值类型。对象类型是引用类型,
Person p=New Person();
栈空间的p指向堆空间的一块内存存储(New Person())
二、运算符
=:赋值运算符
+-*/算术运算符
+:将左右两边的字符串连接起来
关系运算符:
> , < == , != ,>= , <= ,> <:
当运算两边的数值类型不一样时,将小范围的转换大范围再进行比较,仅限于数值类型之间的比较
关系运算符的比较结果永远只可能是bool类型的
逻辑运算符
|| (或), &&(与), !(非)
&& 运算中,只要有一个条件为假,整个结果为假 -----
|| 运算中,只要有一个条件为真,整个结果为真
! 取反
&、| 按位与和按位或 二进制 1110&0101 为0100
三、命名规则
1)变量命名必须有意义必须以字母或者_或者@开头,定义一个变量时首字母小写,定义变量要用动词
2)方法名大写
3)注释:给人看的,不是给编译器看的
3)文档注释的作用:当调用相对应的方法时给出智能提示
4)定义在方法里面的变量使用之前一定要先赋值
四、类型转换
Person p=new China(); //隐式类型转换
China c=new China();
Person p=(p)c; //显示类型转换
//把字符串转换为数值类型 int.Parse();
//把任意类型转换为字符串 ToString(); 如果是要转换一个对象类型的变量要重写ToString();
//把任意类型转换为任意类型 Conver.toXX();
引用类型 string 数组 类(只定义数据类型)、接口 、委托
引用类型都派生自 Object
引用类型可以继承
值类型继承 System.ValueType
System.ValueType继承 Object
面向对象编程(OOP→ Object-Oriented Programming)
OOA:面向对象分析
OOD:面向对象设计
面向对象三大特性:封装、继承、多态。
什么是类?什么是对象?类和对象的区别?如何写一个汽车类?
类是模具,创建对象的模具,抽象的。
类是一种数据类型,用户自定义的数据类型
类组成:字段、属性、方法、构造函数等
对象是具体的,是类的具体实例。对象具有属性(特征)和方法(行为)
类
在类中,用数据表示事物的状态,用函数实现事物的行为
字段 、 属性、 方法 、 构造函数
1、创建一个类的时候 如果没有写构造函数,默认会自动添加一个构造函数
如果声明了一个有參的构造函数 会把默认的构造函数覆盖掉
2、类的构造函数的特点
1)方法名必须与类同名
2)构造函数不能有任何返回值 void也不可以
3)访问修饰符一般都是 public
4)当类的构造函数 如果是 private\protected等的时候就不能在类外部, 所以就不能在类外部通过 new 关键字 来调用构造函数
添加引用(前提) 添加程序集
1.程序集是.net中的一个概念
2. *.dll 或 *.exe都叫程序集。
变量的作用域
离声明该变量最近的那对包含声明语句的大括号内部。
成员变量—直接属于某个类,作用域在该类内部。
局部变量—声明该变量的块语句或方法结束的封闭括号之前的作用域内(使用之前必须得赋值。)
封装 -----类和对象本身就是封装的体现。
1.属性封装了字段、
2.方法的多个参数封装成了一个对象
3.将一堆代码封装到了一个方法中、
4.将一些功能封装到了几个类中、
5.将一些具有相同功能的代码封装到了一个程序集中(dll、exe),并且对外提供统一的访问接口。(属性名、方法名等。)
继承 --(类与类之间的关系)
Base Class→基类、Parent Class→父类
Derived Class→派生类、Child Class→子类
判断继承关系是否合理 子类 is a 父类
代码重用
里氏替换原则
子类继承父类的属性和方法,使创建子类变得很简单,实现了代码重用、以及多态。
类的单根继承性、传递性、继承时构造函数的问题。构造函数不能被继承。
所有的类都直接或间接的继承自object。查看IL代码(通过Reflect)。
Protected 保护
子类和当前类内部可以访问
This
1.作为当前类的对象,可以调用类中的成员。this.成员(调用成员,自己)
2.调用本类的其他构造函数。:this()(调用构造函数,自己)
Base:
1.调用父类中的成员(调用成员,父类)base点不出子类独有成员。
2.调用父类中的构造函数(调用构造函数,父类)
子类构造函数必须指明调用父类哪个构造函数
//继承的时候,构造函数是不能被继承的。(构造函数不能被继承。)
私有成员不能被子类继承。
访问修饰符
private 当前类中可以访问,类中成员的默认访问修饰符。
protected 当前类及子类中可以访问(在继承中用。)
*internal 当前程序集内部可以访问
protected internal 当前程序集或子类中(不同程序集也可以访问)。
public 任何地方
多态
1)用父类对象 的变量 接收子类 对象类型的变量
2)虚方法和抽象方法的区别
虚方法必须有实现,抽象方法必须没有实现
抽象方法必须在抽象类中声明,虚方法可以出现在抽象类中
抽象方法必须在子类中重写,虚方法可以被重写
3)实现多态的主要手段:
1.虚方法virtual
2.抽象方法abstract
3.接口。
静态成员 静态类
1)当多个对象共享同一个数据的时候就可以在实例类中加入静态成员。
2)在项目中需要频繁用到的一些工具类,例如:Math、Console、Convert 等。 或者模拟“全局变量”的时候。
4)静态类不能被其他类继承
静态类只能继承自Object类。(静态类不能继承自其它类。)
继承(多态)、静态本身就是相反的。静态类的本质abstract+sealed
开放封闭原则(对修改封闭,对扩展开放。)
继承→ 虚方法→ 接口
在程序中实现多态(前提:继承),需要使用父类的实例时,使用虚方法 反之抽象类(同一系列),而当不同系列具有相同功能的时候实现多态就要用到接口--抽象共同功能
→原则:优先使用接口→抽象类→虚方法
→面向对象的核心:一个思想(实现多态) 一种方式(继承) 三个方针(虚方法、抽象类、接口)
枚举
定义一个枚举类型
public enum Color:byte //限制枚举了类型
{
Red,
Bloue,
Writh,
Black,
}
在编译的的时候还是值类型 只是方便使用
如何将一个字符串转换为枚举类型
string meiju="Red";
Color color=(Color)Enum.Parse(typeof(Color),meiju);
[Flags] 标志枚举加上这个特性后 枚举类型.ToString()返回的就是字符串了
集合
1.ArrayList 集合 弱类型
.Count属性 ,表示实际元素的个数
.Capacity属性 表示当前集合的容量
//.Capacity的容量衣每次翻倍扩展 4、6、8
Add() 添加元素
AddRange(Icollection c) 增加数组
Remove()
RemoveAt()根据索引删除
Clear() 清除
Contains() 判断当前元素中是否包含某个元素
ToArray()
Sort() 排序
Reverse() 反转
Ref和Out
ref 在方法中直接使用传进来的值,在原有的值的基础上进行修改
在传递进来之前必须赋初值
int>out在方法中必须赋值。
垃圾回收
CRL 的一个核心功能
垃圾回收 ,只能回收托管堆中的内存资源
(当对象没有变量指向的时候就可以被垃圾回收)
垃圾回收的分3代
共3代 :第0代、第1代、第2代。
概念,避免每次垃圾回收都遍历所有的对象,减少垃圾回收的时间
各代的回收频率:第0代最高,其次是第1代,再次是第2代。也就是说越老的对象生存的几率越大。
.net中垃圾回收的机制:mark-and-compact(标记和压缩)
除了内存资源外的其他资源怎么办?~(析构函数)或者Dispose()
要回收的类继承 IDisposeable
接口实现Dispose()方法
弱引用:WeakReference,对于创建比较耗时的对象可以使用弱引用。
泛型集合:
List<T>类似于ArrayList,ArrayList的升级版。
各种方法:Sort()、Max()、Min()、Sum()…
Dictionary<K,V>类似于Hashtable,Hashtable的升级版。
自定义泛型
泛型类、泛型接口、泛型方法、泛型委托(*)
(装箱、拆箱):box、unbox
//int n = 12;
//object o = n; //装箱
//int sa = (int)o; //拆箱
//Console.WriteLine(sa);
//int n1 = 14;
//string s = Convert.ToString(n1); //不是 只是传一个int返回一个string
//int n2 = int.Parse(s); //不是
int m = 21;
object obj = m;
//double dou = (double)obj; //装箱是什么类型,拆箱就必须是什么类型
double dou = (int)obj; //先拆箱再转换?
Console.WriteLine(dou);
//由于int32是结构、结构是值类型
//由于int32 还实现了IComparable 接口
//所以可以在Int32 与IComparable之间发生类型转换?
//由于接口是引用类型所以Int32到IComparable发生了装箱?
//Comparable到?Int32发生了拆箱?
int n2 = 10;
IComparable com = n2;
int m1 = (int)com;
Console.WriteLine(m1);
Forech原理
任何类型,只要想使用foreach 来实现遍历
就必须存在public IEnumerator GetEnumerator()方法
一般通过实现IEnumerator接口,来创建该方法
最后在编程的路上我还有很多东西要学,感谢我的老师对我的教育,和一直以来一起学习的同学。
我仅仅只是一个初学者。
时刻保持一个对于知识的好奇心。