C#学习笔记-面向对象基础-继承

命名空间

namespace
解决类的重名问题。可以看做的是类的“文件夹”。
如果命名空间缺失,可以选中类,用快捷键 alt+shift+F10,可以导入命名空间。

在一个项目中引用另一个项目的类

  • 添加引用
    这里写图片描述
  • 引用命名空间
    这里写图片描述

值类型与引用类型

区别

  • 值类型与引用类型在内存上存储的地方不一样
  • 传递方式不一样。值类型我们称之为值传递,引用类型我们称之为引用传递。
    值类型:int,double,bool,char,decimal,struct,enum
    引用类型:string,自定义类,数组
  • 存储:值类型的值是存储在内存的栈中,引用类型是存储在堆中。

字符串

  • 字符串的不可变性
    当程序结束的时候,GC扫描整个内存,只要发现某块区域没有任何指向,这块区域会被释放掉。

  • 我们可以将字符串看做是char类型的一个只读数组。不能被重新赋值。

stringbuilder

相比于string,对stringbuilder操作的时候,并不会一直新建内存,所以涉及到字符串改变的时候,可以用stringbuilder。

StringBuilder sb = new StringBuilder();
string str = null;
//创建了一个计时器,用来记录
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i < 100000; i++)
{
  sb.Append(i);
}
sw.Stop();
Console.WriteLine(sw.Elapsed);
Console.ReadKey();

字符串的一些方法

  1. Length:获得当前字符串中字符的个数;
  2. ToUpper():将字符串转换成大写类型;
  3. ToLower():将字符串转换成小写类型;
  4. Equals():比较两个字符串;
  5. Split():分割字符串,返货字符串类型的数组;
  6. substring():截取字符串。在截取的时候包含要截取的那个位置;
  7. Indexof():判断某个字符串在字符串中第一个出现的位置,如果没有返回-1,
  8. LastIndexof():判断某个字符串在字符串中最后一次出现的位置;
  9. startwith():判断以……开始;
  10. endwith():判断以……结束;
  11. Replace():将字符串中某个字符串替换成一个新的字符串;
  12. contains():判断某个字符串是否包含指定的字符串
  13. trim():去掉字符串中前后的空格
  14. trimend():去掉字符串中结尾的空格
  15. trimstart():去掉字符串中前面的空格
  16. string.isNullorempty():判断一个字符串是否为空或者为Null
  17. string.join():将数组按照指定的字符串连接,返回一个字符串
  18. new string(char[] chs)

如何将字符数组转换成字符串?
用string.join()的方法;

//接收用户输入的字符串,将其中的字符以与其输入相反的顺序输出。例如“abc"->"cba"
Console.WriteLine("请输入字符串:");
string str = Console.ReadLine();
char[] c = str.ToArray();
c = c.Reverse().ToArray();
str = string.Join("", c);
Console.WriteLine(str);
Console.ReadKey();·

如何读取一行一行读取文本文档?

             //文本文件中存储了多个文章标题、作者,标题和作者之间,用若干空格(数量不定)隔开,每行一个,标题有的长,有的短
            //输出到控制台的时候最多标题长度10,如果超过10,则截取长度9的字符串并且最后添加“……”,加一个竖线后输出作者名字
            int counter = 0;
            string line;

            //read the file and display it line by line
            System.IO.StreamReader file = new System.IO.StreamReader(@"C:\Users\lones\Desktop\C#Practise\第10天 继承\书名与作者.txt", Encoding.Default);
            string[] str = new string[2];
            int index;
            while ((line = file.ReadLine()) != null)
            {

                str = line.Split(' ');
                str[0] = str[0].Replace('《', ' ').Trim();
                str[0] = str[0].Replace('》', ' ').Trim();

                str[0]=str[0].Length > 10 ? str[0].Substring(0, 8) + "……" : str[0];
                Console.WriteLine(string.Join("|", str));
                counter++;
            }
            file.Close();
            Console.WriteLine("There are {0} lines.", counter);
            //suspend the screen
            Console.ReadLine();

继承

我们可能会在一些类中,写一些重复的成员,我们可以将这些重复的成员单独地封装到一个父类(基类),其他类作为这个类的子类(派生类)。

子类继承了父类,子类从父类中继承了什么?
首先:继承了父类的属性和方法,但是没有继承父类的私有字段;
子类并不继承父类的构造函数。但是子类会默认调用父类无参数的构造函数,创建父类对象,让子类可以使用父类中的成员。

如果在父类中重写一个有参数的构造函数之后,无参数的构造函数就被干掉了。子类调用不了。
解决办法:

  • 在父类中重写一个无参数的构造函数
  • 在子类中显示的调用父类的构造函数,也是我们比较常用的。用关键词base
    public class Person
    {
        private string _name;
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }

        private int _age;
        public int Age
        {
            get { return _age; }
            set { _age = value; }
        }

        private char _gender;
        public char Gender
        {
            get { return _gender; }
            set { _gender = value; }
        }

        public Person(string name,int age,char gender)
        {
            this.Name = name;
            this.Age = age;
            this.Gender = gender;
        }

        public void CHLSS()
        {
            Console.WriteLine("我是人,我会吃喝拉撒睡");
        }

    }
    //如何继承构造函数?
    public class Student : Person
    {
        private int _id;
        public int ID
        {
            get { return _id; }
            set { _id = value; }
        }

        public Student(string name,int age,char gender,int id):base(name,age,gender)
        {
            this.ID = id;
        }

继承的特性

  • 继承的单根性
  • 继承的传递性

new 关键字

  • 创建对象
  • 隐藏从父类那里继承过来的同名成员,隐藏的后果就是调用不到父类的成员

里氏转换

  • 子类可以赋值给父类
  • 如果父类中装的是子类对象,那么父类可以强转成子类
  • is: 表示类型转换,如果转换成功,返回true,如果转换失败,返回false
            Person p = new Student();
            if(p is Teacher)
            {
                Student s = (Student)(p);
                s.StudentSayHello();
            }
            else
            {
                Console.WriteLine("转换不成功!");
            }
            Console.ReadKey();
  • as:表示类型转换,如果能转换成功,则返回那个对象,如果不能转换,则返回Null;

访问修饰符protected

Arraylist 与 Hashtable

Var-推断类型

C#:强类型语言,在代码中对每个变量的类型必须要有一个明确的定义;
var:根据值可以推断类型。问题是:隐式变量必须初始化。用的时候必须赋值。
- 装箱:
- 开箱:

Path 类

File类

File类的基本方法

编码

将字符串以怎样的形式保存在二进制
乱码产生的原因,保存这个文件所用的编码与打开这个文件采用的编码方式不一样。
- ASC 128
- ASCII 256
- GB2312 简体字
- Big5 繁体字
- UNICODE 解析起来慢
- UTF-8 web

猜你喜欢

转载自blog.csdn.net/lonesome_zxq/article/details/81749783