第一章 简单认识.NET框架
(1)首先我们得知道 .NET框架具有两个主要组件:公共语言进行时CLR(Common Language Runtime)和框架类库FCL(Framework Class Library)
配图:

(2).NET的编译过程:
配图:

其中,CLR还包括通用类型系统CTS(Common Type System)和公共语言规范CLS(Common Language Specification)
(3).NET框架核心类库及其功能
配图:

(4)
C#语言要编程可以被CPU解析执行的代码需要两次编译:
第一次编译:将C#语言通过C#编译器编译成MSIL中间代码
第二次编译:将MSIL代码通过即时编译器(JIT)编译成CPU可以解析执行的代码,或者成为(平台专用代码)
Java程序想要被CPU解析执行也需要两次编译:
第一次编译:将后缀名为java的文件通过Java编译器编译成后缀名为.class(字节码)文件
第二次编译:将.class文件通过Java虚拟机(jvm)编译成CPU可以解析的代码
(5)面向对象
面向对象三大特性:封装,继承和多态
那些年我们学过的访问修饰符:
public :任何位置,包括跨程序集
internal:在当前程序集(项目)中都可以访问
private:只能在当前类中访问(当前类的花括号中访问)
protected:只能在当前类和子类中使用
(6)变量,类和方法的命名
骆驼命名法:第一个单词的首字母小写,后续有含义的单词首字母大写。 变量
帕斯卡命名法:每一个单词的首字母大写 类和方法
(7)new:代表的含义
1.创建对象
2.开辟空间
3.自动调用构造函数
(8)字段和属性的区别
1.属性不能保存数据,真正保存数据的是字段。
2.属性是可有可无的,字段是必须的。
3.如果字段只是让类内部访问,那么设置成private,如果想找一个中间者,在Main方法中访问到类中的私有字段,那么属性可以是一种选择。
(9)自动属性
定义:当为我们不需要进行逻辑判断时可以使用自动属性。 定义自动属性在后台会自动帮我们生成一个对应数据类型的私有字段
(10)CLR的主要用途:
CLR是所有.NET程序运行的环境,是所有.NET应用程序的编程基础,所有.NET受CLR监管和处理,这些操作包括进程内的应用程序加载,将IL转换为GG,
异常处理,垃圾回收,加载程序集
第二章 深入C#数据类型
(1)值类型和引用类型
值类型:是在栈上存储真实的值 引用类型:在栈和堆上都开辟空间
值类型:int double float boolean char byte long short 枚举(enum) 结构体(struct)
引用类型:int[] class 接口(interface) string
(2)结构
定义:
访问修饰符  struct  结构名
{
            // 结构体
 }
例:
public struct Student
{
      //结构体
}(2)注意点:
1.在结构中可以有字段和方法
2.定义结构时,结构中的字段不能被赋初值
3.可以不用new,直接定义结构的对象即可
4.声明结构的对象后,必须给结构的成员赋初值
5.结构体也是一种特殊的值类型
(3)装箱和拆箱
将值类型转换为引用类型的过程称为装箱,反之称为拆箱
示例:
static void Main(String[] args)
{
    int i=123;
    oject o=i;  //装箱
    i=456;   //改变i的内容
   Console.WriteLine("值类型的值:{0}",i); 
   Console.WriteLine("引用类型的值:{0}",o); 
}(4)不同类型的参数传递
值方式参数传递:传递数据类型是值类型,没有ref在方法中不会保留
传递数据类型是引用类型,没有ref在方法中会永久保留
引用方式传递:不管有没有ref都会永久保留
例:
 class Voter
{
   public void Vote(SE se)
   {
      //人气值+1
      se.Popularity++;
    }
}
/测试相关代码
SE  zhang=new SE();
zhang.Age=25;
zhang.Name="张梅";
zhang.Gender=Gender.female;
zhang.Popularity=10;
//投票前
MessageBox.Show(zhang.SayHi());
Voter voter=new Voter();
voter.Vote(zhang);  //引用类型做参数
//投票后
MessageBox.Show(zhang.SayHi());
   (5)结构和类的区别
