Random类,DateTime类,String类API

 Random类

```C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _02_Random类
{
    internal class Program
    {
        static void Main(string[] args)
        {
            //Random 随机数

            //计算机中并没有随机这个概念,我们使用代码生成的随机,其实是计算机经过一系列算法,计算出大量的数字,从中一个一个给我们的(假随机\伪随机)

            //使用场景: 抽奖  点名 注册账号 唯一标识符....
            

            //C#中常用的生成随机的方式有三种


            //1. Random类,可以根据传入的一个种子,生成一系列的随机数队列,我们可以调用Next方法,获取这个队列的下一个随机数

            //1.1 创建一个随机数队列 并指定种子
            Random random = new Random(10);//指定种子为10

            //1.2获取随机数
            Console.WriteLine(random.Next());
            Console.WriteLine(random.Next());

            //可以给Next方法传递参数,指定随机数的范围
            Console.WriteLine(random.Next(2)); //小于指定值的非负整数  0 1
            Console.WriteLine(random.Next(10));//小于指定值的非负整数  0- 9
            Console.WriteLine(random.Next(10,15));//大于等于10 小于15的随机数

            //关于种子
            //计算机中的随机数,是根据一些算法计算出来的,随机数生成的算法需要一个初始向量,这个种子就是随机数生成的初始向量

            //比如: 我们给两个随机队列指定了相同的种子,.那么他们两个生成的随机队列也一定是相同的
            Random random2 = new Random(100);
            Random random3 = new Random(100);
            Console.WriteLine($"random2的随机数是{random2.Next()},random3的随机数是{random3.Next()}");
            Console.WriteLine($"random2的随机数是{random2.Next()},random3的随机数是{random3.Next()}");
            Console.WriteLine($"random2的随机数是{random2.Next()},random3的随机数是{random3.Next()}");


            //通常我们不会手动指定随机类的种子(不给他传递参数) C#会自动使用当前系统的时间作为种子

            //会生成10个相同的随机数,因为代码块的执行速度太快,导致这10个Random类使用相同的时间作为种子
            for (int i = 0; i < 10; i++)
            {
                Random random4 = new Random();
                Console.WriteLine(random4.Next());
            }

            //解决办法: 将Random类的创建写到循环的外部
            Random random5 = new Random();
            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine(random5.Next());
            }

            //--------------------------------了解-----------------------------

            //2.
            //GUID: 即Globally Unique Identifier(全球唯一标识符)
            //GUID的计算依赖当前的系统时间,计算机的硬件ID码等进行计算,生成128位随机数,无限接近于为唯一的输出

            //使用场景:生成产品秘钥  订单号  .....

            // GUID 的格式为“xxxxxxxx - xxxx - xxxx - xxxx - xxxxxxxxxxxx”,其中每个 x 是 0 - 9 或 a-f 范围内的一个32位十六进制数。例如:6F9619FF - 8B86 - D011 - B42D - 00C04FC964FF 即为有效的 GUID 值。

            //a27fc3ff-f785-4522-bced-7c0f24f0d0e8
            Console.WriteLine(Guid.NewGuid());


            // MD5

            // MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),是一种广泛应用的加密算法,被广泛用于确保数据的完整性和安全性。它是一种单向散列函数,在不可逆的情况下将任意长度的数据映射为128位的哈希值。当输入数据发生变化时,生成的哈希值也随之变化。相同的输入数据生成相同的哈希值,不同的输入数据生成不同的哈希值。作用是对一段信息(message)生成信息摘要(message - digest),该摘要对该信息具有唯一性,可以作为数字签名。用于验证文件的有效性(是否有丢失或损坏的数据),对用户密码的加密,在哈希函数中计算散列值


            //RNGCryptoServiceProvider rcsp = new RNGCryptoServiceProvider();

            //byte[] bytes =new byte[10];//创建一个字节数组,用于接收随机数,数字指定随机数的长度
            //rcsp.GetBytes(bytes);//生成随机数字符,并且填充到字符数组中

            //Console.WriteLine(BitConverter.ToString(bytes));//xx-xx-xx ...

        }
    }
}

```

