page contents

C#基本语法介绍

本文讲述了C#基本语法介绍!具有很好的参考价值,希望对大家有所帮助。一起跟随六星小编过来看看吧,具体如下:

attachments-2022-10-HYEd7KJk634a158377c2d.png

本文讲述了C#基本语法介绍!具有很好的参考价值,希望对大家有所帮助。一起跟随六星小编过来看看吧,具体如下:

一.基础语法

1.C#区分大小写,所以myVar和MyVar是两个不同的变量。
2.每个C#可执行文件(如控制台应用程序,Windows应用程序和Windows服务)都必须有一个入口点————Main()(M大写)

1
2
3
4
public static void Main()
{
//do something
}

在程序启动时调用这个方法。该方法要么没有返回值(void),要么返回一个整数(int)

二.变量

1.编译器不允许在表达式中使用未初始化的变量。如果变量是类或结构中的字段,如果没有初始化,创建这些变量时,其默认值就是0。
2.类型推断
类型推断(type inference)使用var关键字。编译器可以根据变量的初始化值“推断”变量的类型。var somenum = 0;即使somenum从来没有声明为int,编译器也可以确定,只要somenum在其作用域内,就是一个int.声明了变量,推断出了类型后,就不能改变变量类型了。变量的类型确定后,就遵循其它变量类型遵循的强类型化规则。
3.变量的作用域
变量的作用域是访问该变量的代码区域。只要变量的作用域是程序的不同部分就不会有问题。
(1).局部变量的作用域冲突

1
2
3
4
5
6
7
8
9
public static int Main()
{
    int j =20;
    for(int i=0;i<20;i++)
    {
    int j = 30;
    // do something
    }
}

编译时会报错,因为在Main()方法作用域内有两个变量j,编译器无法区分这两个变量。
(2).字段和局部变量的作用域冲突
某些情况下可以区分名称相同,作用域相同的两个标识符。原因是C#在变量之间有一个基本的区分,它把在类级别声明的变量看作字段,而把在方法中声明的变量看作局部变量。

1
2
3
4
5
6
7
8
9
10
class Program
{
    int j = 20;
    static void Main(string[] args)
    {
      int j = 30;
      Console.WriteLine(j);
      Console.ReadKey();
    }
}

虽然在Main()方法的作用域内声明了两个j,这段代码也会编译。在类级别上定义的j,在该类删除前是不会超出作用域的,在Main()中声明的j隐藏了同名的类级别变量,所以运行代码时会显示30.

三.常量

顾名思义,常量是其值在使用过程中不会发生改变的变量。在声明和初始化变量时,在变量的前面加上关键字const,就可以把该变量指定为一个常量:const int a =100;
常量的特点;

  • *常量必须在声明时初始化。指定了值之后就不能改写了。
  • *常量的值必须能在编译时用于计算。因此不能用于从一个变量中提取的值来初始化常量。如果需要,应使用只读字段(后面介绍)。
  • *常量总是静态的。但注意,不必(实际上不允许)在常量声明中包含static

使用常量的好处:

  • *由于使用易于读取的名称(名称的值易于理解)代替了较难读取的数字或字符串,常量使程序变得更易于阅读。
  • *常量使程序易于修改。当常量的值需要修改时,只需要把新值赋给这个常量,不必查找整个程序去修改。
  • *常量更容易避免程序出现错误。如果在声明常量的位置以外的地方给常量赋值,编译器会报错。

四.CTS类型

C#认可的基本预定义类型并没有内置于C#语言中,而是内置于.NET Framework中。
例如,在C#中声明一个int类型的数据时,声明的实际上是.NET结构System.Int32的一个实例。这表示在语法上,可以把所有的基本数据类型看成支持某些方法的类。
把int i 转化为string, string s = i.ToString();
在这种便利的语法背后,类型实际上仍存储为基本类型。基本类型在概念上用.NET 结构表示,所以没有性能损失。
C#有15个预定义类型,string,object是引用类型。

五.枚举

1
2
3
4
5
6
public enum TimeDay
{
    Morning=0,
    Afternoon = 1,
    Evening=2
}

1.枚举是用户定义的整数类型。
2.从长远来看,创建枚举可以节省大量时间,减少许多麻烦。使用枚举比使用整数的优势:

  • *枚举可以使代码更易于维护,有助于确保给变量指定合法的,期望的值;
  • *枚举使代码更清晰,用描述性的名称表示整数值,而不是用含义模糊,变化多端的数来表示;

3.在C#中,枚举的真正强大之处是它们在后台会实例化为派生于基类System.Enum的结构。这表示可以对它们调用方法,执行有用的任务。

