深入理解C#

简单认识.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();
}

 看到这里你明白了一点了没有,回想一下上面所写的,这是一个重复的事情,一遍不行就两遍,再教你个小方法,没事的时候你就想想你学了点什么,看看自己还记得多少,忘记的就去看看自己写的,好了接下来继续吧!

   第六章 初识继承和多态

   (1)

      继承的概念是什么呢?就是一个类可以继承另一个类的属性和方法(成员)

      继承是面向对象编程中的一个非常重要的特性。

      好了,废话不多说,下面切入正题:

     1.首先我们定义一个子类,给它创建两个构造:一个无参构造和一个有参构造

      定义一个枚举类

      在定义的子类中它有自己独有的属性:

  在定义的父类中的属性和构造:

  在Main方法中:

   同时要注意,在调用子类的带参构造时,我们要想到调用子类构造的时候,没有使用base关键字调用父类的指定的构造,默认调用父类的无参构造.

   补充一下:

   01.base代表父类对象,如果base():调用父类的构造函数

   02.base代表的是方法调用,是不需要参数类型的

  03.base(传参顺序和父类构造一致,变量名和子类构造参数一致)

(2)在这里补充一点访问修饰符

    我们所知道的:public  private  protected

    下面我画一个图来简单的描述一下(√表示可以,×表示不可以)

                  当前类     子类     其他类(Program)
   private         √          ×        ×
   protected     √          √        ×
   public           √          √        √

    总结:我们可以清晰的明白三种访问修饰符对类成员的访问限制强度:private>protected>public

 (3)new 子类底层原理图

   我简单的用一个图来描述一下:

  用文字描述:

      1.走到子类构造,不进入构造体
      2.转向父类,进入父类构造体执行
      3.转回子类构造,执行子类构造体
      4.转到Main,内存中构建出子类对象

  (4)继承还具有两大特性这个我们也不要忘记了,就是单根性和传递性

     单根性指的就是一个子类只有一个父类

     传递性就是只要跟父类有继承关系,就可以使用父类的属性和方法

  (5)接下来我们讲一讲多态

       1.多态是什么呢?字面上的意思就是多种形态

       用专业一点的话来说就是指同一个操作作用于不同的对象时,可以有不同的解释,产生不同的执行效果。

      我们所接触的方法重载也是多态的一种方式。

      如何实现多态呢?不要急下面我来解说

 (6)实现方法的重写

      在父类中定义的方法,用virtual关键字来定义为虚方法

     在子类中定义自己的方法,用override关键字来修饰,实现对父类的方法的重写

 (7)定义父类变量,用子类变量初始化父类变量

    下面来一个小案例:

 //创建一个Person父类

 public class Person
    {
       public virtual void SayHello()
       {

            //父类特有的方法
           Console.WriteLine("父类打招呼方法");
       }
    }

//创建一个Korea子类

public class Korea:Person  //在这里要注意它继承于Person类
    {
       public override void SayHello()
       {
           Console.WriteLine("金喜善打招呼方法");
       }
    }

//创建一个Chinese类

public class Chinese:Person //在这里要注意它继承于Person类

    {
       public override void SayHello()
       {
           Console.WriteLine("你好!");
       }
    }

//创建一个American类

public class American:Person   //在这里要注意它继承于Person类
    {
        public override void SayHello()
        {
            Console.WriteLine("Hello");
        }
    }

 前面我们也学过泛型了下面我们就用泛型来存储

            List<Person> list=new List<Person>();
            Chinese chinese=new Chinese();
            American usa=new American();
            Korea korea=new Korea();

            list.Add(chinese);
            list.Add(usa);
            list.Add(korea);

下面我们可以用foreach来遍历

方式一:

           foreach (Person person in list)
            {
               person.SayHello();
            }

方式二:

           foreach (Person person in list)
            {

               //方式二:不使用统一调用
                if (person is Chinese)
                {
                   Chinese chinese= person as Chinese;
                    chinese.SayHello();
                }

               if (person is Korea)
                {
                    Korea chinese= person as  Korea;
                    korea.SayHello();
                }

               if (person is  American)
                {
                    American chinese= person as  American;
                     american.SayHello();
                }

            }

下面我再穿插个示例:

  在Main方法中调用

  看过我文章的人应该知道,在这里我们又回顾了一下,你记住了吗?

深入理解多态

   (1)里氏替换

       定义:在一个软件系统中,如果子类替换父类出现的位置,而对整个软件系统功能没有影响

//交通工具类
public class TrafficTool
{
     public vartual void Run()
     {
         Console.WriteLine("车在行驶");
     }
}

//地铁类
public class Tube:TrafficTool
{
    public voerride void Run()
     {
       Console.WriteLine("地铁在行驶中");
     }
}

//小汽车类
public class Car:TrafficTool
{
   public voerride void Run()
   {
     Console.WriteLine("小汽车在行驶中");
    }
}