1.结构是值类型而类是引用类型
2.结构和另外一个结构不能继承和被继承
3.结构没有默认构造而类有
4.结构体没有析构函数而类有
5.结构体可以不使用new初始化,而类不可以
第三章 使用集合组织相关数据
(1)定义:
集合:
某些特定的对象集中在一起就是集合
数组:
可以存储相同数据类型的一堆数据的容器
(2)集合
集合分为泛型集合和非泛型集合
泛型集合分为单列和双列集合 (List<T>和Dictionary<K,V>)
非泛型集合分为单列和双列集合 (ArrayList和HashTable)
(3)常用的方法和属性
 Add();   //添加
 Remove();  //删除
 RemobeAt(); //根据索引删除  不适用 双列集合 
 count  //集合存储元素的个数
 Contains();  //检测元素是否存在
 ContainsKey();  //
 ContainsValue();
 Capcity //集合占用空间注意事项:如果删除了集合中的某一个元素,那么集合的索引会自动维护
(4)遍历方案:
ArrayList list=new ArrayLIst();
Student stu1=new Student();
 stu1.Name="jiejie";
 stu1.Age=15;
 list.Add(stu1);
Student stu2=new Student();
 stu2.Name="jiji";
 stu2.Age=18;
 list.Add(stu2);
  //foreach
foreach(Student item in list)
{
    Console.WriteLine(item.Age+"\t"+item.Name);
}
 //for
for(int i=0;i<list.Count;i++)
{
   Console.WriteLine((Student)list[i].Name);
}HashTable 遍历三种方案
   HashTable table=new HashTable();
第一种方式:遍历所有的Keys
foreach(var item in table.Keys)
{
    //一个item代表一个key
   Console.WriteLine("key是{0}\tvalue是{1}",item,table[item]);
}
第二种遍历方式:遍历所有的value集合
foreach(var item in table.Values)
{
       //一个item代表一个value
   Console.WriteLine("value是{0}",item);
}
//遍历整个table
foreach(DictionaryEntry item in table)
{
    Console.WriteLine("key是{0}\tvalue是{1}",item.Key,item.Value);
}第四章 深入类的方法
(1)构造函数
方法名和类名相同,没有返回值
注意:在C#中,当我们定义了一个类后,系统底层默认会生成一个和类名相同的无参构造,但是如果我们定义了一个带参构造,系统将不生成无参构造,但是在
真正的开发中建议大家定义两个构造函数,一个无参构造和带参构造
public class SE
{
 public SE()
{
}
public SE(string id,string name,int age,Gender gender,int popularity)
{
   Id=id;
   Name=name;
   Age=age;
   Gender=gender;
   Popularity=popularity;
}
}(2)方法的重载
在同一个类中,如果有多个方法方法名相同,但是参数的个数,顺序,类型不同的多个方法可以构成重载和方法的返回值类型没有关系。
public void Say(string name,int age)
{
}
public void Say(int age,string name)
{
}(3)对象间的交互
//遥控器类
public class RemoteControl
{
  //开机
  public void TurnOn(Tv tv)
   {
     tv.Open();  //调用电视机对象的开机方法
   }
  //关机
  public void TurnOff(Tv tv)
  {
    tv.TrunOff();
  }
   //换台
  public void ChangeChannel(Tv tv)
   {
       Console.WriteLine("请输入频道:");
       string ChannelNo=Console.ReadLine();
       tv.Change(ChannelNo);
   }
//电视机类
public class Tv
{
  public boolean isOn=false; //是否开机
  //打开电视机
  public void Open()
  {
   if(isOn)
   {
      Console.WriteLine("电视机已打开");
   }
   else
    {
       Console.WriteLine("成功打开电视机");
        isOm=true;
     }
  }
  //关机
  public void TurnOff()
   {
     if(isOn)
      {
        Console.WrteLine("电视机正在关机");
        isOn=false;
      }
     else
     {
       Console.WriteLine("电视机已关闭");
     }
   }
  //换台
  public void Change(string channelNo)
   {
     if(isOn)
     {
       Console.WriteLine("正在切到{0}台",channelNo);
    }
    }
//测试Main()方法
 static void Main(String[] args)
 {
   RemoteControl controler=new RemoteControl();
   Tv tv=new Tv();
   //开机
   controler.TurnOn(tv);
    //切换频道
   controler.ChangChannel(tv);
   //关机
   controler.TurnOff(tv);
    Console.ReadLine();
}