第一次发博客,欢迎交流沟通。
因为学习虚拟现实需要所以暑假一个月学了点C#,做了笔记,在这进行分享,欢迎浏览。
有些代码打在VS中 没有记录在笔记里 请见谅。
(视频指路)
不能脱离.Net Framework框架
VS的组成
解决方案—项目—类 .cs结尾的为类文件
解决方案:公司
项目:部门
类:员工
引用命名空间:
京东 —京东在线商城项目 — 顾客类
淘宝 —京东在线商城项目 — 顾客类
另一个公司 — 另一个项目 — 顾客类 包含了京东和淘宝两个
方法 / 函数
C#文件只写在函数里边
.sln:解决方案文件 里边包含整个解决方案的信息 可以双击运行
.csproj:项目文件 里边包含整个项目的信息 可以双击运行
Console.WriteLine("Hello World");
Console.Readkey(); //严格区分大小写
//先按F6进行检查 再用F5运行
单行注释 //
多行注释 /* */
文档注释 /// (用来描述类和方法 这个在方法内使用不会跳出描述)
region和文字中间要空一个空格
里边的内容也可以注释掉
整数类型:int 只能存储整数,不能存储小数
小数类型:double 既能存储整数,也能存储小数,小数点后面的位数 15~16位 float存储6~9位
金钱类型:decimal:用来存储金钱,值后面需要加上一个 小数点后面的位数28~29位
1。与 float
和 double
相比,decimal
类型具有更高的精度和更小的范围,因此它适合于财务和货币计算。
2.不带后缀的文本或带有 d
或 D
后缀的文本的类型为 double
f
或 F
后缀的文本的类型为 float
m
或 M
后缀的文本的类型为 decimal
字符串类型:string,用来存储多个文本,也可以存储空,字符串类型的值需要被 双引号引来
字符类型:char,用来存储单个字符,最多、最少只能有一个字符,不能存储空
bool类型:true或者false 判断对错
一.首先要保证的就是这个变量的名字要有意义。
1 现阶段给变量起名字的时候都以字母开头
2 后面可以跟任意“字母”、数字、下划线.
二.注意:
1)起的变量名不要与c#系统中的关键字重复.
2)在c#中,大小写是敏感的. HTML
3)同一个变量名不允许重复定义
给变量起名字的时候要满足两个命名规范:
1、Camel 骆驼命名规范。要求变量名首单词的首字母要小写,其余每个单词的首字母要大写。
多用于给变量或者字段命名。
highSchoolStudent
2、Pascal 命名规范:要求每个单词的首字母都要大写,其余字母小写。多用于给类或者方法命名。
HighSchoolStudent
=:表示赋值的意思,表示把等号右边的值,赋值给等号左边的变量。
由等号连接的表达式称之为赋值表达式。
注意:每个表达式我们都可以求解除一个定值,对于赋值表达式而言,等号左边的变量的值,
就是整个赋值表达式的值。
int number=10;
1)、连接:当+号两边有一边是字符串的时候,+号就起到连接的作用。
2)、相加:两边是数字的时候
使用方法:先挖个坑,再填个坑。
使用占位符需要注意的地方:
1、你挖了几个坑,就应该填几个坑,如果你多填了,没效果。
如果你少填了,抛异常。
2、输出顺序:按照挖坑的顺序输出。
异常是指:语法上并没有任何错误,只不过在程序运行的期间,由于某些原因出现了问题,
使程序不能再正常的运行
Console.WriteLine("请输入您的名字:");
string name = Console.ReadLine();
Console.WriteLine("请输入您的性别:");
string sex = Console.ReadLine();
Console.WriteLine("请输入您的年龄:");
string age = Console.ReadLine();
Console.WriteLine("我叫{0},性别{1},年龄{2}", name, sex, age);
Console.ReadKey(); // 只能是string 这样可以包含任意类型
+= -= *+ /= %=
(内容同C语言)
要记住代码最后有三个括号
输入账号和密码 没必要转换成int类型
//有两种以上情况的用if else-if
//第一种情况:用户名和密码全部输入正确
if (name == "admin" && pwd == "888888") {
Console.WriteLine("登陆成功");
}
//第二种情况:密码错误
else if (name == "admin") {
Console.WriteLine("密码输入错误,程序退出");
}
//第三种情况:用户名错误
else if (pwd == "888888") {
Console.WriteLine("用户名错误,程序退出");
}
//第四种情况:用户名和密码全部错误
else {
Console.WriteLine("用户名和密码全部错误,程序退出");
}
我们在程序中经常会出现各种各样的异常,你如果想要你的程序变得坚强一些。
在你的代码中应该经常性的使用try-catch来进行异常捕获。
一般是所有代码都写完后再写try-catch来检查
哪行代码有可能出现异常,你就踹它一脚。
try
{
可能会出现异常的代码;
....
...
...
}
//try和catch之间不能有其他的代码
catch
{
出现异常后要执行的代码;
} 要注意变量的三部曲问题 有一个出错后边另一个步骤可能就运行不了 e.g 输入数值 但是可能会输入abc导致无法转化 此时就要在声明变量时赋初值为0
执行过程:如果try中的代码没有出现异常,那么catch中的代码不会执行。
如果try中的代码出现了异常,那怕这行出现异常的代码后面还有一百行都不会执行了,
而是直接跳到catch中执行代码 (类似于if-else)
用来处理多条件的定值的判断。
if else-if 处理的是带范围的判断
switch(变量或者表达式的值)
{
case 值1:要执行的代码;
break;
case 值2:要执行的代码;
break;
case 值3:要执行的代码;
break;
..........
default:要执行的代码;
break;
}
//输出输入的月份对应的天数
Console.WriteLine("请输入年份");
try {
int year = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("请输入月份");
int month = Convert.ToInt32(Console.ReadLine());
if (month >= 1 && month <= 12) {
int day = 0;
switch (month) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
day = 31;
break;
case 2:
if ((year % 400 == 0) || (year % 100 != 0 && year % 4 == 0)) {
day = 29;
} else {
day = 28;
}
break;
default:
day = 30;
break;
}
Console.WriteLine("{0}年{1}月有{2}天", year, month, day);
}
else {
Console.WriteLine("输入的月份有错,请重新输入");
}
}
catch {
Console.WriteLine("输入的年份有错,请重新输入");
}
Console.ReadKey();
while:特点:先判断,再执行,有可能一遍循环都不执行。( 同C )
//输入后不换行
Conosole.Write("\t");
Console.WriteLine(); //什么都不写也会自动换行
continue 跳出当前循环进行判断 条件符合继续循环 否则跳出循环
int number = 100;
bool b = int.TryParse("123abc",out number); //把数值转换为数字并赋值给number 这里的TryPrase是一个方法 如果转换成功则b为true number为转换后的值 如果不成功则b为false 并赋值number = 0
//不同于convert.Int32和int.Prase 这两个如果转换不成功会报错
Console.WriteLine(b);
Console.WriteLine(number);
调试方法:
1)F11逐语句调试(单步调试)
2)F10逐过程调试
3)断点调试
//1.创建一个能够产生随机数的对象
Random r = new random();
//2.让产生随机数的这个对象调用方法来产生随机数
int rNumber = r.Next(1,10) //取左不取右
const int number = 10; 这就是定义了一个常量 常量是不可以改变的
e.g 超市哪一天打几折 这时候就可以用到常量了
[public] enum 枚举名{ //public也可以省略 最好还是写出来
值1,
值2,
值3 //最后一个数据的后边逗号可以省略 表示是最后一个
} //定义枚举时可以在命名空间下类上声明或者类下函数前声明 绝对不能在函数里声明
将枚举声明到命名空间的下面,类的外面,表示这个命名空间下,所有的类都可以使用这个枚举。
//函数里
{
Discount d1 = Discount.nine;
Season s1 = Season.夏;
}
namespace _04枚举和int以及string类型之间的转换
{
public enum QQState
{
OnLine=1, //这也后边使用到枚举内容是第一个内容对应的数字是1 后边递增
OffLine,
Leave,
Busy,
QMe
}
public enum Gender
{
男,
女
}
class Program
{
static void Main(string[] args)
{
#region 将枚举类型强转成int类型
//QQState state = QQState.OnLine;
枚举类型默认可以跟int类型互相转换 枚举类型跟int类型是兼容的
//int n = (int)state;
//Console.WriteLine(n);
//Console.WriteLine((int)QQState.OffLine);
//Console.WriteLine((int)QQState.Leave);
//Console.ReadKey();
#endregion
#region 将int类型强转为枚举类型
//int n1 = 3; //如果n1为8(比枚举内容大) 则打印出来还是8
//QQState state = (QQState)n1;
//Console.WriteLine(state);
//Console.ReadKey();
#endregion
#region 将枚举类型转换成字符串类型
//所有的类型都能够转换成string类型
// int n1 = 10;
double n1 = 3.14;
// decimal n1 = 5000m;
// string s = n1.ToString();
// Console.WriteLine(s);
// Console.ReadKey();
//QQState state = QQState.OnLine;
//string s = state.ToString();
//Console.WriteLine(s);
//Console.ReadKey();
#endregion
#region 将字符串类型转换为枚举类型
//string s = "ABCDEFG";
将s转换成枚举类型
Convert.ToInt32() int.parse() int.TryParse() //转换的三种方法
调用Parse()方法的目的就是为了让它帮助我们将一个字符串转换成对应的枚举类型
//QQState state = (QQState)Enum.Parse(typeof(QQState), s); //如果输入的字符串枚举里边没有则会报错
//Console.WriteLine(state);
//Console.ReadKey();
#endregion
//枚举练习
//提示用户选择一个在线状态,我们接受,并将用户的输入转换成枚举类型。
//再次打印到控制台中
Console.WriteLine("请选择您的qq在线状态 1--OnLine 2--OffLine 3--Leave 4--Busy 5--QMe");
string input = Console.ReadLine();
switch (input)
{
case "1": QQState s1 = (QQState)Enum.Parse(typeof(QQState), input);
Console.WriteLine("您选择的在线状态是{0}",s1);
break;
case "2": QQState s2 = (QQState)Enum.Parse(typeof(QQState), input);
Console.WriteLine("您选择的在线状态是{0}",s2);
break;
case "3": QQState s3 = (QQState)Enum.Parse(typeof(QQState), input);
Console.WriteLine("您选择的在线状态是{0}",s3);
break;
case "4": QQState s4 = (QQState)Enum.Parse(typeof(QQState), input);
Console.WriteLine("您选择的在线状态是{0}", s4);
break;
case "5": QQState s5 = (QQState)Enum.Parse(typeof(QQState), input);
Console.WriteLine("您选择的在线状态是{0}", s5);
break;
}
Console.ReadKey();
}
}
}
//结构和枚举的结合应用
namespace _02_结构练习
{
public enum Gender
{
男,
女
}
public struct Person
{
public string _name;
public int _age;
public Gender _gender; //应用了上边的枚举类型
}
class Program
{
static void Main(string[] args) {
Person zsPerson;
zsPerson._name = "张三";
zsPerson._gender = Gender.男;
zsPerson._age = 18;
Person xlPerson;
xlPerson._name = "小兰";
xlPerson._gender = Gender.女;
xlPerson._age = 16;
Console.WriteLine("我叫{0}是{1}的今年{2}岁了",zsPerson._name,zsPerson._gender,zsPerson._age);
Console.WriteLine("我叫{0}是{1}的今年{2}岁了",xlPerson._name,xlPerson._gender,xlPerson._age);
Console.ReadKey();
}
}
}
int[] a = new int[10]; //定义了一个int类型长度为10的数组
int[] a = {0,1,2,3,4,5,6}; // 确定了数组初值
比较数组中的最大值最小值最好就是随便把数组内的一个值赋值给最大最小值 不要赋值为0
//将一个数组升序
int[] nums = {1,4,5,68,4,11,6};
Array.Sort(nums); //按升序顺序排序
Array.Reverse(nums); //将数组反转 顺序无变化
都是直接改变了数组
函数的语法:
[public] static 返回值类型 方法名([参数列表])
{
方法体;
}
public:访问修饰符,公开的,公共的,哪都可以访问。
static:静态的
返回值类型:如果不需要写返回值,写void
// 平时写的Console.WriteLine(); 也是一种调用方法 调用的是Console这个类的WriteLine这个方法
在某些情况下,类名是可以省略的,如果你写的方法跟Main()函数同在一个类中,这个时候,类名可以省略。(不可以省略的例子看上方代码块注释部分)
方法写好后,如果想要被执行,必须要在Main()函数中调用。
方法的调用语法: 类名.方法名([参数]);
写方法时既要写函数体和函数的作用 方便使用
static void Main(string[] args) {
int[] number = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
GetMaxMinSumAve(number, out int max, out int min, out int sum, out int ave);
Console.WriteLine("Max = {0},Min = {1},Sum = {2},Ave = {3}", max, min, sum, ave);
Console.ReadKey();
}
///
/// 给定数组
/// 求最大最小值,总和,平均值
///
/// 所求数组
/// 最大值
/// 最小值
/// 总和
/// 平均值
public static void GetMaxMinSumAve(int[] nums, out int max, out int min, out int sum, out int ave) {
max = nums[0];
min = nums[1];
sum = nums[2];
ave = 0;
for (int i = 0; i < nums.Length; i++) {
if (nums[i] > max) {
max = nums[i];
}
if (nums[i] < min){
min = nums[i];
}
sum += nums[i];
}
ave = sum / nums.Length;
}
static void Main(string[] args) {
int n1 = 10;
int n2 = 20;
Swap(ref n1, ref n2);
Console.WriteLine("n1={0},n2={1}",n1,n2);
Console.ReadKey();
}
public static void Swap(ref int n1,ref int n2) {
int temp = n1;
n1 = n2;
n2 = temp;
}
static void Main(string[] args) {
int sum = GetSum(1,2,3,4,5,6,7,8,9);
Console.WriteLine(sum);
Console.ReadKey();
}
public static int GetSum(params int[] s) { //每个实参都变成了数组中的元素 最后结果为45
int sum = 0;
for (int i = 0; i < s.Length; i++) {
sum += s[i];
}
return sum;
}
方法名字相同,参数不同
参数不同:
1.个数相同 则类型不能相同
2.类型相同 则个数不能相同
函数重载与返回值没关系
{
static void Main(string[] args) {
int i = 0;
All(i);
Console.ReadKey();
}
public static void All(int i) {
Console.WriteLine("从前有座山,山里有座庙,庙里有个小和尚和老和尚,老和尚对小和尚讲了个故事:");
i++;
if (i > 10) {
return;
}
All(i);
Console.WriteLine("我是第{0}次", i);
}
1.设置游戏界面
//设置前景色(文字的颜色)
Console.ForegroundColor = ConsoleColor.Red;//这是一个枚举 所以这样来调用
//设置背景色
Console.BackgroundColor = ConsoleColor.Red;
2.输入姓名
//输入后应该清屏
Console.Clear();
3.启动项目
//按下任意键投骰子
Console.ReadKey(true); //true 输入的任意键不会被显示 false为显示