VR引擎程序设计基础1017apm

133 阅读7分钟

回顾

using System;
using System.Security.Cryptography.X509Certificates;

namespace ConsoleApp3
{
    class program
    {
        public class M //基类
        {
            //构造方法
            public M(int num)
            {
                num = num;
            }

            public M(int num, string v) : this(num)
            {
            }

            //字段
            public int num;  //如果没有赋值 一般默认值为0
            //属性
            public string str
            {
                get;set;//没有函数体的函数 相当于字段
            }
            static public int num2;
            //函数
            static public void getNum()
            {
                Console.WriteLine(num2);
            }
            public virtual void Show()
            {

                Console.WriteLine("父类");
            }

            //索引器...等等
            class M1 : M
            {
                public M1(int num,string str1):base(num)
                {
                    str1 = "1";
                }
                public string str;


                public override void Show()
                {
                    base.Show();
                    Console.WriteLine("子类");
                }
            }
        }
        //静态类中只能有静态成员,静态成员怎么访问?
        //类名.方法名()


        static void Main1(string[] args)
        {

            //面向对象  继承 多态  封装
            //多态 虚对象(在派生类中对基类中的函数进行重写) 隐藏方法  给基类中的函数加new
            M m1 = new M(1,"df");
            Console.WriteLine(m1. num);
            m1.str = "24";
            Console.WriteLine(m1.str);
            M m2 = new M1(1, "df");
            m2.Show();
        }

        private class M1 : M
        {
            public M1(int num, string v) : base(num, v)
            {
            }
        }
    }
}

接口

1.为什么需要接口

接口相当于是一个规范,接口可以实现多继承,接口指定- -组没有函数体的函数成员,也就是说只提供了一-些没有函数体的函数,具体怎么实现还要我们在自己的类中去实现。

2.接口的使用

1.接口中包含很多没有实现的函数成员,每个成员不需要设置访问修饰符,默认都是public公开

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1017am
{
    public class Animal
    {
        public void sleep()
        {
            Console.WriteLine("睡");
        }
    } 
    public interface Flyable
    {
        
        int num { get; set; }//里面的get,set实质上是没有函数体的函数
        void fly();//接口默认都是公开的
        void skating();

    }
    public interface Eat
    {
        void eat();
    }
    //一个接口去继承多个接口
    public interface SuperFace : Flyable, Eat{ }
    class Bird : Animal, Flyable//继承一个类 多个接口 类要写到最前面
    {
        public void eat()
        {
            Console.WriteLine("吃");
        }

        public int num1;
        public int num { get => num1; set { num1 = value; } }

        public void fly()
        {
            Console.WriteLine("飞1");
        }
        void Flyable.fly()
        {
            Console.WriteLine("飞2");
        }
        public void skating()
        {
            Console.WriteLine("滑");
        }

        
        


        internal class Program
        {
            static void Mian(string[] args)
            {
                //Flyable bird1 = new Bird();
                //bird1.fly();
                Bird bird1 = new Bird();
                bird1.fly();
                bird1.sleep();
            }
        }
    }
}


小文件操作

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

 public class 小文件操作
    {
        static void Main(string[] args)
        {
            //c#本质在学什么上各种类库的使用
            //File类 ,读写文件    整个文件信息一次性全部读取过来 一般读取小文件
            string str = File.ReadAllText("./1.TXT",Encoding.UTF8);//绝对路径  相对路径 一次性拿到文件中所有的文字
            Console.WriteLine(str);
            
        }
    }
}

读取所有行的信息

using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1017am
{
    public class 小文件操作
    {
        static void Main(string[] args)
        {
            //c#本质在学什么上各种类库的使用
            //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);//打印每一行的信息
            }
            
        }
    }
}

添加信息 两种 1.追加(在文件末尾添加新内容) 2.替换(默认)

using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1017am
{
    public class 小文件操作
    {
        static void Main(string[] args)
        {
            //c#本质在学什么上各种类库的使用
            //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);//打印每一行的信息
            }
            //添加信息 两种 1.追加(在文件末尾添加新内容) 2.替换(默认)
            File.WriteAllText("./1.TXT","替换的内容");
            string[] str3 = { "1", "2" }
;            File.AppendAllLines("./1.TXT",str3);//表示将数组中的字符串逐行追加到文件中
            File.AppendAllText("./1.TXT", "最追加的内容");
            Console.WriteLine(str);
        }
    }
}

image.png

image.png

泛型

namespace 泛型
{
    public class MyMath<T>//创建一个泛型类 ,T的类型由我创建的对象的时候决定
    {
        public T GetNum(T num1,T num2)
        {
            dynamic num3 = num1;//定义动态类型的变量 我们可以将泛型的值赋给动态类型的变量,就可以进行运算
            dynamic num4 = num2;
            return num3+num4;
        }
    }
    //集合类 列表,集合,栈,线性表
    //列表 之前学的数组,存在什么问题能够动态改变长度么?增删数组,长度会溢出
    