//自行车类
public class Bicycle:TrafficTool
{
   public override void Run()
   {
     Console.WriteLine("自行车在行驶中");
    }
}

//给Employee类添加GoHome()方法:搭乘交通工具回家
public class Employee
{
   //以父类类型作为参数
   public void GoHome(TrafficTool tool)
   {
     Console.WriteLine("员工"+Name);
     tool.Run();
    }
}

//测试Main()方法
static void Main(String[] args)
{
   SE ai=new SE("123","艾边成",25,Gender.male,100);
   SE joe=new SE("103","Joe",30,Gender.female,200);
   //实例化PM对象
   PM pm=new PM("890","盖茨",50,Gender.female,30);
   //定义员工集合
   List<Employee> list=new List<Employee>();
   list.Add(ai);
   list.Add(joe);
   list.Add(pm);
  //员工选择不同的交通工具回家:传递实际创建的子类对象
  list[0].GoHome(new Bicycle());
  list[1].GoHome(new Car());
  list[2].GoHome(new Tube());
  Console.ReadLine();
}

(2)抽象类和抽象方法

    定义:抽象方法是一个没有实现的方法,通过定义方法时增加的关键字abstract可以声明抽象方法

    语法:

      访问修饰符  abstract 返回类型 方法名();

     注意:抽象方法没有闭合的大括号,而是直接跟了一个分号;,也就是说它没有方法体。

    含有抽象方法的类必然是抽象类

    语法:

     访问修饰符  abstract class 类名{}

简单示例:
  public abstract class TrafficTool
  {
     public abstract void Run();
   }

 /// <summary>
    /// 父类  工作类
    /// </summary>
   public abstract class Job
    {
        //抽象方法
        public abstract void Show();
        //工作类型
        public string Type { get; set; }
        //工作名称
        public string Name { get; set; }
        //工作描述
        public string Describe { get; set; }
        //无参构造
        public Job()
        {

        }
        //带参构造
        public Job(string type,string name,string des)
        {
            this.Type = type;
            this.Name = name;
            this.Describe = des;
        }
    }

 public class Tests : Job
    {
        /// <summary>
        /// 子类  测试类
        /// </summary>

            //测试类的方法
        public override void Show()
        {
            FrmTests tt = new FrmTests();

            tt.Show();
            this.Num = Num;
            this.BugNum = BugNum;
            this.Time = Time;

        }
        //个数
        public int Num { get; set; }
        //bug数
        public int BugNum { get; set; }
        //时间
        public string Time { get; set; }
        //无参构造
        public Tests()
        {

        }
        //带参构造
        public Tests(string type,string name,string des):base(type,name,des)
        {

        }
    }

  总结:

   1.一个类用abstract修饰,就是抽象类

   2.抽象类不能实例化

   3.抽象方法不能有方法体连{}不能有

   4.抽象方法只能在抽象类中

   5.抽象方法存在的目的就是为了约束类中方法存在的形式(返回值类型和参数列表)

   6.抽象类不能是静态类和密封类

   7.抽象类中所有的抽象方法必须被子类重写,除非子类本身也是抽象类

   8.一键重写所有抽象方法的快捷键  Ctrl+.(无输入法情况下) Shift+Alt+F10

看完这章,你是不是觉得有收获?

 可扩展标记语言XML

  (1)HTML和XML

        HTML:Hyper Text Markup Language(超文本标记语言)

        XML:Extensible Markup Language(可扩展标记语言)

   (2)HTML和XML存储和展示的角度来说

       XML:侧重数据存储

       HTML:侧重数据显示

  (3)XML的注意点

      1.XML文件严格区分大小写

      2.XML文档只能有一个根节点

      3.XML文件的标签配对出现

      4.我们可以自定义XML文档中的标签 

 

时间: 2024-11-04 16:59:49

深入理解C#的相关文章

Python——深入理解urllib、urllib2及requests(requests不建议使用?)

深入理解urllib.urllib2及requests            python Python 是一种面向对象.解释型计算机程序设计语言,由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991年,Python 源代码同样遵循 GPL(GNU General Public License)协议[1] .Python语法简洁而清晰,具有丰富和强大的类库. urllib and urllib2 区别 urllib和urllib2模块都做与请求URL相关的操作,但

关于SVM数学细节逻辑的个人理解(三) :SMO算法理解

第三部分:SMO算法的个人理解 接下来的这部分我觉得是最难理解的?而且计算也是最难得,就是SMO算法. SMO算法就是帮助我们求解: s.t.   这个优化问题的. 虽然这个优化问题只剩下了α这一个变量,但是别忘了α是一个向量,有m个αi等着我们去优化,所以还是很麻烦,所以大神提出了SMO算法来解决这个优化问题. 关于SMO最好的资料还是论文<Sequential Minimal Optimization A Fast Algorithm for Training Support Vector

