C#基础03
枚举
作用:可以限制用户输入,并且可以提供提示信息。防止了用户随意输入,输入时只需要选择相应的值。具有统一性。
注意:枚举类型的值不能取int型的值。枚举类型的实例化对象都可强制转换为int型(每个枚举值都存在一个默认编号从0开始)。在定义枚举类型时,可以通过 值=编号 来定义枚举的编号(使其不一定从零开始)。
重点:如何把字符串转换成枚举类型
程序代码实现:
(自定义的枚举类型)(Enum.Parse(typeof(自定义的枚举类型),“待转换的字符串”));
结构体
可以存储一组类型不同的信息(甚至包括方法)。
格式:
访问修饰符 struct 结构名
{
定义结构成员;
}
声明好结构体后,就可以声明对应类型的变量了,即类的实例化。
通过对象名.成员属性 来赋值
数组
数组可以一次声明多个同类型的变量,这些变量在内存中是连续存储的,通过数组下标访问(从0开始)
#数组非常重要,有用。#
数组声明(基本格式):
数据类型 [] 数组名 = 数据类型 [数组长度];
int [] num = new int [5]; 声明了一个长度为5的int型的数组;
通过数组的Length方法可以获取到数组的长度。(知识点:Console.Clear(); 清空显示屏)
复习知识点
break; 跳出循环
continue; 跳出本次循环
for 语句; for 语句内定义的变量,如果有嵌套循环需要注意定义的变量不能相同
常量:const a = 1; 用于一些不可随意更改的量
枚举: 限制用户输入,限制在枚举类型的值得范围内
结构体: 可看成一种类,包含变量,方法。通过实例化来引用。
数组; 重点,声明一批的同类型的数据。
方法
实现代码复用,把一些经常使用到的代码可以定义在方法中,使用时只需调用方法即可。
格式:
[访问修饰符] [static] 返回值类型 方法名(可选添加参数)
{
代码块(方法体);
}
其中void 表示 方法没有返回值,如果有则给定类型,方法名自定义需要遵循大驼峰命名法。参数名,变量民遵循小驼峰命名法。
return 用于返回值,这里会立即退出方法。
对于有static修饰的方法,即静态方法,调用时可直接使用方法名调用,非静态方法则必须要对象名.方法名调用。
注意
方法一般定义在类中,
如果方法无返回值,则需要void标志,
如果方法没有参数,则必须要(),不能省略
代码语言:javascript复制using System;
namespace day03test07
{
class Program
{
/// <summary>
/// 方法的复用
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
Console.WriteLine("输入数字:");
int n = ReadInt();
Console.WriteLine($"输入为{n}");
Console.WriteLine("输入数字:");
int number = ReadInt();
Console.WriteLine($"输入为{n}");
}
public static int ReadInt()
{
int num = 0;
do
{
try
{
num = Convert.ToInt32(Console.ReadLine());
return num;
}
catch
{
Console.WriteLine("输入错误,从新输入:");
}
}
while (true);
}
}
}
变量的作用域:在据它最近的一对大括号括起来的为它的作用域(对于局部变量而言)
参数
当被调用者想得到调用者的变量时,则可以通过传递参数的方式来实现。
形参:在方法定义时给出的参数变量,仅对该方法内部有作用
实参:在调用方法时调用者传进的变量
int.Parse(String); 方法将String值 转换为int值
数据类型.Parse(String); 将String 转换为类型值。
返回值
当调用者想访问被调用者的值时,可以通过return 返回值来实现。同时,数据类型也需要改成对应返回值的类型。
一个方法只能有一个返回值。参数可以有多个。
冒泡排序
让需要排序的数据组进行两两交换,并且根据排列顺序来交换数据。
一般而言,n个数据需要排列,则需要n-1次遍历,每次遍历依次从n-次比较交换到1次比较交换。即1次遍历交换n-1次数据,2次遍历数据交换n-2次数据,依次类推。
代码语言:javascript复制using System;
namespace day03test08
{
/// <summary>
/// 冒泡排序
/// </summary>
class Program
{
static void Main(string[] args)
{
int[] num = { 12, 45, 5, 35, 468, 4564, 12, 4, 23, 485, 524, 31 };
int n = 0;
//这是遍历数
for (int j = num.Length; j > 1; j--)
{
//这是数据交换次数
for (int i = 0; i < j - 1; i )
{
if (num[i] > num[i 1])
{
n = num[i];
num[i] = num[i 1];
num[i 1] = n;
}
}
}
//依次打印
for (int i = 0; i < num.Length; i )
{
Console.WriteLine(num[i]);
}
}
}
}
复习:
注意点:
一个变量定义在方法外,类里面,此时该变量可被称为成员变量或字段,这个字段就可以被该类的所有方法访问,但在访问时会牵涉到静态方法调用静态字段和非静态字段的问题(当调用非静态字段时,最直接的方式将字段改成静态字段,但推荐通过对象实例化后访问该字段)
常量不能由static修饰。
代码语言:javascript复制using System;
namespace day03test09
{
class Program
{
/// <summary>
/// 静态方法 非静态方法字段调用的问题
/// </summary>
static String str;
int a;
static void Main(string[] args)
{
Program ss = new Program();
ss.Test();
}
public void Test()
{
a = 1;
str = "6";
Console.WriteLine(str);
}
}
}
方法重载
也可称为方法的重写,即方法名相同但是**参数类型,数目返回值不同
**但都是属于不同的方法,在调用时,程序会根据传入的实参来自动确定调用哪一个方法。
Console.WriteLine(); 使用了方法重载。
代码语言:javascript复制using System;
using System.Security.Cryptography.X509Certificates;
namespace day03test10
{
class Program
{
/// <summary>
/// 方法重载
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
Test("str");
Test(123);
Test(3.1415);
Console.WriteLine("Hello World!");
}
public static void Test(int a)
{
Console.WriteLine("int");
}
public static void Test(String s)
{
Console.WriteLine("String");
}
public static void Test(double num)
{
Console.WriteLine("double");
}
}
}
补充:
在方法的参数类型前 加 out ,那么传入参数的时候, 也必须在传入的实参前加 out 表明这个参数不是传入的,而是用来传出值的。
如果,参数是以out 形式传入的,那么在传入前可以不赋初值。但是在方法内对形参必须赋初值。
一定意义上,可以理解成在方法内部定义的变量赋初值不是在定义时赋值而是在调用的方法内部赋初值。
作用:用于返回多个值。
代码语言:javascript复制using System;
namespace day03test11
{
class Program
{
/// <summary>
/// out 修饰参数
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
int num;
int res = Test(out num);
//返回了12 赋给res
Console.WriteLine(res);
//返回了值给num,实质上是对内存地址的操作,直接改变了外界的对该内存地址引用的值对象
Console.WriteLine(num);
}
public static int Test(out int a)
{
a = 10;
return 12;
}
}
}
int.TryParse(String ;out 参数);传入一个待转的字符串和一个out修饰的int值 返回一个布尔值,true表示待转的字符串可以转换,如果是false代表转换失败。同时,会将转换后的值存贮在out 修饰的参数内。
代码语言:javascript复制using System;
namespace day03test12
{
/// <summary>
/// out 返回多个值
/// </summary>
class Program
{
static void Main(string[] args)
{
int num;
bool bol;
String str = Console.ReadLine();
bol = GetInt(str, out num);
if (bol)
{
Console.WriteLine(num);
}
else
{
Console.WriteLine("错误");
}
/*int q = int.Parse("qwe");
int n;
bool q = int.TryParse("qwe", out n);*/
}
public static bool GetInt(String s, out int a)
{
a = 0;
try
{
a = int.Parse(s);
return true;
}
catch (FormatException)
{
return false;
}
}
}
}
**总结(传入参数时)**难点
**######**直接传入 值传递,将值复制一份,只对复制过来的值进行操作
out(引用传递,直接对内存地址进行操作) 用于传出值。在方法中必须对out修饰的值必须赋值(这也导致了out一般只能用于传出值而不能传入值,因为参数没有赋初值,必须在方法内部赋初值而不能将参数的值赋给其他变量,这也是与ref 的区别所在)。
ref(引用传递,直接对内存地址进行操作) 可以理解既可以传入(传入参数时需要对参数赋初值,因此在方法内部可以将参数的值赋给其他变量,实现传入值的功能),也可以传出(改变参数的值后会方法外面的值也会改变与out 类似)。
代码语言:javascript复制using System;
namespace day03test13
{
class Program
{
/// <summary>
/// ref out 引用传递
///
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
//使用ref 传入值时,需要给值赋初值
int num = 1, nums = 0;
Test(ref num, ref nums);
Console.WriteLine(num);
Console.WriteLine(nums);
//使用out 传出值,初值可以不赋值
int num1;
String str;
Test(out num1, out str);
Console.WriteLine(num1);
//Console.WriteLine(num2);
Console.WriteLine(str);
}
public static void Test(out int a, out String s)
{
//这里传出值,改变值可以改变方法外的值
//这里只能给参数赋初值
a = 12;
s = "ss";
//return 5;
}
public static void Test(ref int num, ref int nums)
{
//这里传出值,改变值可以改变方法外的值
//这里与out 的区别就在于可以将参数的值赋给其他变量
int b = num;
int c = nums;
num = 12;
nums = 13;
}
}
}