接口
接口定义了所有类继承接口时应遵循的语法合同。接口定义了语法合同 "是什么" 部分,派生类定义了语法合同 "怎么做" 部分。 接口定义了属性、方法和事件,这些都是接口的成员。接口只包含了成员的声明。成员的定义是派生类的责任。接口提供了派生类应遵循的标准结构。
//接口的声明
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("吃");
}
}
效果如下
小文件
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);