## DateTime类

```C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace _03_DateTime类
{
    internal class Program
    {
        static void Main(string[] args)
        {
            //DateTime类 用来进行时间操作的
            //DateTime 类型的变量用于存储一个时间
            //DateTime.Now属性,用于获取当前系统时间
            DateTime time = DateTime.Now;
            Console.WriteLine(time);//2024/7/2 10:44:07

            //可以通过时间对象的属性获取时间的详情信息

            Console.WriteLine("年:" + time.Year);
            Console.WriteLine("月:" + time.Month);
            Console.WriteLine("日:" + time.Day);
            Console.WriteLine("时:" + time.Hour);
            Console.WriteLine("分:" + time.Minute);
            Console.WriteLine("秒:" + time.Second);
            Console.WriteLine("毫秒:" + time.Millisecond);
            //DayOfWeek 是一个枚举类型 0 表示周日  1表示周一  2表示周二.....
            Console.WriteLine("今天是周几:"+time.DayOfWeek);
            Console.WriteLine("今天是周几:" + (int)time.DayOfWeek);
            Console.WriteLine("今天是今年的第几天:" + time.DayOfYear);


            //把当前时间转为字符串类型  可以有不同的格式


            //2024/7/2   2024/07/02  2024-7-2.......


            Console.WriteLine(time.ToString());//2024/7/2 10:53:3

            //DateTime的ToString() 方法 可以传入一个参数 用于进行时间的格式化
            Console.WriteLine(time.ToString("G"));
            Console.WriteLine(time.ToString("s"));
            Console.WriteLine(time.ToString("d"));
            Console.WriteLine(time.ToString("D"));

            //格式化的时候 可以使用特殊的字母表示对应的时间

            //y 表示年份
            //M 表示月份
            // d dd 表示日
            // ddd dddd 表示周
            // h H表示小时
            // m 表示分钟
            // s表示秒
            // fff 表示毫秒

            Console.WriteLine(time.ToString("yy")); //24 年份的后两位
            Console.WriteLine(time.ToString("yyyy")); //2024 完整的年份
            Console.WriteLine(time.ToString("今年是yyyy年"));  //几年是2024年   可以和普通的字符串一起使用\


            Console.WriteLine(time.ToString("M")); //7月2日
            Console.WriteLine(time.ToString("MM"));
            Console.WriteLine(time.ToString("MMM"));
            Console.WriteLine(time.ToString("MMMM"));
            Console.WriteLine(time.ToString("d"));
            Console.WriteLine(time.ToString("dd"));
            Console.WriteLine(time.ToString("今天是d号"));

            Console.WriteLine(time.ToString("现在的小时是h"));//12小时制
            Console.WriteLine(time.ToString("现在的小时是H"));//24小时制


            Console.WriteLine(time.ToString("m"));
            Console.WriteLine(time.ToString("mm"));
            Console.WriteLine(time.ToString("s"));
            Console.WriteLine(time.ToString("ss"));
            Console.WriteLine(time.ToString("fff"));


            Console.WriteLine(time.ToString("ddd"));
            Console.WriteLine(time.ToString("dddd"));


            Console.WriteLine(time.ToString("今年是yyyy年MM月dd日HH时mm分ss秒,今天是dddd"));
            
            //时间戳

            DateTime dateTime = DateTime.Now;
            //是格林威治时间, 1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒) 起 到现在的总秒/毫秒数
            Console.WriteLine(new DateTimeOffset(dateTime).ToUnixTimeSeconds());//1719890001  秒戳
            Console.WriteLine(new DateTimeOffset(dateTime).ToUnixTimeMilliseconds());//1719890024999  毫秒戳


            //生成目标时间对象
            DateTime myTime = new DateTime(2003, 3, 11, 12, 34, 59);
            Console.WriteLine(myTime);//2003/3/11 12:34:59


            //while (true)
            //{
            //    Console.Clear();
            //    Console.WriteLine(DateTime.Now.ToString("今年是yyyy年MM月dd日HH时mm分ss秒,今天是dddd"));
            //    //让代码停止1秒 继续执行
            //    Thread.Sleep(1000);
            //}

        }
    }
}

```

