C#基础语法(二)

2017-04-11  本文已影响0人  阿飞24

四.CTS类型

C#认可的基本预定义类型并没有内置于C#语言中,而是内置于.NET Framework中。

例如,在C#中声明一个int类型的数据时,声明的实际上是.NET结构System.Int32的一个实例。这表示在语法上,可以把所有的基本数据类型

看成支持某些方法的类。

把int i 转化为string, string s = i.ToString();

在这种便利的语法背后,类型实际上仍存储为基本类型。基本类型在概念上用.NET 结构表示,所以没有性能损失。

C#有15个预定义类型,string,object是引用类型。

五.枚举

public enum TimeDay

{

      Morning=0,

      Afternoon = 1,

      Evening=2

}

1.枚举是用户定义的整数类型。

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

*枚举可以使代码更易于维护,有助于确保给变量指定合法的,期望的值;

*枚举使代码更清晰,用描述性的名称表示整数值,而不是用含义模糊,变化多端的数来表示;

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

TimeDay td =TimeDay.Afternoon;

Console.WriteLine((td.ToString());

注意因为.NET Framework的执行方式,在语法上把枚举当成结构不会造成性能损失。实际上,一旦代码编译好,枚举就成为基本类型,

与int和float类似。

4.从字符串中获取枚举值

TimeDay td = (TimeDay)Enum.Parse(typeof(TimeDay),"afternoon",true);

Console.WriteLine((int)td);

要从字符串中转换,需要使用静态方法Enum.Parse,第一个参数是要使用的枚举类型,第二个是要转换的字符串,第三个是指定在转换时

是否忽略大小写。

Enum.Parse方法实际上返回一个对象引用(一个字符串)————我们需要把这个字符串显示转换为需要的枚举类型(是一个拆箱操作)。

六.名称空间

1.名称空间提供了一种组织相关类和其它类型的方式。与文件和组件不同,名称空间是一种逻辑组合,而不是物理组合。

2.不允许声明嵌套在另一个名称空间中的多部分的名称空间。

3.名称空间与程序集无关。同一个程序集中可以有不同的名称空间,也可以在不同的程序集中定义同一个名称空间中的类型。

4.名称空间的别名

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

该名称空间指定一个别名:

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()方法,编译器就会报错。

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#可以接受任何名称)。

class Program

{

static void Main(string[] args)

{

for (int i = 0; i < args.Length; i++)

{

Console.WriteLine(args[i]);

}

}

}

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

ConsoleApplication1 a b c

a

b

c

八.C#预处理器指令

C#预处理器指令不会转化为可执行代码中的命令,但会影响编译过程的各个方面。例如,使用C#预处理器指令可以禁止编译器编译代码的某一部分。

如果计划发布两个版本的代码,即基本代码和拥有更多功能的企业版本,就可以使用预处理器指令。

C#提供了其它机制来实现C++指令的功能,如定制特性。C#并没有一个像C++那样的独立预处理器,所谓的预处理器指令实际上是由编译器处理的。

尽管这样,C#仍保留了一些预处理器指令名称,因为这些命令会让人觉得就是预处理器。

1.#define和#undef

#define DEBUG

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

时存在。在C#代码中没有任何意义。

#undef DEBUG

删除符号

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

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

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

#if DEBUG

//do something

#endif

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

3.#warning, #error

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

#if DEBUG

#error "you didnot define DEBUG"

#endif

#warning "dont forget to remove"

4.#region和#endregion

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

#region Member Field

int x;

double d;

#endregion

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

5.#pragma

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

#pragma warning disable

int i;

#pragma warning restore

编写中可能存在错误,欢迎读者指正批评,邮箱15734108350@163.com.

上一篇 下一篇

猜你喜欢

热点阅读