C# 第三天

原创 2015年11月19日 09:58:04

再次回顾一下静态成员可以直接调用而不用生成类(结构)的实例


静态构造函数:
编译器允许为一个不确定值的静态变量(需要外部输入或者数据库交互等)使用静态构造函数为其动态赋值。

一个类只可以有一个静态构造函数,也就是静态构造函数不能重载!
静态构造函数不允许有访问修饰符(查看CIL可以知道是private),不能接受任何参数!
静态构造函数在类加载的时候就运行,保证所有静态变量能够赋值,如果到时候仍然没有赋值,异常报错!


静态类:
静态类一般称作为工具类,不能用new创建,并且字段和成员必须都是static关键字。



OOP的支柱:封装、继承、多态


封装的作用:安全

继承的作用:代码重用
里氏替换原则:任何基类可以出现的地方,子类一定可以出现(is-a关系)。
如果可以使用组合,就不要使用继承
OOP中提供另一种代码重用:包含/委托(也就是has-a关系,或称聚合),其实就是字段就是一个类

多态的作用:多态
虚拟成员(virtual)定义默认实现的基类成员,可能被派生类改变(重写)
抽象成员(abstract)不提供默认实现的成员,但是提供签名,


封装:
为了便于记忆和查询,给出下面的图:

为了访问私有字段,除了使用传统的set、get,还提供了属性来实现:

class Car
    {
        private string name;

        public string Name
        {
            get { return name; }
            set { name = value; }
        }
    }

    class Program
    {
        public static void Main()
        {
            Car benz = new Car();
            Console.WriteLine("car name is:" + benz.Name);

            benz.Name = "Benz";
            Console.WriteLine("now car name is:" + benz.Name);
        }
    }

输出:

car name is:
now car name is:Benz

当然,我们还可以在set中添加各种各样的限制条件,保证数据的可靠性。这样为了代码的简洁性,我们可以把构造函数中的合法性也交到属性中。让属性完全的作为数据的R/W+valid。


自动属性:

public string Name{get;set;}

但是

由于私有的返回字段是在编译时创建的,所以不能使用字段初始化语法,而是用new关键字直接分配引用类型。这项工作必须在构造函数中执行,而不能是属性中的字段初始化。

 class Airplane
    {
        public string Name{set;get;}

        public Airplane()
        {
            Name = "CTRIP";
        }
    }

    class Car
    {
        //错误!plane是null,而不是Airplan的默认构造函数
        public Airplane plane { set; get; }

        public Car()
        {
            plane = new Airplane();
            //不在构造函数中new,会抛出异常
        }
    }

    class Program
    {
        public static void Main()
        {
            Car car = new Car();
            Console.WriteLine(car.plane.Name);
        }
    }

自动属性毕竟是为了方便,如果有大量逻辑问题还是建议使用默认的构造函数、额外函数、具体属性实现。

对象初始化:

 class Car
    {
        public string plane { set; get; }
    }

    class Program
    {
        public static void Main()
        {
            Car car = new Car {plane = "CTRIP" };
            Console.WriteLine(car.plane);
        }
    }

针对上一段代码中的问题,我们也可以这样初始化:

 Car car = new Car {plane = new Airplane() };

const,为了能有一种在运行时确定的常量,可以使用只读字段(区别只读属性)。


分部类型:
产品级的类非常长,而字段和属性一般是不变的,所以可以分开!
这里写图片描述

这里写图片描述

这里写图片描述
partial


多态:

成员投影:
如果派生类想要实现一个和基类一样的变量或者方法,有一下两种解决方案:
1.override
2.投影:

class Transportation
    {
        public void Run()
        { 
        ...
        }
    }

class Car:Transportation
    {
        public new void Run()
        {
        ...
        }
    }

基类派生类的转换:
object类,显示转换就行
显示强制转化是在运行时而不是编译时

考虑到可能是非法的转换,所以可以用关键字as检测

class Transportation 
    {

    }

    class Car:Transportation
    {

    }

    class Program
    {
        public static void Main()
        {
           object obj = new Car();
           Transportation car = obj as Transportation;
           if (car == null) Console.WriteLine("obj is not a transport!");
        }
    }

和as类似,is关键字可以检测兼容。






为了早日看完代码,只能按照项目需求study了,而不能是顺势顺序了。

版权声明:本文为博主原创文章,随便转载。

(转自博客园-雲霏霏)5天玩转C#并行和多线程编程 —— 第三天 认识和使用Task

多线程Thread与基于“任务的编程模型”的Task

深圳c#面试第三天 题目以及答案

c#笔试题
  • lzmings
  • lzmings
  • 2016年03月20日 15:29
  • 111

学习C#记录之第三天

今天是第三天,昨天去过光棍节了,==。所以学的东西比较少,今天要上学,不过还好下午和晚上没有课,昨天说到C#操作sqlite了。let's go on; 果然道路相当曲折,在使用system.dat...

c#第三天 三大循环语句和一维数组

循环结构----while 语法格式:while(条件判断){循环体;} 小案例:输出十句hello world int x=0;              while(x Console.Whit...
  • iwy_j
  • iwy_j
  • 2017年07月27日 17:53
  • 104

跟siki老师学C#第三天(下)

虽然是周末,学习还是不能停,美好的一天不能做几道练习题就糊弄过去了,接着往下学习。今天学习C#语句。 说到C#语句,我们就要先说流程控制。 什么是流程控制呢?流程控制就是我写出来的代码由我来决定它...

跟siki老师学C#第三天(上)

今天我们来接着学习C#,内容大概为:控制台接收数据,还有几道练习题。什么叫控制台接收数据? 我们回想一下第二天的学习内容中,我们要求得小明、小红、小刚三个人的总成绩和三门科目的平均成绩,那么他们的成...

C#基础加强第三天总结--集合与文件

集合与文件 1.    集合:List Dictionary     List一般用来存储,Dictionary一般用来查找          List                        ...

第三天 C#基础小结

今天主要复习了下C#基础知识,其实大多数都和C的结构化程序没什么不同,都是大同小异的,从一定的角度上也说明了程序设计语言是想通的。   C#基础知识小结:      1:C#只是一门编程语言,....
  • xfj66hh
  • xfj66hh
  • 2012年07月15日 23:55
  • 246

C# 基础学习第三天

C# 基础学习第三天 函数:      就是将一堆代码进行重用的一种机制,函数就是一段代码(这段代码可能有输入值,可能会返回值,一个函数就是专门做一件事的人) 我们调用函数执行一些事情,它可能需...

C#基础班第三天笔记(运算符)

1、类型如果相兼容的两个变量,可以使用自动类型转换或者强制类型转换, 但是,如果两个类型的变量不兼容,比如 string与int或者string 与double, 这个时候我们可以使用一个叫做Conv...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C# 第三天
举报原因:
原因补充:

(最多只允许输入30个字)