## 时间的计算与对比

```C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _04_时间的计算与对比
{
    internal class Program
    {
        static void Main(string[] args)
        {
            //时间的操作

            DateTime dateTime = DateTime.Now;

            //可以通过调用时间对象的AddXXX() 方法,来修改时间对象中的年月日时分秒
            dateTime= dateTime.AddYears(1);
            dateTime= dateTime.AddMonths(3);
            dateTime = dateTime.AddYears(-60);
            Console.WriteLine(dateTime.ToString());

            //注意:AddXXX() 方法不一会直接修改时间对象  而是返回一个新的对象


            //如果需要时间的对比  可以直接使用 > < == >= <= 进行比较
            if (DateTime.Now<new DateTime(2008,1,1))
            {
                Console.WriteLine("今天是2008年之前");
            }
            else
            {
                Console.WriteLine("今天是2008年之后");
            }


            TimeSpan span=  new DateTime(2024, 10, 7) - DateTime.Now;
            Console.WriteLine($"到2026年1月1日还有{span.Days}天");

        }
    }
}

```

## String类API

```C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _05_String类API
{
    internal class Program
    {
        static void Main(string[] args)
        {

            //字符串的属性

            string a = "abcd";
            //1.可以通过索引获取字符串中某一个字符   索引 :从0开始编号
            // [0] 获取第一个字符  [1] 获取第二个字符............
            char c = a[0];
            Console.WriteLine(a[0]);

            //2.可以通过Length属性获取字符串的长度 字符串中字符个数
            Console.WriteLine(a.Length);


            //字符串内置了很多API(函数) 供我们灵活处理字符串


            string s1 = "abc";
            string s2 = "吴亦凡";
            string s3 = "123";
            //  string s4=s1+s2+s3;
 
            //1.Concat() 拼接字符串
            string s4 = string.Concat(s1, s2, s3);
            Console.WriteLine(s4);
            //2.Contains() 判断参数字符串是否出现在源字符串中
            bool b = s2.Contains("吴1");
            Console.WriteLine(b);


            //声明一个长度为10的字符数组
            char[] chars = new char[10];
            //3.CopyTo() 从字符串中复制一部分字符 放到一个字符数组中
            //被复制的字符串.CopyTo(被复制开始的索引,复制到的数组,从数组中第几个索引开始放,复制的个数)
            s2.CopyTo(1, chars, 0, 2);
            //将char类型的数组,转为字符串
            string charString =new string(chars);
            Console.WriteLine(charString);


            string name = "吴亦凡罗志祥";
            //4.StartsWith() 判断源字符串是否以参数字符串开头
            Console.WriteLine(name.StartsWith("吴"));
            Console.WriteLine(name.StartsWith("亦"));
            //5.EndsWith() 判断源字符串是否以参数字符串结尾
            Console.WriteLine(name.EndsWith("祥"));
            //6.Equals() 判断源字符串是否和参数字符串完全相同 等同于  ==
            Console.WriteLine(name.Equals(s2));


            string str1 = "ABCcabc123c";
            //7.IndexOf() 从前向后查询参数字符串首次在源字符串中出现的索引位置(如果查询不到则返回-1)
            Console.WriteLine(str1.IndexOf("a"));//3
            Console.WriteLine(str1.IndexOf("ab"));//3
            Console.WriteLine(str1.IndexOf("5"));//-1
            //StringComparison.OrdinalIgnoreCase 忽略大小写进行查询
            Console.WriteLine(str1.IndexOf("c",StringComparison.OrdinalIgnoreCase));//2

            Console.WriteLine(str1.IndexOf("c",5));//从5的位置开始查询
            Console.WriteLine(str1.IndexOf("B", 3));//-1 因为从3的位置开始查询,后面没有B


            //8.LastIndexOf() 从后向前查询参数字符串首次在源字符串中出现的索引位置(如果查询不到则返回-1)
            Console.WriteLine(str1.LastIndexOf("c"));
            Console.WriteLine(str1.LastIndexOf("c",8));//从索引为8的位置开始向前查询

            //9. IndexOfAny() 从前向后查询源字符串中首次出现的指定字符数组中任意一个字符的位置
            Console.WriteLine(str1.IndexOfAny(new char[] {'a','b','c' }));

            //10.LastIndexOfAny() 从后向前查询源字符串中首次出现的指定字符数组中任意一个字符的位置

            Console.WriteLine(str1.LastIndexOfAny(new char[] { 'a', 'b', 'c' }));

            // 11.Insert() 在指定的位置插入字符串 生成新的字符串
            Console.WriteLine(name.Insert(2,"老王"));

            string str2 = "";
            //12. IsNullOrEmpty() 判断变量是否为null或者Empty(空字符串)
            Console.WriteLine(string.IsNullOrEmpty(str2));


            char[] cs = new char[] { 'a', 'b', 'c' };
            string[] ss = new string[] { "aa", "bb", "cc" };

            //13.Join() 将字符数组或者字符串数组 按照给定的字符拼接成一个字符串
            //参数1:用什么字符来拼接
            //参数2:要拼接的数组
            Console.WriteLine(string.Join("#",cs));

            string str3 = "吴亦凡是劣迹那艺人";
            //14.Replace() 替换关键字
            Console.WriteLine(str3.Replace("吴","罗"));
            Console.WriteLine(str3.Replace("吴", "*"));
            Console.WriteLine(str3.Replace("吴亦凡", "***"));


            string str4 = "aBCD";
            //15.ToUpper() 将小写字符转换为大写字母
            Console.WriteLine(str4.ToUpper());
            //16.ToLower() 将大写字母转换为小写字母
            Console.WriteLine(str4.ToLower());

            //17.Remove() 删除
            Console.WriteLine(str3.Remove(6));//从索引5的位置开始,删除后面所有的字符串,返回删除后的字符串
            Console.WriteLine(str3.Remove(2,3));//从索引2的位置开始,删除后面3个字符,返回删除后的字符串


            string str5 = "吴亦凡,罗志祥,李云迪,李易峰";
            Console.WriteLine(str5.Split(','));

            string[] strArr = str5.Split(',');
            for (int i = 0; i < strArr.Length; i++)
            {
                Console.WriteLine(strArr[i]);
            }

            //19.ToCharArray 将字符串转换为字符数组
            char[] chars2=str5.ToCharArray();
            for (int i = 0; i < chars2.Length; i++)
            {
                Console.WriteLine(chars2[i]);
            }


            //SubString(4,3)  截取字符串   字符串.SubString(开始位置,长度);
            //移除当前字符串的前后空格符
            //字符串.Trim();        //同时移除前后字符串的空格
            //字符串.TrimStart();        //移除字符串前面的空格
            // 字符串.TrimEnd();        //移除字符串后面的空格


            //字符串
            Console.WriteLine("我是{0},今年{1}岁","名字",18);

            //字符串格式化
            //{数字} 表示后续的参数
            Console.WriteLine(string.Format("我是{0},今年{1}岁", "名字", 18));
            //也可以在{}中加上一些其他的字符{0,10} 表示此处至少占用10个字符的位置
            Console.WriteLine(string.Format("我是{0,10},今年{1}岁", "名字", 18));
            //Cn 一货币的格式显示 并保留n位小数
            Console.WriteLine(string.Format("我的银行卡{0:C3}", 3423423.34224234));
            Console.WriteLine(string.Format("我的银行卡{0:F3}", 3423423.34224234));

            //可以对时间进行格式化处理,用法和DateTime对象的ToString方法相同

            Console.WriteLine(string.Format("我是:{0},现在的时间是{1:yyyy年,MM月,dd日HH时mm分ss秒}","姓名",DateTime.Now));


        }
    }
}

```