1
2
TimeDay td =TimeDay.Afternoon;
Console.WriteLine((td.ToString());

注意因为.NET Framework的执行方式,在语法上把枚举当成结构不会造成性能损失。实际上,一旦代码编译好,枚举就成为基本类型,与int和float类似。
4.从字符串中获取枚举值

1
2
TimeDay td = (TimeDay)Enum.Parse(typeof(TimeDay),"afternoon",true);
Console.WriteLine((int)td);

要从字符串中转换,需要使用静态方法Enum.Parse,第一个参数是要使用的枚举类型,第二个是要转换的字符串,第三个是指定在转换时是否忽略大小写。
Enum.Parse方法实际上返回一个对象引用(一个字符串)————我们需要把这个字符串显示转换为需要的枚举类型(是一个拆箱操作)。

六.名称空间

  • 1.名称空间提供了一种组织相关类和其它类型的方式。与文件和组件不同,名称空间是一种逻辑组合,而不是物理组合。
  • 2.不允许声明嵌套在另一个名称空间中的多部分的名称空间。
  • 3.名称空间与程序集无关。同一个程序集中可以有不同的名称空间,也可以在不同的程序集中定义同一个名称空间中的类型。
  • 4.名称空间的别名

如果名称空间的名称很长,又要在代码中多次引用,但不希望该名称空间的名称包含在using指令中(例如,避免类名冲突),就可以给
该名称空间指定一个别名:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
using System.Text;
using System.Threading.Tasks;
 
namespace Wrox.ProC.basic
{
  class NameSpaceEx
  {
 
  }
}
 
namespace ConsoleApplication1
{
  using Intro = Wrox.ProC.basic;//给Wrox.ProC.basic指定别名Intro
  class Program
  {
 
    static void Main(string[] args)
    {
      Intro::NameSpaceEx nex = new Intro.NameSpaceEx();//实例化NameSpaceEx对象,要使用::修饰符
    }
 
 
  }
}

七.Main()方法

C#程序是从Main()方法开始执行的,这个方法必须是类或结构的静态方法,并且其返回类型必须是int或void。

1.多个Main()方法

在编译C#控制台或Windows应用程序时,默认情况下,编译器会在类中查找与上述签名匹配的Main()方法,并使这个类方法称为程序的入口。
如果有多个Main()方法,编译器就会报错。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
namespace Wrox
{
  class Client
  {
    public static int Main()
    {
      MathEx.Main();
      return 0;
    }
  }
 
  class MathEx
  {
    static int Add(int x,int y)
    {
      return x+y;
    }
 
    public static int Main()
    {
      int i = Add(5,10);
      return i;
    }
  }
}

但是可以使用/main选项,后跟Main()方法所属类的全名(包括名称空),明确告诉编译器把哪个方法作为程序的入口:

csc ConsoleApplication1.cs /main:Wrox.MathEx

2.给Main()方法传递参数

在调用程序时,可以让CLR包含一个参数,将命令行参数传递给程序。这个参数是一个字符串数组,传统上称为args(但C#可以接受任何名称)。

1
2
3
4
5
6
7
8
9
10
11
class Program
{
  static void Main(string[] args)
  {
    for (int i = 0; i < args.Length; i++)
    {
      Console.WriteLine(args[i]);
    }
 
  }
}

使用命令行就可以编译这段代码。

1
2
3
4
ConsoleApplication1 a b c
a
b
c

八.C#预处理器指令

C#预处理器指令不会转化为可执行代码中的命令,但会影响编译过程的各个方面。例如,使用C#预处理器指令可以禁止编译器编译代码的某一部分。
如果计划发布两个版本的代码,即基本代码和拥有更多功能的企业版本,就可以使用预处理器指令。
C#提供了其它机制来实现C++指令的功能,如定制特性。C#并没有一个像C++那样的独立预处理器,所谓的预处理器指令实际上是由编译器处理的。
尽管这样,C#仍保留了一些预处理器指令名称,因为这些命令会让人觉得就是预处理器。

1.#define和#undef

1
#define DEBUG

它告诉编译器存在给定名称的符号,类似声明一个变量,但没有真正的值,只是存在而已。这个符号不是实际代码的一部分,而只是在编译器编译代码
时存在。在C#代码中没有任何意义。

1
#undef DEBUG

删除符号
#define 本身没有什么用,与其它预处理器指令(特别是#if)结合使用时,它的功能就很强大。

2.#if,#elif(=else if),#else和#endif

这些指令告诉编译器是否要编译某个代码块

1
2
3
#if DEBUG
//do something
#endif

#if,#elif还支持逻辑运算符“!”,"==","!=","||",与或...

3.#warning, #error

当编译器遇到它们时,会分别产生这两个指令后面的文本作为警告或错误。

1
2
3
4
#if DEBUG
#error "you didnot define DEBUG"
#endif
#warning "dont forget to remove"

4.#region和#endregion

#region和#endregion用于把一段代码标记为又给定名称的一个块

1
2
3
4
#region Member Field
int x;
double d;
#endregion

它们可以被某些编译器识别。

5.#pragma

#pragma指令可以抑制或还原指定的编译警告。

1
2
3
#pragma warning disable
int i;
#pragma warning restore

到此这篇关于C#基本语法的文章就介绍到这了。

更多相关技术内容咨询欢迎前往并持续关注六星社区了解详情。

长按或扫描下方二维码,免费获取 Python公开课和大佬打包整理的几百G的学习资料,内容包含但不限于Python电子书、教程、项目接单、源码等等

attachments-2022-10-kwwbZ9WG6347756cbf77c.jpg

  • 发表于 2022-10-15 10:06
  • 阅读 ( 261 )
  • 分类:C/C++开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
轩辕小不懂
轩辕小不懂

2403 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. Pack 1131 文章
  3. 小柒 1046 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章