初学一些C#的一些知识总结,主要是看擅码网的Monkey老师的3D学习路线第一部分中的《C#初级课程指语法基础》这一块内容。并没有包含所有的知识点讲解,只是记录一些自己觉得应该注意的点。
毕竟还是新手,如果有些语句叙述并不严谨到位,还请各位大佬指正。
C#的输入语句
XXX = Console.ReadLine();
C#的输入语句
Console.WriteLine();
下面将展示一段代码:
string name;
string age;
string gender
Console.WriteLine("你的名字是:");
name = Console.ReadLine();
Console.WriteLine("你的年龄是:");
age = Console.ReadLine();
Console.WriteLine("你的性别是:");
gender = Console.ReadLine();
//这边要注意的一个点是字母的大小写
//是WriteLine 不是writeline或Writeline
Console.WriteLine("你的名字是{0},性别是{1},年龄是{2}。", name, gender,age);
//这句话主要是为了让控制台不关闭
//如果没有这句话,控制台在你输入完性别敲完回车之后,会直接关闭
int week;
Console.WriteLine("请输入你今天的时间");
week = Convert.ToInt32(Console.ReadLine());
switch (week)
{
case 1:
Console.WriteLine("今天工作");
break;
case 2:
Console.WriteLine("今天工作");
break;
case 5:
Console.WriteLine("今天工作");
break;
default:
Console.WriteLine("今天休息");
break;
}
Console.ReadKey();
注意的点,很多如注释所言:
输入语句Console.ReadLine()可以由变量接收。
虽然在大部分编译器,尤其是VS2019中,有非常智能的代码补全功能,但是还是要注意一些关键字的大小写。
在刚开始学习的时候,我曾经犯过将Console.WriteLine()写成console或writeline或Writeline的情况。
因为在学习过程中,常常需要一些输出来检测结果是否标准正确。Console.WriteLine()的使用便是家常便饭。
记一个快捷键功能:cw+两次tab。能够自动补全输出语句。
在所有代码的结尾处,往往接一个Console.ReadKey()语句。
这句话的作用是获取用户按下的下一个字符或功能键。
在这里主要是为了让控制台不关闭,如果没有这句话,控制台在你输入完性别敲完回车之后,会直接关闭。
但我其实也遇见,有时候忘记输入这句话,控制台也并不会闪退。不过,如果你发现自己的控制台闪退,检查一下是否忘了写这个语句吧。
这段小代码中还涉及到一个,将输入语句string类型强制转化为int语句的知识点,关于强制转换,具体可以参考这篇:C#菜鸟教程类型转换
由于我觉得这部分知识点,大部分语言都大同小异,所以便不再详细阐述,不过我还是贴一下相关练习的代码
代码如下展示:
for(int i=1; i <= 9; i++)
{
for(int j=1; j <= i; j++)
{
//Console.Write(j+" x "+i+" ="+j*i + "\t");
//因为觉得有些不好看所以换一种规范的写法
Console.Write("{0}*{1}={2}\t", j, i, j*i);
}
Console.WriteLine();
//WriteLine会自动换行
}
Console.ReadKey();
还是解释一些点:
第一层循环中的i表示行数的增加,第二层循环中的j表示列数的增加,且列数的增加不会超过行序号
用{ }占位符格式化输出。
这边注意一下Console.WriteLine()和Console.Write的区别。因为WriteLine有自动换行的功能,如果使用WriteLine来写输出语句,则会有如下情况:
foreach循环和for循环相似的用法,注意一下格式用法即可
代码如下(示例):
foreach(string k in shengxiao)
{
Console.WriteLine(k);
}
//声明数组
int[] intArray;
//初始化
intArray = new int[5];
//也可以声明和初始化同时完成
double[] doubleArray = new double[3];
//赋值
doubleArray[0] = 1;
//声明、初始化和赋值三合一
//元素可以少于角标元素,但不能多
double[] array1 = new double[3] { 1.1, 2.2, 3.3 };
//或者,别加角标
double[] array2 = new double[] { 1.1, 2.2, 3.3 };
代码展示了两种循环方式,均能遍历数组。如下示例:
string shengXiao = " ";
string[] shengxiao = new string[] { "子", "丑", "寅", "卯", "辰", "巳", "午" };
for(int j = 0; j < shengxiao.Length;j++)
{
shengXiao = shengXiao + shengxiao[j];
if (j < shengxiao.Length-1)
{
shengXiao += '|';
}
}
Console.Write(shengXiao);
//或者就这样
foreach(string k in shengxiao)
{
Console.WriteLine(k);
}
//foreach 遍历
Console.ReadKey();
其实函数没啥好说的,跟其他语言也太差不差,提个注释问题好了。
///
/// 对函数进行功能性质的描述、如果函数很长,可以使用这种进行描述
///
/// 可以对其中的参数进行描述
static void ShowTiTle(int[] A)
{
foreach(int i in A)
{
Console.WriteLine(i);
}
Console.WriteLine("写出本次的题目");
}
三个\回车,会自动出现如上注释格式,可以在里面填充对代码的解释。
#论养成良好注释代码习惯的重要性
提供了创建同名的多个方法的能力,但这些方法需使用不同的参数类型。
特点:方法名必须相同,但参数类型或个数必须不同
优点:在不改变原来方法的基础上,新增功能
这段练习代码找不到了,就随便写一下
public int sum(int a,int b)
{
return a+b;
}
public double sum(double a,double b)
{
return a+b;
}
public float sum(float a,float b)
{
return a+b;
}
在上面这种情况下,方法名相同,只是参数类型不同,这样在函数调用的时候可以直接通过参数的类型来赋值:
int a;
double b;
float c;
a = sum(1,2);
b = sum(1.22,3.44);
c = sum(1.1,2.2);
函数可以重构,同样在类中的方法也可以重构,这点在后面面向对象的学习中会提到。
根据网上官方的说法:
值传递:传递对象的一个副本,即使副本被改变,也不会影响源对象,因为值传递的时候,实际上是将实参的值复制一份给形参。
引用传递:传递的并不是实际的对象,而是对象的引用,外部对引用对象的改变也会反映到源对象上,因为引用传递的时候,实际上是将实参的地址值复制一份给形参。
简单理解就是,引用传递是将两个变量的地址相等,值传递是将两个变量的值相等。(数组是引用传递)
这边涉及到函数的传参问题,我们知道函数中定义的是形参,main函数中定义的是实参,形参的改变并不会导致实参改变,因为将实参的值赋给形参时,实际上是值传递,它们并不在一个地址。
但是现在我们可以通过ref,将形参和实参的值传递更改为引用传递,详情见下列代码:
static void Main(string[] args)
{
int num = 5;
//由于我们加了ref,将原本的值传递变为引用传递
//传递的由值变为地址,所以形参的改变会导致实参的改变
Add1(ref num);
Console.WriteLine(num);
Console.ReadKey();
}
static void Add1(ref int num)
{
Console.WriteLine(num);
num += 10;
Console.WriteLine(num);
}
out 关键字通过引用传递参数。 它让形参成为实参的别名,这必须是变量。 换而言之,对形参执行的任何操作都是对实参执行的。
static void Main(string[] args)
{
int a = 5;
int b = 10;
//函数外声明,out参数后面的变量可以不用赋值
int c_max;
int c_min;
int c_sum;
double c_avg;
Number(a, b, out c_sum, out c_max, out c_min, out c_avg);
Console.WriteLine("sum:{0}, max:{1},min:{2},avg:{3}",c_sum,c_max,c_min,c_avg);
Console.ReadKey();
}
//但是函数内,所有情况输出时都必须输出out后面的变量,否则就会报错
static void Number(int a,int b,out int sum,out int max, out int min, out double avg)
{
if (a >= b)
{
max = a;
min = b;
}
else
{
max = b;
min = a;
}
sum = a + b;
avg = sum / 2;
}
注意:
在函数内,所有情况输出时都必须输出out后面的所有变量,否则就会报错。我在写的时候,if的一种情况只给max赋值,没有给min赋值,就报了错。
一定注意是每一种情况下,out的变量都要有值输出。
本文暂时就到这里,主要记录还是自己学习中遇到的一些问题和以及没有注意过的知识点,一些我已经熟练掌握的东西就没有放进去。
第一次使用CSDN写文章还有点不太熟悉,写了好久,如果有什么错误欢迎大家指正。
下次会慢慢把面向对象学习部分的文档也整理出来,同时也会进行Unity3D的学习。