## StringBuilder

1. String类型在C#中用于保存字符,为引用类型,一旦创建,就不能再进行修改,其底层是根据字符数组(char[])实现的
2. StringBuilder表示可变字符字符串类型,其中的字符可以被改变、增加、删除,当向一个已满的StringBuilder添加字符时,其会自动申请内存进行扩容

字符串一旦创建就不可修改大小,每次使用System.String类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间。在需要对字符串执行重复修改的情况下,与创建新的String对象相关的系统开销可能会非常昂贵。

所以对字符串添加或删除操作不频繁的话,就几个固定的string累加的时候就不需要StringBuilder了,毕竟StringBuilder的初始化也是需要时间的。对字符串添加或删除操作比较频繁的话那就用StringBuilder。

### 测试代码示例

以5万次循环来统计字符串连接方式,和StringBuilder方式那个耗时更高

```C#
//字符串连接方式
System.Diagnostics.Stopwatch stopwatch = new System.Diagnostics.Stopwatch();
            stopwatch.Start();
 
            string msg = string.Empty;
            for (int i = 0; i < 50000; i++)
            {
                msg += i.ToString();
            }
            //Console.WriteLine(msg);
 
            stopwatch.Stop();
            string res = string.Format("耗时:{0}分 {1}秒 {2}毫秒", stopwatch.Elapsed.Minutes, stopwatch.Elapsed.Seconds, stopwatch.Elapsed.Milliseconds);
            Console.WriteLine(res);
 
            Console.ReadKey();

//StringBuilder 方式
System.Diagnostics.Stopwatch stopwatch = new System.Diagnostics.Stopwatch();
            stopwatch.Start();
 
            StringBuilder sb = new StringBuilder(50000);
            for (int i = 0; i < 50000; i++)
            {
                sb.Append(i);
            }
            //Console.WriteLine(sb);
 
            stopwatch.Stop();
            string res = string.Format("耗时:{0}分 {1}秒 {2}毫秒", stopwatch.Elapsed.Minutes, stopwatch.Elapsed.Seconds, stopwatch.Elapsed.Milliseconds);
            Console.WriteLine(res);
 
            Console.ReadKey();
```

