c#第十二课

57 阅读4分钟

接口

接口定义了所有类继承接口时应遵循的语法合同。接口定义了语法合同  "是什么"  部分,派生类定义了语法合同  "怎么做"  部分。 接口定义了属性、方法和事件,这些都是接口的成员。接口只包含了成员的声明。成员的定义是派生类的责任。接口提供了派生类应遵循的标准结构。

//接口的声明
   public interface Eat
    {
        void eat();//默认都是公开的
    }
    
//实现接口
 public interface flyAble
    {
        int num { get; set; }//实质上set没有函数体的函数
        void fly();
        void skating();
    }
 class Bird :flyAbl  
 {
         private int num1;
        int flyAble.num { get => num1; set { num1 = value; } }
       public void fly()
        {
            Console.WriteLine("飞");
        }
           public void skating()
        {
            Console.WriteLine("滑行");
        }
 }
 //动物类
  public class Animal {
        public void sleep()
        {
            Console.WriteLine("睡觉");
        }
   }
 
 //一个接口继承多个接口
 public interface superface : flyAble, Eat{}
 //继承一个类和多个接口时,类放最前面
 class Bird :Animal,flyAble, Eat//继承一个类和多个接口时,类放最前面
    {
        private int num1;
        int flyAble.num { get => num1; set { num1 = value; } }

        public void fly()
        {
            Console.WriteLine("飞1");
        }

        void flyAble.fly()
        {
            Console.WriteLine("飞2");
        }
        public void skating()
        {
            Console.WriteLine("滑行");
        }
        void flyAble.skating()
        {
            Console.WriteLine("滑行");
        }
        void Eat.eat()
        {
            Console.WriteLine("吃");
        }
        public void eat()
        {
            Console.WriteLine("吃");
        }
    }

效果如下

image.png

小文件

file类,读写文件 整个文件信息一次性全部读取过来 一般读取小文件

string str= File.ReadAllText("./1.txt",Encoding.UTF8);//拿到所有文本信息
Console.WriteLine(str);
 //读取所有行信息
string[] strArray = File.ReadAllLines("./1.txt");
foreach (string i in strArray)
{
    Console.WriteLine("第i行:{0}",i);
}

//添加信息 两种 追加(在末尾添加内容) 
//整个替换(默认)
File.WriteAllText("./1.txt","替换的内容");
File.AppendAllText("./1.txt", "\n追加的内容");
string[] str3 = { "1","2"};
File.AppendAllLines("./1.txt", str3);//表示将数组中的字符串逐行追加到文件中

泛型

允许您延迟编写类或方法中的编程元素的数据类型的规范,直到实际在程序中使用它的时候。换句话说,泛型允许您编写一个可以与任何数据类型一起工作的类或方法。

//创建一个泛型类,T的类型由我创建的对象决定
  public class MyMath<T> {
        public T GetNum(T num1, T num2)
        {
            dynamic num3 = num1;//动态类型 可以将泛型的值赋给动态类型的变量,就可以进行运算
            dynamic num4 = num2;
            return num3 + num4;
        }
    }

