热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

01、C#基础语法

基础教程C#概述C#是微软公司推出的一种语法简洁、类型安全的面向对象的编程语言,开发人员可以通过它编写在.NETFramework上运行的各种安全可靠的应用程序。.NET框架是一个

基础教程

C#概述

C#是微软公司推出的一种语法简洁、类型安全的面向对象的编程语言,开发人员可以通过它编写在.NET Framework上运行的各种安全可靠的应用程序。

img

.NET 框架是一个多语言组件开发和执行环境,它提供了一个跨语言的统一编程环境。其中C#是该平台上使用的编程语言之一,类似的还有Visual Basic.NET、Python、j#、Visual C++.NET等。

开发环境一般使用Visual Studio2019或Rider Sharp等集成开发环境。

class Program {
static void Main(string[] args) {
Console.WriteLine("Hello World");
Console.ReadLine();
}
}

使用Rider有些烦人的功能:代码的检查问题和大括号换行的风格,这里记录改进过程:

代码检查:新版点击Rider右下角的铅笔来切换语法检查问题。

括号缩进:File -> Settings -> Code Style -> C# - > Braces Layout,将里面的选项改成:


At end of line(K&R style)



基础语法

C# 语言是在 C、C++ 的基础上发展而来的,因此在语法形式上有些类似。


基本数据类型

C# 语言的数据类型分为值类型和引用类型。


值类型包括整型、浮点型、字符型、布尔型、枚举型等;

引用类型包括类、接口、数组、委托、字符串等。


从内存存储空间的角度而言,值类型的值是存放到栈中的,引用类型首先会在栈中创建一个引用变量,然后在堆中创建对象本身,再把这个对象所在内存的首地址赋给引用变量。

整型

所谓整型就是存储整数的类型,按照存储值的范围不同,C# 语言将整型分成了 byte 类型、short 类型、int 类型、long 类型等,并分别定义了有符号数和无符号数。

有符号数可以表示负数,无符号数仅能表示正数。











































类 型取值范围
sbyte有符号数,占用1个字节,-27〜27-1
byte无符号数,占用1个字节,0〜28-1
short有符号数,占用2个字节,-215〜215-1
ushort无符号数,占用2个字节,0〜216-1
int有符号数,占用4个字节,-231〜231-1
uint无符号数,占用4个字节,0〜232-1
long有符号数,占用8个字节,-263〜263-1
ulong无符号数,占用8个字节,0〜264-1

浮点型

浮点型是指小数类型,浮点型在 C# 语言中共有两种,一种称为单精度浮点型,一种称为双精度浮点型。



















类 型取值范围
float单精度浮点型,占用4个字节,最多保留7位小数
double双精度浮点型,占用8个字节,最多保留16位小数

在 C# 语言中默认的浮点型是 double 类型。如果要使用单精度浮点型,需要在数值后 面加上 f 或 F 来表示:


123.45f、123.45F


字符型和字符串类型

字符只能存放一个字符,占用两个字节,使用char关键字表示。例如 'a'、'中' 等。

字符串长度不固定,使用string关键字表示。例如:例如 "abc"、"123" 等。

在 C# 语言中还有一些特殊的字符串,代表了不同的特殊作用(转义字符)。























































转义字符等价字符
'单引号
"双引号
\反斜杠
\0
\a警告(产生蜂鸣音)
\b退格
\f换页
\n换行
\r回车
\t水平制表符
\v垂直制表符

布尔类型

在 C# 语言中,布尔类型使用 bool 来声明,它只有两个值,即 true 和 false。

布尔类型的值也被经常用到条件判断的语句中,比如三元运算符中使用布尔类型判断:

int result = a > b ? a : b;

注释和折叠

C#中代码的注释和折叠分别如下所示:

代码的折叠



region 和 #endregion

代码如下所示:

#region
private void changeButtonStates(bool flag) {
......
}
#endregion

代码的注释




  1. 单行注释。 以 // 开始,到本行结束。

  2. 多行注释。 /*开始 */结束,之间的都为注释。

  3. 文档注释。用于对类和方法进行注释,在类或方法前面,连续输入3个///


代码如下所示:

///


/// 修改按钮的可用状态
///

///


#region
private void changeButtonStates(bool flag) {
// 这里是方法内部实现
......
}
#endregion

数据类型转换

C#常量数据类型只能是原始数据类型:int、bool、char、double、string等。

其中基本数据类型的转换如下表所示:



































































