声明一个常量类型 const 变量类型 变量名 = 值;
常量最大的特点就是不能够被重新赋值;
枚举语法: [public] enum 枚举名
{
值1,
值2,
值3,
......
}
public:访问修饰符。公开的公共的,哪都可以访问
enum:关键字,声明枚举的关键字;
枚举名:要符合Pascal命名规范;
不要在Main函数里面声明枚举;声明枚举最好在命名空间的下面,类的上面。表示这个命名空间下,所有的类都可以使用这个枚举
枚举就是一个简单的变量类型,跟int,double,string,char,decimal,bool是一样的。只是枚举类型声明,赋值,使用上和它们不一样,但本质上一样,都是用来存数据
public enum Gender
{
男,
女
}
int n = 10;
Gender gender = Gender.男; 一样的格式
public enum QQState
{
OLine,
OffLine,
Leave,
Busy,
QMe
}
枚举类型默认跟int类型可以互相强制转换,枚举类型跟int类型是兼容的;当转换一个枚举中没有的值得时候,不会抛异常,而是直接将数字显示出来
1.将枚举类型转换为int类型
QQState state = QQState.OnLine;
int n = (int)state; n=0,说明枚举类型默认是从0开始的;
2.将int类型转换为枚举类型
int n1 = 3;
QQState state = (QQState)n1; state值为busy;
所有的类型都可以转换成string类型,调用ToString()去转;
3.将枚举类型转换为string类型
QQState state = QQState.OnLine;
string s = state.ToString(); s的值为OnLine;
4.将string类型转换为枚举类型 为什么没有Convert.ToEnum();因为枚举类型的类型不固定,是我们自己写的, 但是有Enum.Parse();
string s = "0";//string s ="OnLine"也可以; string s = "8";会直接输出8; string s = "ABCD";会报异常
QQState state = (QQState)Enum.Parse(typeof(QQState),s);
结构可以帮助我们一次性声明多个不同类型的变量;
结构语法:
[public] struct 结构名
{
成员名;//字段
}
结构名用Pascal命名规范;
结构跟枚举一样也是写在命名空间下面,类的上面,表示在哪都可以用得到;
public struct Person
{
string name;
int age;
char gender;
}
这样写表示这3个变量只能在结构里面访问,出了这个结构就访问不到了,
因此改成
public struct Person
{
public string _name;
public int _age;
public char _gender;
}
int也是一种结构,结构和枚举本质都是变量类型;
Person zsPerson;
zsPerson.name = "张三";
zsPerson.age = 21;
zsPerson.gender = '男';
结构中的变量不叫变量,叫字段;
变量面前不允许加访问修饰符;字段面前可以加访问修饰符;
变量和字段都是用来存储数据; 变量和字段最本质的区别,在程序运行的时候,变量只能存一个值,但是字段能存很多值;
自我小结,字段和方法是平级的,变量是在方法里面的;因此变量面前不允许加访问修饰符;字段面前可以加访问修饰符
在给字段取名字的时候,规范上都应该在名字前加_
枚举类型面前是两个黄色的小方块
一次性声明多个不同类型的变量用结构, 一次性存储多个相同类型的变量用数组;
语法:
数组类型[] 数组名 = new 数组类型[数组长度];
int[] nums = new int[10];
当写完之后,就在内存中开辟了连续的10块空间;我们称每一块空间为这个数组的元素; 如果你想访问到数组中的某一块元素,需要通过这个元素的索引去访问;索引是从0开始的;数组的最后一个索引是数组的长度减一
nums[6] = 10;//给数组中第七个元素赋值为10;
我们通过一个循环给数组赋值,也通过一个循环对数组取值
数组的长度一旦固定了就不能改变了
; int[] 在不赋初值的情况下默认为0; string[] 在不赋初值的情况下默认为null; null和""不是一个意思;null表示根本没在内存里面开空间;""表示在内存中开空间了,只是存的值是空; bool[] 在不赋初值的情况下默认为false;
数组的声明方式:
1.int[] nums = new int[10];
2.int[] nums = {1,2,3,4,5,6,7,8};
3.int[] nums = new int[3]{1,2,3}; //不推荐
4.int[] nums = new int[]{1,2,3};//不推荐
尽量循环的时候i从0开始,因为这样和数组的索引对应
关于在循环当中nums[i]的理解方式,
1.代表数组中当前循环到的元素
2.代表数组中的每个元素;
在求数组中的最大值和最小值的时候,int max = nums[0]; int min = nums[0];这样就保证最大最小值是数组中有的数字。或者int max = int.MinValue; int min = int.MaxValue;
for(int i = 0 ; i < nums.Length/2 ; i++)
{
string temp = nums[i];
nums[i] = nums[nums.Length - i - 1];
nums[nums.Length - i - 1] = temp;
}
//数组倒序的关键代码;
冒泡排序:
就是将一个数组中的元素按照从大到小或者从小到大的顺序进行排列;
冒泡排序(升序)关键代码;
for(int i = 0; i < nums.length - 1;i++)
{
for(int j = 0; j < nums.Lngth -1 -i; j++)
{
if(nums[j] > nums[j+1])
{
int temp = nums[j];
nums[j] = nums[j+1];
nums[j+1] = temp;
}
}
}
如果改成 if(nums[j] < nums[j+1]) 则为降序排列;
冒泡排序,两个变量交换不使用第三方,一个字符串中每个字母出现的次数,这3个笔试经常考到
C#用一行代码实现冒泡排序 Array.Sort(nums); Sort方法只能对数组进行升序排列;
C#用一行代码实现数组反转 Array.Reverse(nums);将数组中的元素进行倒叙或者反转输出;
Array.Sort(nums);Array.Reverse(nums);两行代码实现数组的倒序
C语言中只有函数这个概念;C#中函数就是方法,方法就是函数;
方法(函数)就是将一堆代码进行重用的一种机制;
[public] static 返回值类型 方法名([参数列表])
{
方法体;
}
Main函数也是一个方法,因此,写方法的时候要写在Main函数外面,与Main函数平级
return的作用 :
1.返回方法中要返回的值
2.立即结束当前方法
一个完整的方法是方法加文档注释;
方法要被执行就必须被调用;如果是static静态方法 就要用 类名.方法名() 去调用方法; 在某些情况下类名是可以省略的,如果你写的方法跟Main()函数在同一个类中,这个时候,类名可以省略;
如果方法是别人写的,你不知道传什么参数,返回什么值,就.方法名(的时候打半个小括号;会自动出现提示;
有了方法写代码就像拼积木,C#中各种各样的技术其实就是通过for,if等这些基础的语法将不同的方法按照一定的逻辑组织起来
程序员具备的能力之一 照葫芦画瓢