数组:为了创建多个相同类型的变量
ps:结构是为了创建多个不同类型的变量
数组一旦被创建,则该数组的长度不能被修改
数组的声明:
int[] nums=new int[4];//声明一个长度为4的空数组
int[] nums=new int[4]{1,2,3,4};//声明一个长度为4的数组,并为其赋值
int[] nums =new int[]{1,2,3,4};//声明一个数组,并为其赋值,这时数组的长度有数组的元素个数决定
int[] nums ={1,2,3,4};//声明一个数组,此时数组的类型由初始化决定,长度由数组的元素个数决定
数组首位交换
int[] nums = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
//交换数组
string error = "";
for (int i = 0; i < nums.Length; i++)
{
Console.Write("{0}\t", nums[i]);
}
Console.WriteLine();
GetChangeArry(nums,out error );
for (int i = 0; i < nums.Length; i++)
{
Console.Write("{0}\t", nums[i]);
}
Console.ReadKey();
private static void GetChangeArry(int[] nums, out string error)
{
error = "";
if (nums == null || nums.Length <= 0)
{
error = "错误";
}
int coun = nums.Length;
int temp = 0;
for (int i = 0; i <= coun / 2; i++)
{
temp = nums[i];
nums[i] = nums[coun - 1];
nums[coun - 1] = temp;
coun--;
}
}
冒泡排序:升序(大的在后面,像烧开水)/降序(打的在前面)
//先输出一遍
int[] nums = { 6, 9, 4, 3, 5, 2, 8, 1, 0, 7 };
for (int i = 0; i < nums.Length; i++)
{
Console.Write(nums[i]);
}
Console.WriteLine();
//升序
for (int i = 0; i < nums.Length - 1; i++)
{
for (int j = 0; j < nums.Length - 1 - i; j++)
{
if (nums[j] > nums[j + 1])
{
int temp = nums[j];
nums[j] = nums[j + 1];
nums[j + 1] = temp;
}
}
}
Console.WriteLine("升序:");
for (int i = 0; i < nums.Length; i++)
{
Console.Write(nums[i]);
}
Console.WriteLine();
//降序
for (int i = 0; i < nums.Length - 1; i++)
{
for (int j = 0; j < nums.Length - 1 - i; j++)
{
if (nums[j] < nums[j + 1])
{
int temp = nums[j];
nums[j] = nums[j + 1];
nums[j + 1] = temp;
}
}
}
Console.WriteLine("降序:");
for (int i = 0; i < nums.Length; i++)
{
Console.Write(nums[i]);
}
Console.ReadKey();
Array有两个方法
Array.Sort(nums);//升序排列
Array.Reverse(nums);//反转
Array没有降序排列的方式,如果要对数组进行降序排列可以先升序排列,在对数组进行反转
方法(函数)
形参和实参:
形参:形式上的参数,也会在内存中开辟空间,但是形参变量只有在被调用的时候才会分配内存空间,而且一旦调用结束所分配的内存空间就会被释放,所以形参只能在函数内部有效
实参:调用函数时传递的参数,也会在内存中开辟空间,实参可以是变量,常量,表达式,函数等.但是不论是什么,在调用函数的时候他们都必须有确定的值,以便把这些值传递给形参
形参和实参的命名可以不同,但是数据类型,数量,顺序必须一致,否则会出现编译错误
在一般传值调用的时候只能把实参传递给形参,而不能把形参的值反过来传递给实参,因此在调用的过程中,如果为值类型形参的值发生改变实参的值不会改变,引用类型应为传递的是实参的引用地址,所以任何发生在形参上面的变化也会反应在实参上
return:
返回想要的结果
立即结束当前方法
调用和被调用:
如果在Main()函数中调用Test()函数,
则吧Main()函数称为调用者,Test()函数称为被调用者
方法(函数)的书写规范:
方法的功能一定要单一,一个方法只完成一个功能
尽量使用接口,然后使用类去实现接口,提高代码灵活性
每一行的代码不要过长(控制在80个以内)
尽量书写注释,关键代码和逻辑复杂的代码必须有注释
局部变量尽量在最接近使用它的地方声明
尽量不要使用goto系列语句
尽量控制方法的入参数量只在5个以内
尽量不要书写代码量过大的try-catch模块
尽量不要在同一个文件中书写多个类
尽量不要使用this关键字引用
生成或构建一个长的字符串的时候使用StringBuilder类型,不要使用string类型
switch语句要有default语句来处理特殊情况
对于if语句,使用{}把代码块括起来(就算只有一行代码也尽量加上)
out和ref:
ref和out都是按地址传递,使用后都将改变原来参数的数值
因为是按地址传递,可以解决方法(函数)只能有一个返回值得问题
方法定义和使用的时候都要显示的使用ref/out关键字来修饰
ref:被ref关键字修饰的参数,在调用函数之前必须赋初值,否则会编译出错,在函数内可以不必赋值
out:被out关键字修饰的参数,在被调用的之前可以不比赋值,但是在函数中必须被赋值,否则会编译出错
out方法侧重函数中的返回值(在函数中必须要赋值)
ref侧重于把调用函数之前的值传入函数并且参与运算操作(调用函数之前必须赋值)
public void Show(ref string mm)
{
Console.WriteLine(1);
}
public void Show(out string mm)
{
Console.WriteLine(2);
}
上面两个方法这样定义是会报错:无法重新定位重载方法'Show',应为他与其他方法仅在ref和out上有差别
尽管ref和out在运行时的处理方式不同,但是他们在编译的时候处理方式相同,所以无法重载这两个方法,从编译的角度看他们是相同的一个方法(函数)