2.2 logistic回归损失函数(非常重要,深入理解)

上一节当中,为了能够训练logistic回归模型的参数w和b,需要定义一个成本函数 使用logistic回归训练的成本函数 为了让模型通过学习来调整参数,要给出一个含有m和训练样本的训练集 很自然的,希望通过训练集找到参数w和b,来得到自己得输出 对训练集当中的值进行预测,将他写成y^(I)我们希望他会接近于训练集当中的y^(i)的数值 现在来看一下损失函数或者叫做误差函数 他们可以用来衡量算法的运行情况 可以定义损失函数为y^和y的差,或者他们差的平方的一半,结果表明你可能这样做,但是实际当中

理解信息管理系统

1.信息与数据的区别是什么? 数据是记录客观事物,可鉴别的符号,而信息是具有关联性和目的性的结构化,组织化的数据.数据经过处理仍是数据,而信息经过加工可以形成知识.处理数据是为了便于更好的解释,只有经过解释,数据才有意义,才可以成为信息.可以说信息是经过加工以后,对客观世界产生影响的数据. 2.信息与知识的区别是什么? 信息是具有关联性和目的性的结构化,组织化的数据,知识是对信息的进一步加工和应用,是对事物内在规律和原理的认识.信息经过加工可以形成知识. 3.举一个同一主题不同级别的数据.信息.

深度理解div+css布局嵌套盒子

1. 网页布局概述 网页布局的概念是把即将出现在网页中的所有元素进行定位,而CSS网页排版技术有别于传统的网页排版方法,它将页面首先在整体上使用<div>标记进行分块,然后对每个快进行CSS定位以及设置显示效果,最后在每个块中添加相应的内容.利用CSS排版方法更容易地控制页面每个元素的效果,更新也更容易,甚至页面的拓扑结构也可以通过修改相应的CSS属性来重新定位.  2. 盒子模型 盒子模型是CSS控制页面元素的一个重要概念,只有掌握了盒子模型,才能让CSS很好地控制页面上每一个元素,达到我们

深入理解Java:类加载机制及反射

一.Java类加载机制 1.概述 Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获知Class的结构信息:如构造函数,属性和方法等,Java允许用户借由这个Class相关的元信息对象间接调用Class对象的功能. 虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 2.工作机制 类装载器就是寻找类的字节码文件,并构造出类在JVM内部表示

八幅漫画理解使用 JSON Web Token 设计单点登录系统

原文出处: John Wu 上次在<JSON Web Token – 在Web应用间安全地传递信息>中我提到了JSON Web Token可以用来设计单点登录系统.我尝试用八幅漫画先让大家理解如何设计正常的用户认证系统,然后再延伸到单点登录系统. 如果还没有阅读<JSON Web Token – 在Web应用间安全地传递信息>,我强烈建议你花十分钟阅读它,理解JWT的生成过程和原理. 用户认证八步走 所谓用户认证(Authentication),就是让用户登录,并且在接下来的一段时

谈谈你对Hibernate的理解

答: 1. 面向对象设计的软件内部运行过程可以理解成就是在不断创建各种新对象.建立对象之间的关系,调用对象的方法来改变各个对象的状态和对象消亡的过程,不管程序运行的过程和操作怎么样,本质上都是要得到一个结果,程序上一个时刻和下一个时刻的运行结果的差异就表现在内存中的对象状态发生了变化. 2.为了在关机和内存空间不够的状况下,保持程序的运行状态,需要将内存中的对象状态保存到持久化设备和从持久化设备中恢复出对象的状态,通常都是保存到关系数据库来保存大量对象信息.从Java程序的运行功能上来讲,保存对

IOS contentOffset该如何理解

contentOffset是哪个点??? 首先从字面理解:内容偏移 我可是查了词典的!!! 对于contentOffset有的时候我们会产生错误理解. 我不想在这里介绍错误的理解避免不必要的混淆. 我们什么时候会遇到contentOffset??? 更多的时候是在滚动试图中,我们可以通过它结合代理实现一些方法. 比如轮播(我会在下一篇介绍轮播的实现原理至于代码如果需要我可整理出来) 那么请让我通过图片演示来解释contentOffset. (一) 图一中绿色为屏幕也就是最大的显示范围也是滚动视图

如何理解“字符串是一组由16位组成的不可变的有序序列”

疑惑点: 1.16位 2.不可变 3.有序序列 解惑: 1.16位指的是:字符串每个字符所占用的空间为16bits 比特(2 bytes);这是因为JS采用的是unicode编码,每个字符需要2个字符. 2.不可变指的是: 字符串对象一旦创建出来,便不能被更改.这可能有些难理解,但事实确实如此.你可能会认为s+='1' 只是在 s 后面增加一个元素 1 而已,但事实是: 先将 s 拷贝一份,记为 temp 在 temp 末尾加上'1' 将 s 变量指向 temp,并删去原来的s 这一特性,可以从