    internal class Program
    {
        static void Main(string[] args)
        {
            MyMath<string> math = new MyMath<string>();//这时候T类型为string类型
            Console.WriteLine(math.GetNum("sxwasefawr", "sxwasefawr"));
            MyMath<int> math2 = new MyMath<int>();//这时候T类型为int类型
            Console.WriteLine(math2.GetNum(123,345));

            //定义一个泛型列表
            List<int> list = new List<int>(4) { 132, 34, 56, 78 ,2};//元素长度 count 列表的容量capacity
            Console.WriteLine(list.Count);//没有值的话 元素个数为0
            Console.WriteLine(list.Capacity);//没有值的话 容量为0
            list.Add(1);
            int[] intArray = { 1, 23, 45, 56 };
            list.AddRange(intArray); //添加多个元素,使用数组的形式


            /* list.Add(45);
             Console.WriteLine(list[list.Count - 1]);//读取最后一个的值
             list.Insert(0,5);//在下标为0的位置插入一个5
             Console.WriteLine(list[0]);
             list.Remove(3);//直接填你要删除的元素
             list.RemoveAt(0);//填要删除元素的下标*/

            foreach (int i in list)
            {
                Console.WriteLine("元素{0}",i);
            }

image.png

集合类 字典 键和值

 Dictionary<string, string> dic = new Dictionary<string, string>();
            dic.Add("name", "怪怪");//前面表示键名后面表示值
            Dictionary<string, string> dic2 = new Dictionary<string, string>();
            dic.Add("name2", "怪怪2");//前面表示键名后面表示值
            dic.Concat(dic2);//合并两个
            foreach (string k in dic.Values)
            {
                Console.WriteLine("值为{0}",k);
            }
            foreach (string k in dic.Keys)
            {
                Console.WriteLine("键为{0}", k);
            }
            foreach(KeyValuePair<string,string> k in dic)//KeyValuePair表示键值对的类型
            {
                Console.WriteLine("键名为{0},值为{1}", k.Key, k.Value);
            }
            Console.WriteLine(dic.ContainsValue("怪怪"));

image.png

泛型 集合列表,字典 文件操作

有一个数组{1,3,4,6,77} 把奇数和偶数分别放到两个集合,然后再将集合合并

1.练习一:将一个数组中的奇数放到一一个集合中,再将偶数放到另一个集合中,最终将两个集合

 int[] intArray1 = { 1, 3, 45, 68, 90 };
            List<int> list1 = new List<int>();
            List<int> list2 = new List<int>();
            foreach(int i in intArray1)
            {
                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);
            }

image.png

2.练习二:使用字典的方式计算出任意字符串中每个字符出现的次数

string str1 = "mshdjrfidodkendh";
            Dictionary<char, int> dic3 = new Dictionary<char, int>();
            foreach(char i in str1)
            {
                if (dic3.ContainsKey(i))//判断字典dic3中有没有对应的键名
                {
                    dic3[i]++;
                }
                else
                {
                    dic3.Add(i,1);
                }
            }
            foreach(KeyValuePair<char, int> k in dic3)
            {
                Console.WriteLine("字符{0}出现的次数为{1}", k.Key, k.Value);
            }

image.png

一.大文件读取方式

1.FileStream文件流(操作字节可以读取各种文件信息)

 FileStream fsRead = new FileStream("./1.TXT", FileMode.OpenOrCreate, FileAccess.ReadWrite);
            //创建一个字节数组
            byte[] fsByte = new byte[1024*1024*4];//规定读取最大的字节长度
            //开始读取文件,读取完返回的是实际读取到的字节数
            int rNum = fsRead.Read(fsByte);
            //根据字节数,将读取到的字节转换成字符串
            string a = Encoding.Default.GetString(fsByte, 0, rNum);//18个字节 3个字节对应一个字符
            Console.WriteLine(a);

image.png

image.png

(1) FileStream文件流和File的区别

File在读取文件的时候是一-次性读取所有的文件信息, 而FileStream是以文件流的形式- -点点去读取文件的信息

(2)使用FileStream读取文件

 FileStream fsRead = new FileStream("./1.TXT", FileMode.OpenOrCreate, FileAccess.ReadWrite);
            //创建一个字节数组
            byte[] fsByte = new byte[1024*1024*4];//规定读取最大的字节长度
            //开始读取文件,读取完返回的是实际读取到的字节数
            int rNum = fsRead.Read(fsByte);
            //根据字节数,将读取到的字节转换成字符串
            string a = Encoding.Default.GetString(fsByte, 0, rNum);//18个字节 3个字节对应一个字符
            Console.WriteLine(a);
            fsRead.Close();//关闭文件流
            fsRead.Dispose();//释放所占资源

做一个练习 输入每一行的内容,逐行写入到2.TXT中直到遇到q结束


            StreamWriter fileWrite = new StreamWriter("./2.txt");
            while (true)
            {
                Console.WriteLine("请输入要存入的数字");
                string str = Console.ReadLine();
                int Qindex = str.IndexOf("q");
                if (Qindex != -1)
                {
                    //subString  字符串截取
                    str = str.Substring(0, Qindex);
                    fileWrite.WriteLine(str);
                    break;
                }
                else
                {

                    fileWrite.WriteLine(str);
                }
            }
            fileWrite.Close();

字符串的一些方法 LastIndexOF,IndexOF,SubString

compareTo()对比两个字符串是否相等

string compareStr1 = "1234";
            string compareStr2 = "1234";
            Console.WriteLine("对比结果{0}", compareStr1.CompareTo(compareStr2));//如果是相等的则为0,不等则为-1
            string Qstr = "123456";
            Qstr = Qstr.Substring(1, 4);//不包括2 从0开始截取总共截取4个  1234

image.png

StringBuilder,申请了一个动态内存空间

StringBuilder builderStr1 = new StringBuilder(4, 5);
            StringBuilder builderStr2 = new StringBuilder("asdfgh");
            builderStr1.Append("vb");//追加到最后
            builderStr1.Insert(0, "1");//在指定下标位置插入内容
            builderStr1.Remove(0,1);//从0 开始删除,删除一个字符
            builderStr1[0] = '2';
            Console.WriteLine(builderStr1);
            Console.WriteLine(builderStr1.Capacity);

image.png