```C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _06_StringBuilder
{
    internal class Program
    {
        static void Main(string[] args)
        {


            //string s1 = "abc";
            //s1 += "a";
            //Console.WriteLine(s1);

            StringBuilder  aa = new StringBuilder();
            //Append 向StringBuilder内追加字符串
            aa.Append("hello");
            aa.Append("word");
            aa.Insert(4, "我是添加的字符串");
            Console.WriteLine(aa.Length);
            //参数1:开始删除的位置
            //参数2:要删除的长度
            aa.Remove(3,5);
            aa.Replace("h", "*");
        }
    }
}

```

## tryCatch

```C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _07_tryCatch
{
    internal class Program
    {
        static void Main(string[] args)
        {
        //代码中常见的错误分为两种


        //1.编译错误:编译不通过,编辑器中就已经出现了错误,运行不了,语法错误(少符号,多符号,中英文问题,类型错误......)
        //2.运行时错误:程序在运行期间错误,比如:格式转换出错,索引越界,对null进行操作......


        //InputNum:
        //Console.WriteLine("请输入一个整数");

        try 把可能出现错误的代码放到try中
        //try 
        //{
        //    string s = Console.ReadLine();
        //    int l = int.Parse(s);
        //    Console.WriteLine($"s的三次方是{Math.Pow(l, 3)}");
        //}catch (Exception e)//错误信息对象 里面有一个message属性,其中包含错误信息
        //{
        //    Console.WriteLine("代码报错了"+e.Message);
        //    goto  InputNum;
        //}


      
            Console.WriteLine("请输入一个整数");

            //try 把可能出现错误的代码放到try中
            try
            {
                string s = Console.ReadLine();
                int l = int.Parse(s);
                Console.WriteLine($"s的三次方是{Math.Pow(l, 3)}");
            }
            catch (FormatException)
            {
                Console.WriteLine("代码报错了,当格式无效时引发的异常。") ;

            }
            catch (OverflowException)
            {
                Console.WriteLine("代码报错了,当算术运算结果溢出范围时引发的异常。");

            }catch (Exception ex)
            {
                //抛出错误,用于使代码报错
                throw ex;
            }finally
            {
                Console.WriteLine("无论是否有错误都会执行");
            }

            //Console.WriteLine("后续的代码");
        }
        

       
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值