黑马C#笔记03:常量,枚举,结构,数组,函数/方法,参数out/ref/param,重载,递归,类和对象,属性,静态/非静态,构造,析构,命名空间,值类型引用类型,字符串,StringBuilder

 

亲情奉献全套精品.Net基础视频教程(1-9)2168:36 亲情奉献全套精品.Net基础视频教程(1-9)

-------------------------------------
https://www.bilibili.com/video/av8915750?p=64

常量

参见https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/classes-and-structs/constants(微软官方)和https://www.runoob.com/csharp/csharp-constants.html

语法:

const <data_type> <constant_name> = value;

示例:

const double PI = 3.14159265;//定义圆周率常量
double r = 10;//半径
double c = 2 * PI * r;//求周长
Console.WriteLine("圆的周长为" + c);

枚举

参见https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/builtin-types/enum(微软官方)和https://www.runoob.com/csharp/csharp-enum.html

语法:

enum <enum_name>
{ 
    enumeration list 
};

例如:

enum Days { Sun, Mon, tue, Wed, thu, Fri, Sat };

示例-性别枚举:

枚举和string,int之间的转换

枚举转整型

整型转枚举

枚举转字符串

字符串转枚举

使用Enum.Parse方法将字符串转换为枚举(Enum.Parse方法参见https://docs.microsoft.com/zh-cn/dotnet/api/system.enum.parse)
注意Enum.Parse返回的类型是object,还需要转换为指定Enum类型:

Enum.Parse转换时:
I.文本字符串必须在枚举值字符串中存在,否则会抛出异常(例如将"EightDay"转换为Day型枚举--可Day型枚举值中并没有EightDay--则会抛出异常);

II.数值字符串如果超出枚举值,则保留该数值(例如将"100"转换为Day型枚举,虽然100在枚举值中并不存在,但仍可转换且转换后值为100)

练习:

结构

参见https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/struct(微软官方)或https://www.runoob.com/csharp/csharp-struct.html

struct 类型是一种值类型,通常用来封装小型相关变量组,例如,矩形的坐标或库存商品的特征。 下面的示例显示了一个简单的结构声明:

public struct Book
{
    public decimal price;
    public string title;
    public string author;
}

 示例-简单使用枚举

namespace App005_常量_枚举_结构 {
    public enum Gender {//定义性别常量类型
        Unknown,
        Male,
        Female
    }    
    public struct Person {
        public string Name;//名字
        public int Age;//年龄
        public Gender Gender;//性别
    }
    class Program {
        static void Main(string[] args) {
            Person boy;
            boy.Name = "李少白";
            boy.Age = 17;
            boy.Gender = Gender.Male;

            Console.ReadKey();
        }
    }
}

数组

数组是一种数据结构,其中包含许多通过计算索引访问的变量。 数组中的变量(亦称为数组的元素)均为同一种类型,我们将这种类型称为数组的元素类型

参见https://docs.microsoft.com/zh-cn/dotnet/csharp/tour-of-csharp/arrayshttps://www.runoob.com/csharp/csharp-array.html

声明数组

声明数组的几种方法:

            //声明数组的几种方法
            int[] arr = new int[10];
            int[] arr2 = {11,12,21,2,3,55,3,3};
            int[] arr3 = new int[5]{ 11, 12, 21, 2, 3};
            int[] arr4 = new int[] { 1, 2, 3, 4, 5 };

以下示例创建 int 元素数组,初始化此数组,然后打印输出此数组的内容:

using System;
class ArrayExample
{
    static void Main() 
    {
        int[] a = new int[10];
        for (int i = 0; i < a.Length; i++) 
        {
            a[i] = i * i;
        }
        for (int i = 0; i < a.Length; i++) 
        {
            Console.WriteLine($"a[{i}] = {a[i]}");
        }
    }
}

示例-求数组的最大值 最小值 总和 平均值:

数组排序

Array.Sort方法:按顺序从小到大排序 参见https://docs.microsoft.com/zh-cn/dotnet/api/system.array.sort
Array.Reverse:反转排序(注意不是逆序排序) 参见https://docs.microsoft.com/zh-cn/dotnet/api/system.array.reverse

函数/方法


方法/函数参数

out参数/输出参数

示例-使用out参数获取数组中的最小值和最大值:

    class Program {
        static void Main(string[] args) {
            int[] arr = {312,165,123,132,1254,132,132,5,16532,65 };
            int max, min;
            GetMinMaxOfArray(arr,out min,out max);
            Console.WriteLine("数组中最小值 = {0}; 最大值 = {1}",min,max);            
        }
        /// <summary>
        /// 求数组中的最大数,最小数
        /// </summary>
        /// <param name="arr">需要求最大最小值的数组</param>
        /// <param name="min">返回数组的最小值</param>
        /// <param name="max">返回数组的最大值</param>
        public static void GetMinMaxOfArray(int[] arr, out int min, out int max) {
            min = arr[0];
            max = arr[0];
            for (int i = 0; i < arr.Length; i++) {
                if (arr[i] < min) {
                    min = arr[i];
                }
                if (arr[i] > max) {
                    max = arr[i];
                }
            }
        }
    }

ref参数/引用参数(按引用传递参数)

示例-使用ref参数交换变量值:

class NumberManipulator
   {
      public void swap(ref int x, ref int y)//交换x,y值
      {
         int temp;
         
         temp = x; 
         x = y;    
         y = temp; 
      }
      
      static void Main(string[] args)
      {
         NumberManipulator n = new NumberManipulator();

         int a = 100;
         int b = 200;

         n.swap(ref a, ref b);
         
         Console.WriteLine("a 的值: {0}", a);
         Console.WriteLine("b 的值: {0}", b);
         
         Console.ReadLine();
      }
   }

Params可变参数(参数数组)

使用params可变参数可以不必限制住参数个数.

示例-求不定个数的数字之和:

注意:params可变参数(参数数组)必须是方法的最后1个参数.

方法重载

示例-利用重载方法求2个变量相加:

递归

*重载和递归可参考原来的笔记https://blog.csdn.net/ishenjiaming/article/details/99619637

类和对象

*可参考原来的笔记https://blog.csdn.net/ishenjiaming/article/details/99545219https://blog.csdn.net/ishenjiaming/article/details/103639471

示例-类和对象简单例子:

   class 人类 {
        public string 姓名;
        public int 年龄;
        public string 性别;

        public void 自我介绍() {
            Console.WriteLine("我是{0},今年{1}岁,性别{2}.",姓名,年龄,性别);
        }
    class Program {
        static void Main(string[] args) {
            人类 路人甲 = new 人类();

            路人甲.姓名 = "葫芦娃的爷爷";
            路人甲.年龄 = 88;
            路人甲.性别 = "男";

            路人甲.自我介绍();

            Console.ReadKey();
        }
    }

结果显示

我是葫芦娃的爷爷,今年88岁,性别男.

属性

属性可用于数据校验,判断合法或非法.

示例-属性简单例子:


静态与非静态

视频https://www.bilibili.com/video/av8915750?p=102

*可参考之前的笔记https://blog.csdn.net/ishenjiaming/article/details/99675080(学蓝鸥C#笔记)和https://blog.csdn.net/ishenjiaming/article/details/103639471(Unity学习笔记)

构造函数

*参见笔记https://blog.csdn.net/ishenjiaming/article/details/99619637(学蓝鸥C#笔记)

视频https://www.bilibili.com/video/av8915750?p=103

重载构造函数

使用this让构造函数调用其他构造函数

可以节约冗余代码.如下:


例子详见https://blog.csdn.net/ishenjiaming/article/details/103639471(unity学习笔记)

析构函数

详见https://blog.csdn.net/ishenjiaming/article/details/99619637(学蓝鸥C#笔记)

命名空间

方法如下图所示:


值类型和引用类型

值类型(栈中):变量本身在栈中,值(数据)在栈中
引用类型(堆中):变量本身在栈中,变量的值存储实际数据的内存地址(引用),内存地址(引用)的值即实际数据存在堆中.

二者之间最大的区别
值类型变量有两个元素:变量本身,变量的值:数据;
引用类型变量有三个元素:变量本身,变量的值:内存地址(引用);内存地址的值:数据

*详见https://blog.csdn.net/ishenjiaming/article/details/103609679(Unity学习笔记)和https://blog.csdn.net/ishenjiaming/article/details/99545219(学蓝鸥C#笔记)

字符串

字符串的不可变性

字符串生成后,其值不可改变!给字符串变量赋新值,实质上是在内存中生成1个新字符串,而老的字符串仍旧在内存中,并没有销毁[直到GC销毁它--通常是程序结束].

字符串相当于一个只读char数组,可以通过下标访问数组元素,如下:

字符串和char数组的转换

如果想改变字符串中某个字符,需要先转换为1个新的char数组,然后改变其中元素;再将改变后的char数组转化为字符串,如下:

StringBuilder

可用于大量字符串频繁,高速拼接等操作.

*参见https://blog.csdn.net/ishenjiaming/article/details/103609679(Unity学习笔记)

假如需要拼接字符串十万次,耗费的时间.如下:

使用StringBuilder拼接字符串十万次耗费的时间如下:

我们发现二者耗费的时间不在同一数量级上!

最后,StringBuilder拼接字符串完成后,我们仍应该将其转化为字符串,所以最后须加上:

Console.WriteLine(sb.ToString());

二者有如此显著不同是因为前者制造了十万个字符串,而后者StringBuilder前前后后(理论上理想状态)只操作一个字符串.

String常用方法

关于英文大小写的

如下,输入两个课程英文名称,比较的时候将忽略大小写:

分割字符串

如下,分割字符串:

再来1个例子:

字符串函数详解

示例-以下代码屏蔽关键词"老赵",以*号代替:

示例-Substring取子字符串:从Strart索引开始[到End索引结束]:  //[...]代表参数可存在亦可不存在
注意第一个索引从0开始:

以上代码取原字符串的第1号索引至第2号索引结束的子字符串,即"天天".

以下代码演示Stratswith和Endswith方法:

以下代码演示IndexOf方法,找到返回索引值(注意第一个索引值从0号索引开始),找不到则返回-1:

可以指定从第几号索引开始寻找,下例从源字符串第2号索引字符开始查找:

以下代码演示LastIndexOf方法,它是从字符串末尾开始寻找:

以下代码根据全路径字符串获取文件名: "苍老师苍.wav":

首先找到最后1个"\"(代码使用"\\"因为\\代表\);最后截取最后1个\后面的字符串,即"苍老师苍.wav"

Trim去掉前后空格(注意不是所有空格);TrimStart去掉前面所有空格;TrimEnd去掉后边所有空格.示例如下:

IsNullOrEmpty判断字符串是否为null或空:

Join方法可以添加分隔符:

字符串方法总结

练习


-------------------

----------------

思路:使用split方法得到每行的2个字符串:书名和作者;之后再判断书名是否超10个字符,超过则取前8个加"...";最后加个竖线再加作者名得到新字符串.

--------------

第二种方法如下.缺点是只能找单个字符而不能找多个字符组成的词:


 

大文件拷贝实例源码,学习关于IO文件流、多线程相关使用做参考。 private void button4_Click(object sender, EventArgs e) { this.progressBar1.Value = 0; this.label1.Text = "0%"; if (!File.Exists(this.textBox1.Text)) { MessageBox.Show("找不到目标文件!"); return; } if (!Directory.Exists(this.textBox2.Text)) { MessageBox.Show("请选择有效的保存路径!"); return; } string fileRead = this.textBox1.Text; string fileSave = Path.Combine(this.textBox2.Text, _fileName); System.Threading.ThreadPool.QueueUserWorkItem((o) => { using (IDisposable file = new FileStream(fileRead, FileMode.Open, FileAccess.Read), fileWrite = new FileStream(fileSave, FileMode.Create, FileAccess.Write)) { int count = 0; long fileLength =((FileStream)file).Length; //目标文件大小 //根据目标文件大小创建byte数组长度 byte[] data = new byte[fileLength > 1024 * 1024 * 30 ? 1024 * 1024 * 30 : fileLength]; //30M 1024 * 1024 * 30 int step = (int)Math.Ceiling(fileLength * 1.0 / data.Length); //分流段数 double n = (100 * 1.0 / step); //每次进度条累加 double m = 0; //累加统计 int spam = 1; //时间间隔 double speed = 0; //拷贝速度 do { DateTime time = DateTime.Now; //文件流操作 count = ((FileStream)file).Read(data, 0, data.Length); ((FileStream)fileWrite).Write(data, 0, count); //保存时间间隔,单位毫秒 spam = (DateTime.Now - time).Milliseconds > 0 ? (DateTime.Now - time).Milliseconds : spam;//必须大于0 //计算速度 单位k/s
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值