命令结果
Convert.ToBoolean(val)var转换bool
Convert.ToByte(val)var转换byte
Convert.ToChar(val)var转换char
Convert.ToDecimal(val)var转换decimal
Convert.ToDouble(val)var转换double
Convert.ToInt(val)var转换short
Convert.ToInt32(val)var转换int
Convert.ToInt64(val)var转换long
Convert.ToSByte(val)var转换sbyte
Convert.ToSingle(val)var转换float
Convert.ToString(val)var转换string
Convert.ToUnit13(val)var转换ushort
Convert.ToUnit32(val)var转换unit
Convert.ToUnit64(val)var转换ulong

示例代码如下所示:

class Program {
static void Main(string[] args) {
int i = 10;
Console.WriteLine("十进制转二进制:"+Convert.ToString(i, 2));
Console.WriteLine("十进制转八进制:"+Convert.ToString(i, 8));
Console.WriteLine("十进制转十六进制:"+Convert.ToString(i, 16));
Console.WriteLine("二进制转十进制:"+Convert.ToInt32("1010",2));
Console.WriteLine("八进制转十进制:"+Convert.ToInt32("10",8));
Console.WriteLine("十六进制转十进制:" + Convert.ToInt32("a",16));
Console.ReadKey(true);
}
}

运算符

(1)算数运算符

C#中算数运算符包含如下所示:































运算符说 明
+对两个操作数做加法运算
-对两个操作数做减法运算
*对两个操作数做乘法运算
/对两个操作数做除法运算
%对两个操作数做取余运算

算数运算符相关示例如下所示:

class Program {
static void Main(string[] args) {
Console.WriteLine("千位" + 1234 / 1000);
Console.WriteLine("百位" + 1234 / 100 % 10);
Console.WriteLine("十位" + 1234 / 10 % 10);
Console.WriteLine("个位" + 1234 % 10);
}
}

输出结果如下:


千位1

百位2

十位3

个位4


(2)赋值运算符

赋值运算符中最常见的是等号,除了等号以外还有很多赋值运算符,它们通常都是与其他运算符连用起到简化操作的作用。











































运算符说 明
=x=y,等号右边的值给等号左边的变量,即把变量 y 的值赋给变量 x
+=x+=y,等同于 x=x+y
-=x-=y,等同于 x=x-y
*=x=y,等同于 x=xy
/=x/=y,等同于 x=x/y
%=x%=y,等同于 x=x%y,表示求 x 除以 y 的余数
++x++ 或 ++x,等同于 x=x+1
--x-- 或 --x,等同于 x=x-1

赋值运算符相关示例如下所示:

class Program {
static void Main(string[] args) {
int i = 10;
i++;
i--;
i += 10;
Console.WriteLine(i);
}
}

(3)比较运算符

关系运算符用于实现对两个值的比较运算,关系运算符在完成对两个操作数的比较运算后会返回一个代表运算结果的布尔值。



































运算符说 明
==表示两边表达式运算的结果相等,注意是两个等号
!=表示两边表达式运算的结果不相等
>表示左边表达式的值大于右边表达式的值
<表示左边表达式的值小于右边表达式的值
>=表示左边表达式的值大于等于右边表达式的值
<=表示左边表达式的值小于等于右边表达式的值

使用比较运算符运算的结果是布尔型的值,因此经常将使用比较运算符的表达式用到逻辑运算符的运算中。

class Program {
static void Main(string[] args) {
Console.WriteLine("10是否为偶数:" + ((10 % 2) == 0));
}
}

(4)逻辑运算符

逻辑运算符主要包括与、或、非等,它主要用于多个布尔型表达式之间的运算。



























运算符含义说明
&&逻辑与如果运算符两边都为 True,则整个表达式为 True,否则为 False;如果左边操作数为 False,则不对右边表达式进行计算,相当于“且”的含义
||逻辑或如果运算符两边有一个或两个为 True,整个表达式为 True,否则为 False;如果左边为 True,则不对右边表达式进行计算,相当于“或”的含义
!逻辑非表示和原来的逻辑相反的逻辑

在使用逻辑运算符时需要注意逻辑运算符两边的表达式返回的结果都必须是布尔型的。

class Program {
static void Main(string[] args) {
Console.WriteLine("2021年是否是闰年:" + ((2021 % 4 == 0) && (2021 / 100 != 0) || (2021 % 400 == 0)));
}
}

(5)位运算符

所谓的位运算,通常是指将数值型的值从十进制转换成二进制后的运算,由于是对二进制数进行运算,所以使用位运算符对操作数进行运算的速度稍快。

位运算包括与、或、 非、左移、右移等,具体的表示符号如下表所示。







































