-------------------------------------
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 = 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
{
enumeration list
};
例如:
enum Days { Sun, Mon, tue, Wed, thu, Fri, Sat };
使用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/arrays或https://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参数获取数组中的最小值和最大值:
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);
}
///
/// 求数组中的最大数,最小数
///
/// 需要求最大最小值的数组
/// 返回数组的最小值
/// 返回数组的最大值
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参数交换变量值:
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可变参数(参数数组)必须是方法的最后1个参数.
*重载和递归可参考原来的笔记https://blog.csdn.net/ishenjiaming/article/details/99619637
*可参考原来的笔记https://blog.csdn.net/ishenjiaming/article/details/99545219和https://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
可以节约冗余代码.如下:
例子详见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数组,可以通过下标访问数组元素,如下:
如果想改变字符串中某个字符,需要先转换为1个新的char数组,然后改变其中元素;再将改变后的char数组转化为字符串,如下:
可用于大量字符串频繁,高速拼接等操作.
*参见https://blog.csdn.net/ishenjiaming/article/details/103609679(Unity学习笔记)
假如需要拼接字符串十万次,耗费的时间.如下:
使用StringBuilder拼接字符串十万次耗费的时间如下:
我们发现二者耗费的时间不在同一数量级上!
最后,StringBuilder拼接字符串完成后,我们仍应该将其转化为字符串,所以最后须加上:
Console.WriteLine(sb.ToString());
二者有如此显著不同是因为前者制造了十万个字符串,而后者StringBuilder前前后后(理论上理想状态)只操作一个字符串.
示例-Substring取子字符串:从Strart索引开始[到End索引结束]: //[...]代表参数可存在亦可不存在
注意第一个索引从0开始:
以上代码取原字符串的第1号索引至第2号索引结束的子字符串,即"天天".
以下代码演示Stratswith和Endswith方法:
以下代码演示IndexOf方法,找到返回索引值(注意第一个索引值从0号索引开始),找不到则返回-1:
可以指定从第几号索引开始寻找,下例从源字符串第2号索引字符开始查找:
以下代码演示LastIndexOf方法,它是从字符串末尾开始寻找:
以下代码根据全路径字符串获取文件名: "苍老师苍.wav":
首先找到最后1个"\"(代码使用"\\"因为\\代表\);最后截取最后1个\后面的字符串,即"苍老师苍.wav"
Trim去掉前后空格(注意不是所有空格);TrimStart去掉前面所有空格;TrimEnd去掉后边所有空格.示例如下:
练习
-------------------
思路:使用split方法得到每行的2个字符串:书名和作者;之后再判断书名是否超10个字符,超过则取前8个加"...";最后加个竖线再加作者名得到新字符串.
--------------
第二种方法如下.缺点是只能找单个字符而不能找多个字符组成的词: