***博主已有C语言基础,所以以下只是一些个人觉得与C语言不同的地方和注意点;***
C#的HelloWorld代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HelloWorld
{
class Program
{
static void Main(string[] args)
{
Console.Write("Hello World!");
Console.ReadKey();
}
}
}
解释:
Console是控制台
WriteLine:写一行
ReadKey:读键,可以暂停我们的程序,等待用户输入一个按键
三种注释
1、单行注释 //
2、多行注释 /* */
3、文档注释 ///
变量与数据类型
1、变量命名必须以字母 _ @ 开头,但是_和@尽量不要使用,因为他们有特殊的意义
2、变量名不能与系统中的关键字重复
3、C#大小写敏感
4、变量的命名规范与其他语言一样,驼峰命名法
5、float类型既能存储整数又能存储小数,它可以精确到7位小数,如果要赋值为小数那么值后面必须要加f。
6、char类型不能存空,只能存一个字符
运算符与表达式
与C语言基本一致,需要注意的点有
1、占位符:
语法结构:{0},{1},{2},在后边按顺序写变量填坑
转义符
\n \" \t \b \\与c语言基本一致
@用在字符串的前面,有两种用途
1、取消“\”在字符串中的转义作用,时期单纯的表示一个斜线,多用于路径
2、将字符串按照原格式输出
类型转换与常量
1、隐式类型转换(可直接转换):转换需要满足两个条件(1)两种类型要兼容,比如都为数值类型(2)原类型要小于目标类型的
2、显示类型转换【强制类型转换】:两个条件:(1)两种类型兼容(2)原类型大于目标类型的
3、int和int相加是int的,int和double相加是double的
4、Convert类型转换:
string num1 = "3.15";
string num2 = "198";
double num3 = Convert.ToDouble(num1);
double num4 = Convert.ToInt32(num2);
Console.WriteLine(num3);//3.15
Console.WriteLine(num4);//198
Console.WriteLine(num3 + num4);//201.15
Console.ReadKey();
小例子:整数加法计算器
Console.WriteLine("请输入加数:");
int a = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("请输入被加数:");
int b = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("{0}+{1}+{2}", a, b, a + b);
Console.ReadKey();
5、常量的语法定义:
const 数据类型 常量名 = 值;//常量不能二次赋值
常量名一般是全大写,如SERVER_IP,PI
数组
1、声明
数据类型[] 数组名;
如:int[] intArray; double[] doubleArray;
2、初始化
数组名 = new 数据类型[数组长度]
声明可以和初始化合二为一:数据类型[] 数组名 = new 数据类型[数组长度];
又或者不指定数组长度:int[] intArray = new int[] {1,2,3,4,5,6,7,8,9};
3、数组长度获取 数组名.length
例如:intArray.length
4、遍历数组的方法 for 或foreach
foreach(int i in intArray)
{
Console.WriteLine(i);
}
5、数组元素的初始值
元素默认值:
int,float,double -> 0
string -> NULL
bool -> false
值类型与引用类型
1、值类型存储在内存中的栈中
int a = 10;
int b = a;
//这时候单独修改b的值,a的值不会改变,这叫做值传递
//这时候变量之间的传递就是拷贝一个值给对方
2、引用类型
数组、字符串
内存:引用类型的值存在内存中的堆中
int[] intA = new int[]{1,2,3,4};
int[] intB= intA;
这个时候单独修改intB中的值,intA的值会发生改变,这种传递叫做引用传递。
这个时候变量之间的传递就是拷贝一个地址给对方。
数组的内存结构
数组在内存中是一块连续的存储空间存储的
二维数组基本语法
1、声明与初始化
声明:数据类型[,] 数组名;
初始化:数组名 = new 数据类型[行数,列数]
例如:int[,] intArray = new int[3,3];
数组取值的时候应该是 intArray[0,0]是第一行第一个元素,并不是C语言的[0][0]
2、获取某个轴向的元素个数
数组名.GetLength(轴向下表);
比如intArray.GetLength(0)获取的横向长度,1则是纵向长度
遍历二维数组
int[,] intArray = new int[,]{
{1,2,3},
{10,20,30},
{100,200,300}
};
for(int i=0;i<intArray.GetLength(0);i++)
{
for(int j=0;j<intArray.GetLength(1);j++)
{
Console.Write(intArray[i, j]+"\t");
}
Console.WriteLine();
}
Console.ReadKey();
结果:
函数的声明
与C语言不同的就是前面要加static,static是静态标识符
static void hello()
{
Console.WriteLine("hello");
}
声明后不调用也是不执行的
函数普通调用
就是简单的值传递,函数里改变参数不会改变形参的值
static void Main(string[] args)
{
int num = 10;
Console.WriteLine(Add10(num));//输出20
Console.ReadKey();
}
static int Add10(int num)
{
num += 10;
Console.WriteLine(num);//输出10
return num;
}
函数ref调用
作用:将一个变量传入一个函数中进行“处理”,“处理”完成后,再将“处理”后的值带出函数。
调用函数,会将函数加载到栈空间中,加了ref,传递的就是一个地址,也就是“”引用传递“”
要求:函数外必须为变量赋值,而函数内可以不赋值
static void Main(string[] args)
{
int num = 10;
Console.WriteLine(Add10(ref num));//输出20
Console.ReadKey();
}
static int Add10(ref int num)
{
num += 10;
Console.WriteLine(num);//输出20
return num;
}
函数out调用
作用:一个函数如果返回多个不同类型的值,就要用到out参数。
要求:函数外可以不为变量赋值,而函数内必须为其赋值。
形参和实参前面都要加out关键字
static void Main(string[] args)
{
//演示:声明一个Number 函数,传入2 个数值,返回最大,最小,和,平均值。
int a = 10;
int b = 5;
int m_max;
int m_min;
int m_total;
double m_avg;
Number(a, b, out m_max, out m_min, out m_total, out m_avg);
Console.WriteLine("Max:{0},Min:{1},Total:{2},Avg:{3}", m_max, m_min, m_total, m_avg);
Console.ReadKey();
}
static void Number(int a, int b, out int max, out int min, out int total, out double avg)
{
//最大,最小.
if (a > b)
{
max = a;
min = b;
}
else
{
max = b;
min = a;
}
//和.
total = a + b;
//平均值.
avg = total / 2;
}
ref和out的异同:(个人心得)
相同点:两者都是按地址传递的,使用后都将改变原来参数的数值。
不同点:ref可以把参数的数值传递进函数,并将修改后的参数返回。但是out是要把参数清空,就是说你从out传递进去的参数会被初始化为0。