运算符说 明
&按位与。两个运算数都为 1,则整个表达式为 1,否则为 0;也可以对布尔型的值进行比较,相当于“与”运算,但不是短路运算
|按位或。两个运算数都为 0,则整个表达式为 0,否则为 1;也可以对布尔型的值进行比较,相当于“或”运算,但不是短路运算
~按位非。当被运算的值为 1 时,运算结果为 0;当被运算的值为 0 时,运算结果为 1。该操作符不能用于布尔型。对正整数取反,则在原来的数上加 1,然后取负数;对负整数取反,则在原来的数上加 1,然后取绝对值
^按位异或。只有运算的两位不同结果才为 1,否则为 0
<<左移。把运算符左边的操作数向左移动运算符右边指定的位数,右边因移动空出的部分 补 0
>>有符号右移。把运算符左边的操作数向右移动运算符右边指定的位数。如果是正值,左侧因移动空出的部分补 0;如果是负值,左侧因移动空出的部分补 1
>>>无符号右移。和 >> 的移动方式一样,只是不管正负,因移动空出的部分都补 0

在上面列出的运算符中比较常用的是左移运算符和右移运算符。

class Program {
static void Main(string[] args) {
// 使用位运算符计算 2 的立方
Console.WriteLine("2的立方为:" + (2 <<2));
}
}

(6)三元运算符

三元运算符也被称为条件运算符,与后面要学习的 if 条件语句非常类似。


布尔表达式 ? 表达式 1: 表达式 2


其中:




  • 布尔表达式:判断条件,它是一个结果为布尔型值的表达式。

  • 表达式 1:如果布尔表达式的值为 True,该三元运算符得到的结果就是表达式 1 的运算结果。

  • 表达式 2:如果布尔表达式的值为 False,该三元运算符得到的结果就是表达式 2 的运算结果。


需要注意的是,在三元运算符中表达式 1 和表达式 2 的结果的数据类型要兼容。

class Program {
static void Main(string[] args) {
Console.WriteLine("10为:" + (10 % 2 == 0 ? "偶数" : "奇数"));
}
}

运算符的优先级不用太在意,一般开发中都会使用括号的方式来改变运算顺序。


变量和常量


变量

变量和常量是相对的:变量是指所存放的值是允许改变的,而常量表示存入的值不允许改变。


数据类型 变量名;


变量的使用示例如下所示:

class Program {
static void Main(string[] args) {
int num = 100;
double num1 = 100.123;
bool isFlag = true;
String name = "Hello";
Console.WriteLine("num1:" + num1);
Console.WriteLine("num:" + num);
Console.WriteLine("isFlag:" + isFlag);
Console.WriteLine("name:" + name);
}
}

变量命名方法有两种,一种是 Pascal 命名法(帕斯卡命名法),另一种是 Camel 命名法(驼峰命名法)。


常量

常量在第一次被赋值后值就不能再改变。定义常量需要使用关键字 const 来完成。


const 数据类型 常量名 = 值;


分别求圆的面积和周长,并使用常量存放 π 的值,将 π 的值定义为3.14。

class Program {
static void Main(string[] args) {
const double PI = 3.14;
int r = 3;
Console.WriteLine("圆的周长是:" + 2 * PI * r);
Console.WriteLine("圆的面积是:" + PI * r * r);
}
}

注意:常量在开发中一般都使用大写的方式,例如PI、FLAG等。


条件语句


if...else...语句

if else 语句是最常用的条件语句,并且 if else 语句的形式有多种:


if (){xxx}

if(){xxx}else{xxx}

if(){xxx} else if(){xxx}else{xxx}


示例代码如下所示:

class Program {
static void Main(string[] args) {
Console.WriteLine("请输入一个整数:");
int num = int.Parse(Console.ReadLine());
if (num % 2 == 0) {
Console.WriteLine(num + "是偶数");
} else {
Console.WriteLine(num + "是奇数");
}
}
}

还有一种if(){xxx} else if(){xxx}else{xxx}的结构代码如下:

class Program {
static void Main(string[] args) {
Console.WriteLine("请输入一个整数:");
int num = int.Parse(Console.ReadLine());
if (num == 1) {
Console.WriteLine(num + "是1");

}else if(num == 2) {
Console.WriteLine(num + "是2");
}
else {
Console.WriteLine(num + "未知");
}
}
}

流程语句不但可以多次判断,还可以进行嵌套使用。


switch-case语句

switch case 语句也是条件语句的一种,在判断条件的选择上会有一些局限性。

switch(表达式) {
case 值 1:
语句块 1;
break;
case 值 2:
语句块 2;
break;
...
default:
语句块 n;
break;
}

其中case代表条件的分支,而default是默认的可以省略。

示例代码如下所示:

