C#基本语法简介

目录
  • 一.基础语法
  • 二.变量
  • 三.常量
  • 四.CTS类型
  • 五.枚举
  • 六.名称空间
  • 七.Main()方法
    • 1.多个Main()方法
    • 2.给Main()方法传递参数
  • 八.C#预处理器指令
    • 1.#define和#undef
    • 2.#if,#elif(=else if),#else和#endif
    • 3.#warning, #error
    • 4.#region和#endregion
    • 5.#pragma

一.基础语法

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

  public static void Main()
  {
  //do something
  }

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

二.变量

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

  public static int Main()
  {
      int j =20;
      for(int i=0;i<20;i++)
      {
      int j = 30;
      // do something
      }
  }

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

  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是引用类型。

五.枚举

  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

到此这篇关于C#基本语法的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 浅析C# 基础语法的使用

    .net     是一种多语言的平台,开发.net 可以用多达几十种语言进行.   Java 是一种单语言的平台. 快捷键:   home  移到本行非空白字符前面           end    移到本行结尾 shift   可以多选择字符  通过配合home  end   paUp   paDn Ctrl + home   文本开头              Ctrl +  end   文本结尾 #region   和   #endregion     可以折叠一段代码 MSIL:微软中间

  • C#基础语法:可空类型详解

    以下是System.Nullable<T>在FCL中的定义. [Serializable, StructLayout(LayoutKind.Sequential)] public struct Nullable<T> where T :struct { private Boolean hasValue= false; internal T value= default(T); public Nullable(T value) { this.value= value; this.ha

  • C#基础语法:方法参数详解

    ●值参数 :一个值参数相当于一个局部变量,当使用值参数的时候,将会分配一个新的存储位置,将实参拷贝到该位置,并将该拷贝值传递给该方法.因此,值参数只能将值带进方法,但是不能带出方法,而不会影响实参的值. ●引用参数:当使用引用参数的时候,将不会分配一个新的存储位置,In other words,引用参数能将值带进方法,也能带出方法,因而会影响实参的值.如下例: using System; namespace prg1 { class Paramstest { //值参数使用演示 public s

  • C#学习笔记——基本语法

    基本语法 C#,又名Csharp,天朝喜欢叫C井. C#是一种面向对象的编程语言.在面向对象的程序设计方法中,程序有各种相互交互的对象组成.相同种类的对象通常具有相同的类型,或者说,是在先沟通那个的class中. 例如,以Rectangle(矩形)对象为例,它具有length和width属性.根据设计,它可能需要接受这些属性值,计算面积和详细细节. 让我们来看看一个Rectangle类的实现,并借此套论C#的基本语法 using System; namespace RectangleApplic

  • C#基础语法:as 运算符使用实例

    as 运算符类似于强制转换操作.但是,如果无法进行转换,则 as 返回 null 而非引发异常. as 运算符只执行引用转换和装箱转换.as 运算符无法执行其他转换,如用户定义的转换,这类转换应使用强制转换表达式来执行. expression as type 等效于(但只计算一次 expression) expression is type ? (type)expression : (type)null as 运算符用于在兼容的引用类型之间执行转换.例如: // cs_keyword_as.cs

  • C#基础语法:Base关键字学习笔记

    它与this关键字一样,都是作为类的实例(因此不能调用基类的静态成员和抽象成员)简写或者替代而存在的,只不过this关键字用于替代本类的实例,base关键字用于替代基类的实例,用法很简单,其访问基类的形式如下: base.[标识符] base[[表达式列表]]      这个类型的一看便可以大概猜测多用于基类实例的索引器操作,在我下面演示的代码中你会看到它的用法. 对于  base.[标识符]的访问形式再次说明一下: 对于非虚方法,这种访问仅仅是对基类实例成员的直接访问,完全等价于((base)

  • C#基础语法:结构和类区别详解

    结构和类很相似,也可以包含数据成员和函数成员,但是与类不同,结构是一种值类型,(我们可以理解为一种特殊的值类型所以不存在继承的问题)为其分配数据不需要从托管堆中分配存储器.结构类型的变量直接包含了该结构的数据,而类类型的变量所包含的只是对相应对象的一个引用.  下面总结一下结构和类的不同: 1.结构是值类型,对结构类型的变量赋值将创建所赋值的一个副本. 2.结构实例的默认值不是null,而是具有默认值的初始值. 3.在结构和类中this的意义不一样. 4.结构不支持继承(所以结构成员的声明可访问

  • SixSix翻译的XAML教程 语法简介

    [This topic is pre-release documentation and is subject to change in future releases. Blank topics are included as placeholders.]  XAML 语法简介 本文介绍了如何使用几种不同的方法在XAML中创建对象和设置他们的属性. 主题包括以下几个部分: 什么是XAML?   声明对象  设置属性  其他相关主题 什么是XAML XAML是一种陈述性语言.你可以使用XAML标

  • PHP中的替代语法简介

    替代语法是PHP程序设计中不常见到,有时却又很重要的一个概念.今天本文就以实例形式展示了这一概念的用法. 查看一下wordpress的代码,里面可以见到有些少见的php替代语法,如下所示: <?php else : ?> <div class="entry-content"> <?php the_content( __( 'Continue reading <span class="meta-nav">→</span&

  • Python程序设计入门(1)基本语法简介

    Python是当今日趋流行的一种脚本语言,它比Java更简单,比php更强大,并且还适用于做桌面应用的开发,在ubuntu中,更加是必须的一种脚本引擎,所以有必要去学习一下,这里的文章只针对有一定编程基础,最好是比较熟悉php或javascript的用户,如果没任何基础的新手建议找更详细的教程去学习. Python的变量是不需要定义的,这方面和php一样,它比javascript还是宽松,不过它是用缩进作为段落标识的,作为习惯了C语言风格语法的人,可能一开始会很不习惯使用,但细一想,其实也是很正

  • JsRender for object语法简介

    本文简要讲述了JsRender for object的基本语法.分享给大家供大家参考.具体如下:   JsRender 作为一款JavaScript模版引擎,必不可少的会有循环功能,也就是for,但由于JsRender过于灵活,for竟然可以接受object作为循环对象. {{for Array}}和{{for Object}}都是允许的,{{for Array}}大家都能理解,就是遍历一个数组,逐个取出每个元素.但{{for Object}}就有点让人匪夷所思了,而且官方文档只是举了个没什么帮

  • C#基本语法简介

    目录 一.基础语法 二.变量 三.常量 四.CTS类型 五.枚举 六.名称空间 七.Main()方法 1.多个Main()方法 2.给Main()方法传递参数 八.C#预处理器指令 1.#define和#undef 2.#if,#elif(=else if),#else和#endif 3.#warning, #error 4.#region和#endregion 5.#pragma 一.基础语法 1.C#区分大小写,所以myVar和MyVar是两个不同的变量.2.每个C#可执行文件(如控制台应用

  • ASP.NET中的Razor语法简介

    目录 一.Razor 语法 1. Razor C# 语法规则 2.Razor的作用域 3.Razor和Html混合编写 4.变量 5.数据类型 6.转换数据类型(string类型才能转) 7.循环 8.数组 9.逻辑条件 二.Razor引擎 1.布局(Layout)(@RenderBody()方法) 2.页面(@RenderPage()方法) 3.Section区域(@RenderSection()) 三.Razor 帮助器 自定义Helper Razor 不是一种编程语言.它是服务器端的标记语

  • Perl语法之解析Perl变量使用

    本文和大家重点讨论一下Perl语法中Perl变量的概念,Perl变量分为标量变量,数组变量,联系关系数组变量3类.Perl的变量对巨细写敏感,好比:An,AN,an是3个分歧的变量,可是分歧范例的变量可以利用统一个名字. Perl语法简介 1.Perl变量 1.1.Perl语法中Perl变量分类 Perl变量分为标量变量,数组变量,联系关系数组变量3类.Perl的变量对巨细写敏感,好比:An,AN,an是3个分歧的变量,可是分歧范例的变量可以利用统一个名字,好比:VAR可所以一个标量变量,同时也

  • Ajax+php数据交互并且局部刷新页面的实现详解

    什么是Ajax? 国内翻译常为"阿贾克斯"和阿贾克斯足球队同音,AJAX 是一种用于创建快速动态网页的技术,他不是新语言,而是一种使用现有标准的新方法.通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新,这样就可以在不重新加载整个网页的情况下,对网页的某部分进行更新. XMLHttpRequest 是 AJAX 的基础,用于和服务器交换数据.所有现代浏览器均支持 XMLHttpRequest 对象(IE5 和 IE6 使用 ActiveXObject) 下面这篇文章主

  • PostgreSQL安装、配置及简单使用方法

    一.PostgreSQL简介 1.什么是PostgreSQL PostgreSQL数据库是目前功能最强大的开源数据库,支持丰富的数据类型(如JSON何JSONB类型,数组类型)和自定义类型.而且它提供了丰富的接口,可以很容易地扩展它的功能,如可以在GiST框架下实现自己的索引类型等,它还支持使用C语言写自定义函数.触发器,也支持使用流行的语言写自定义函数,比如其中的PL/Perl提供了使用Perl语言写自定义函数的功能,当然还有PL/Python.PL/Tcl,等等. 2.PostgreSQL数

  • PHP的命令行命令使用指南

    当用户打开php页面时,服务端便执行PHP的命令并将执行结果发送至用户的浏览器中,这类似于ASP和CoildFusion,PHP可以运行在WINDOWS和多种版本的UNIX上.除了能够操作您的页面外,PHP还能发送HTTP的标题. 你可以设置cookie,管理数字签名和重定向用户,而且它提供了极好的连通性到其它数据库(还有ODBC),集成各种 外部库来做用PDF文档解析XML的任何事情.那你还知道可以用php的强大功能做点别的东西吗? 在以独立的cgi方式运行时,需要一个php可执行程序,他有很

随机推荐