MyMath<string> math = new MyMath<string>();//类型为string
MyMath<int> math2 = new MyMath<int>();//类型为int
Console.WriteLine(math.GetNum("asd", "asd"));//拼接
Console.WriteLine(math2.GetNum(112, 213));//相加

 //定义一个泛型列表
 List<int> list = new List<int>(4) { 3, 22, 21, 1, 2 };
 Console.WriteLine(list.Count());//元素的长度 Count 如果没有值得话,个数为0 容量也为0
 Console.WriteLine(list.Capacity);//列表容量
 list.Insert(0, 5);//在下标为0的位置插入5
 list.Remove(3);//删除元素3
 list.RemoveAt(0);//删除下标为0的元素
  foreach (int i in list)
  {
    Console.WriteLine(i);
  }
 
 //集合类 字典 键和值
 Dictionary<string, string> dic = new Dictionary<string, string>();
 dic.Add("name", "麻辣王子");//前面表示键名,后面表示值
 Dictionary<string, string> dic2 = new Dictionary<string, string>();
 dic2.Add("name2", "小明");
 dic= dic.Concat(dic2).ToDictionary(x=>x.Key,y=>y.Value);//合并两个字典
 foreach (string k in dic.Keys)//遍历所有的键名
 {
     Console.WriteLine("键为{0}",k);
 }
 foreach (string k in dic.Values)//遍历所有的键值
 {
     Console.WriteLine("值为{0}", k);
 } 
 foreach (KeyValuePair<string, string> k in dic)//KeyValuePair:键值对的类型  
 {
     Console.WriteLine("值为{0},键为{1}", k.Value,k.Key);
 }
 
 //判断列表是否包含值为麻辣王子,有返回true,无则返回false
  Console.WriteLine(dic.ContainsValue("麻辣王子"));//true
 
 //练习1
 int[] intArray = { 1, 2, 3, 4, 5, 6 };
 List<int> list1 = new List<int>();
 List<int> list2 = new List<int>();
 foreach (int i in intArray)
 {
     if (i%2!=0)
     {
         list1.Add(i);
     }
     else
     {
         list2.Add(i);
     }              
 }
 list1 = list1.Concat(list2).ToList();//合并list1和list2返回一个新列表
 foreach (int i in list1)
 {
     Console.WriteLine(i);
 }
 //结果为135246
 //练习2
 string str = "sadfvdaas";
 Dictionary<char, int> dic3 = new Dictionary<char, int>();
 foreach (char i in str)
 {
     if (dic3.ContainsKey(i))//判断字典是否有对应的键名
     {
         dic3[i]++;
     }
     else
     {
         dic3.Add(i,1);
     }
 }
 foreach (KeyValuePair<char, int> k in dic3)
 {
     Console.WriteLine("键名为{0},值为{1}",k.Key,k.Value);
 }
 
 //大文件读取方式 FileStream文件流 读取的是字节,可以读取所有文件
 FileStream fsRead = new FileStream("./1.txt",FileMode.OpenOrCreate,FileAccess.Read);
 //创建一个字节数组
 byte[] fsByte = new byte[1024*1024*4];//规定读取最大字节长度
 //开始读取文件,返回的是实际读取到的字节数
 int rNum = fsRead.Read(fsByte);        
 Console.WriteLine(rNum);
  //根据字节数,将读取的字节转化为字符串
  string a = Encoding.Default.GetString(fsByte,0,rNum);
  Console.WriteLine(a);
  fsRead.Close();//关闭文件流
  fsRead.Dispose();//释放资源
//写入 替换 追加
using (FileStream fdWrite = new FileStream("./1.txt", FileMode.Create,      FileAccess.Write))//FileMode.Append 追加,FileMode.Create替换
  {
      string b = "1234555555557";
      //将字符串转为字节
      byte[] fdByte = Encoding.UTF8.GetBytes(b); 
      fdWrite.Write(fdByte);//将文件信息追加到文件中
  }
   //读取的是字符串
  StreamReader fileRead = new StreamReader("./2.txt",Encoding.UTF8);
  string filestring = fileRead.ReadLine();// 读取每一行
  string allText = fileRead.ReadToEnd();//读取所有信息
   //char fileChar =(char) fileRead.Read();//读取一个字符
   Console.WriteLine(filestring);
   Console.WriteLine(allText);
   Console.WriteLine((char)fileRead.Read());
   Console.WriteLine((char)fileRead.Read());//逐个读取,返回该字符对应的十进制数,没有就返回-1
   fileRead.Close();////关闭文档流
   
   //写入信息
   StreamWriter fileWrite = new StreamWriter("./2.txt");
   fileWrite.WriteLine("第一行");//写入一行之后会默认加一行
   fileWrite.Write("不换行");//使用替换的形式写入一行
   fileWrite.WriteLine("第二行");
            
    //字符串  引用类型
    //stringBuilder,申请了一个动态内存空间
    StringBuilder builder1 = new StringBuilder(4,20);//基本容量 最大容量
    StringBuilder builder2 = new StringBuilder("asfdghj");
    builder1.Append("asdfd");//追加到最后
    builder1.Insert(0, "1");//在指定下标位置插入内容
    builder1.Remove(0,1);//从0开始删,长度为1
    builder1[0] = '2';

    Console.WriteLine(builder1);
    Console.WriteLine(builder1.Capacity);