class Program {
static void Main(string[] args) {
Console.WriteLine("请输入学生考试的成绩(0~100的整数)");
int points = int.Parse(Console.ReadLine());
switch (points / 10) {
case 10:
Console.WriteLine("优秀");
break;
case 9:
Console.WriteLine("优秀");
break;
case 8:
Console.WriteLine("良好");
break;
case 7:
Console.WriteLine("及格");
break;
case 6:
Console.WriteLine("及格");
break;
default:
Console.WriteLine("不及格");
break;
}
}
}

循环语句

循环语句和条件语句一样都是每个程序中必不可少的,循环语句是用来完成一些重复的工作的,以减少编写代码的工作量。


for循环

for 循环是最常用的循环语句,语法形式非常简单,多用于固定次数的循环。

for(表达式 1; 表达式 2; 表达式3){
表达式 4;
}

其中表达式的解析如下:




  • 表达式 1:为循环变量赋初值。

  • 表达式 2:为循环设置循环条件,通常是布尔表达式。

  • 表达式 3:用于改变循环变量的大小。

  • 表达式 4:当满足循环条件时执行该表达式 4


使用循环输出 1~10 的数,并输出这 10 个数的和。

class Program {
static void Main(string[] args) {
int sum = 0;
for (int i = 0; i <= 10; i++) {
sum += i;
}
Console.WriteLine("1~10的和是:" + sum);
}
}

使用嵌套for循环打印九九乘法表:

class Program {
static void Main(string[] args) {
for(int i = 1; i <10; i++) {
for(int j = 1; j <= i; j++) {
Console.Write(i + "x" + j + "=" + i*j + "\t");
}
Console.WriteLine();
}
}
}

while循环

while循环

while 循环与 for 循环类似,但是 while 循环一般适用于不固定次数的循环。

while(布尔表达式){
语句块;
}

hile 语句执行的过程是,当 while 中布尔表达式的结果为 True 时,执行语句块中的内容,否则不执行。

使用 while 循环输出 1~10 的数并输出 1~10 的和。

class Program {
static void Main(string[] args) {
int i = 1;
int sum = 0;
while (i <= 10) {
sum = sum + i;
i++;
}
Console.WriteLine("1~10的和为:" + sum);
}
}

do...while循环

do while 循环是先执行一次,再进行循环,也就是至少会执行一次。

do {
语句块;
}while(布尔表达式);

do while 语句执行的过程是,先执行 do{} 中语句块的内容,再判断 while() 中布尔表达式的值。

使用 do while 循环输出 1~10 的数。

class Program {
static void Main(string[] args) {
int i = 1;
do {
Console.WriteLine(i);
i++;
} while (i <= 10);
}
}

中断循环

C#提供break、continue、goto等关键字用来中断循环的操作。

break

break 语句用于中断循环,使循环不再执行。如果是多个循环语句嵌套使用,则 break 语句跳出的则是最内层循环。

使用 for 循环输出 1~10 的数,当输出到 4 时结束循环。

class Program {
static void Main(string[] args) {
for (int i = 0; i <= 10; i++) {
if (i == 4){
break;
}
Console.WriteLine(i);
}
}
}

continue

continue 语句不是强制终止,continue 会跳过当前循环中的代码,强制开始下一次循环。

在 for 循环中当值迭代到 4 时使用 continue 结束本次迭代,继续下一次迭代,代码如下。

class Program {
static void Main(string[] args) {
for (int i = 0; i <= 10; i++) {
if (i == 4) {
continue;
}
Console.WriteLine(i);
}
}
}

goto

goto 语句用于直接在一个程序中转到程序中的标签指定的位置,标签实际上由标识符加上冒号构成。

如果要跳转到某一个标签指定的位置,直接使用 goto 加标签名即可。

class Program {
static void Main(string[] args) {
int x = 10;
Console.WriteLine("x = {0}", x);
if (x == 10) {
x = 20;
goto A;
}
x = x + 1;
for (int i = 0; i <5; i++) {
Console.WriteLine(i);
}
A:Console.WriteLine("x = {0}", x);
}
}

由于goto语句直接跳转到A处,所以中间的循环没有执行,输出结果如下:


x = 10

x = 20




推荐阅读
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 从零学Java(10)之方法详解,喷打野你真的没我6!
    本文介绍了从零学Java系列中的第10篇文章,详解了Java中的方法。同时讨论了打野过程中喷打野的影响,以及金色打野刀对经济的增加和线上队友经济的影响。指出喷打野会导致线上经济的消减和影响队伍的团结。 ... [详细]
  • Java值传递机制的说明及示例代码
    本文对Java值传递机制进行了详细说明,包括形参和实参的定义和传递方式,以及通过示例代码展示了交换值的方法。 ... [详细]
  • 怎么在PHP项目中实现一个HTTP断点续传功能发布时间:2021-01-1916:26:06来源:亿速云阅读:96作者:Le ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
author-avatar
村医医治世界经济
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有