第03篇:C#星夜拾遗之语法基础

了解C#的基本语法,这是学习一门语言的必经之路。这些基本语法包括:数据类型、运算符和表达式、流程控制、字符串、类和对象、结构和枚举、命名空间等。本文主要列举出来笔者觉得算得上基础知识的内容。对于本文中的一些内容的详细讲解,可以参照anytao的博文系列:你必须知道的.NET

    特别说明:本文多为网上摘抄或者之前的笔记,存在一定的不连贯,读者可以根据自己的实际情况,在百度或者Bing中查找更好的文章。

 

数据类型

 

 

值类型和引用类型的区别:值类型存放在栈(heap)中,引用类型存放在堆(stock)中;对于引用类型来说,两个变量可以同时引用同一个对象,这样若对一个变量修改,就会影响另一个变量的值。而对于值类型来说,不会产生这样的结果。

内置类型:

内置类型包括:int,long,float,double,decimal,string,char,bool

说明:它们是通用类型系统(Common Type System)定义的基本类型。它们只需要声明和初始化后就可以使用。不需要用new运算符来实例化,因为他们在变量定义进入范围是在堆栈中分配,同样,当离开所在情景时,自动解除分配。

宽度窄的(即字节数少的)数据类型可以直接赋给较宽的数据类型,并会自动转换为新类型。例:float a = 9.9f;  int b=4; a = b; 上述把一个整型的4转换成了浮点型,同样也可以通过强制类型转换将宽类型的缩成窄类型例: float a = 9.9f; int b=4; b = (int)a; 注意必须把要转换的类型名称放在圆括号内,并放在其前面字符串与数值互换: string a = Convert.ToString(b); float a = Convert.ToSingle(b);

引用类型:

Object类型:它是所有类型的基类。C#中所有的类都是直接或间接从object类型派生出来的。Object关键字其实是预定义的System.object类的别名,在程序中用object或System.object都具有一样的作用。

Class类型:它是一个类定义,包含数据成员(常量、字段和事件)和函数成员(方法、属性、索引、操作符、构造函数和析构函数)。类支持继承。

String类型:它是直接从object类派生的一个封装类。String类实例表示的是Unicode字符串。同样,string类型其实是预定义的System.String类的别名,在程序中使用string或System.String作用是一样的。

Interface接口类型:其实是一种大家需要共同遵守的协议。实现某种接口的类或结构必须遵守此协议。一个接口可以派生于多个基接口,同时,一个类或结构可以实现多个接口。

Array 数组类型:它也是一种数据结构,但必须利用索引才能访问其数据,即数组元素。数组中所有的元素都具有相同的类型,称之为数组元素类型。数组元素可以使任意类型包括数组类型。C#中的数组是从抽象类System.Array中派生的应用类型。

Delegate代理类型:它有两种情况,一种是引用对象的一个静态方法,另一种是引用一个对象的实例以及此对象的实例方法。其实它与C中的函数指针非常相似。但函数指针只能引用静态函数,而C#代理既可以引用静态的方法,也可以引用实例方法。

 

运算符

C# 运算符类型:

算术运算符号: +、-、*、/、%

逻辑运算符: &、|、~、^、!、&&、||、true、false

字符串连接运算符: +

自加、自减运算符:++、--

移位运算符:<<、>>

关系运算符:==、!=、<、>、<=、>=

赋值运算符:=、+=、-=、*=、/=、&=、|=、^=、<<=、>>=

成员访问运算符:.

下标运算符号:[ ]

强制类型转换运算符:( )

代理连接和移走运算符:+ -

对象运算符:new

类型信息运算符:is 、sizeof 、typeof

溢出异常控制运算符:checked 、unchecked

间接取地址运算符:*、->、[]、&

三元运算符号 int a = 10;  string strRusult = (a > 17) ? "大于" : "小于"

运算符优先级和综合性

!NOT

*、/、%

+、-

<、<=、>、>=

==、!=

&& 、||

=

溢出说明:

对于整数运算溢出,如果有checked运算符指定,则抛出异常OverflowException,如果有unchecked运算符指定则丢弃最高位;

浮点算术运算发生溢出或0除时,不抛出异常;

小数算术运算发生溢出抛出OverflowException异常,如果0除,将抛出DevideByZeroException。

 

表达式

表达式是可以计算且结果为单个值、对象、方法或命名空间的代码片段。

表达式可以包含文本值、方法调用、运算符及其操作数,或简单名称。简单名称可以是变量、类型成员、方法参数、命名空间或类型的名称。

表达式可以使用运算符,而运算符又可以将其他表达式用作参数,或者使用方法调用,而方法调用的参数又可以是其他方法调用,因此表达式既可以非常简单,也可以非常复杂。如:int i = 5;  string s = "Hello World";

下面是几种特殊的表达式:

成员访问表达式: E.I (E是名字空间或预定义的一个类型, I是可访问的成员名称)

元素访问表达式: P[A] (P是一个数组名称或一个类、结构和接口变量,A是一个下标访问参数)

this表达式:this表达式仅允许在一个类型的构造函数、实例方法或一个实例访问器中使用

base表达式:base访问表达式用于访问被当前类或者结构隐藏了的基类的成员。Base表达式允许在构造函数、实例方法或者实例访问器中使用。对于base.I形式,I必须是基类的一个成员;对于base[E],E必须是基类中存在的、可用的下标指示器。

new表达式:它为某类型创建一个实例。包括:创建对象新实例、创建数组新实例、代理创建实例

 

流程控制

    选择控制语句

if语句:它有三种基本形式:单条选择, 如果/否则,以及多情形选择。关键词包括:if、else 、else if

switch语句:

1、语法结构:

switch (expression)

{

        case label1 :

          [statementlist1]

          [break;]

              [ ...

      [ case labelN :

          [statementlistN]

          [break;] ] ]

   [ default :

                  [statementlistDefault]]

}

2、使用switch语句遵循规则:

Switch表达式必须是以下类型中的一种: sbyte,byte,short,ushort, int,uint,long,ulong,char,string,或者enum类型,不能对任何其他类型使用switch语句。

case标号必须是常数表达式,如42或“42”。如果需要在执行时计算case标号,必须使用if语句来替代switch。

case标号不允许相同的值写两个case标号。如果想要对多个值执行相同的语句,必须为每个值重复case标号语法。没有简便的方法来组合一个case标号值。

在switch表达式后面是个switch 块, 当Switch表达式的值同某一个case后面的常量表达式的值相匹配时,就执行此case后面的语句,直到遇到"break"语句或者"goto"语句为止。每个分支以关键字"case"作为标号,其后为常量表达式,然后是分号(:)。

可以在所有的分支选择的后面加上一个"default"分支。如果没有匹配的常量表达式,就进入default分支,并执行该分支的语句。虽然default标号是可选的,我建议你加上该分支。这将有助于处理一些意外事件 ,使得你的程序能够捕捉和处理不可预见的事件,从而使得程序更加可靠。

每个"case"标号必须以"break"语句作为结束。"break"语句将使得程序退出switch语句,并从switch块后面的一条语句开始执行。

对于"default"标号来说,"break"语句是可选的,因为有"break"语句和没有"break"语句,其运行结果是一样的。

 

循环控制

循环控制语句主要包括:"while" 循环、"do" 循环、"for" 循环、"foreach"循环。

"while"循环语句

1、程序例

class Whileloop

{

public static void Main()

{

int  intI= 0;

 

while (intI < 10)

{

Console.Write("{0} ", intI);

intI ++;

}

 

Console.WriteLine();

}

}

 

2、说明:

上面是一个简单的while 循环例子。以关键字"while"开始,后面是个布尔表达式,(所有的控制语句都使用了布尔表达式)这就意味着表达式必须计算出true 或者false值。本例中,我们将检查intI变量,看看它是否小于10。 因为intI已经初始化为0,第一次计算时,该布尔表达式将返回true值。一旦布尔表达式的值为true,将执行该布尔表达式后面块中的语句。

在while块中,我们把数字和空格输出到控制台中,之后,对 intI进行加1运算。一旦执行了while块中的语句之后,再次计算布尔表达式的值,这种情况将一直循环下去,直到该布尔表达式的值为false为止。 一旦布尔表达式的值为false, 程序将从while 块之后的第一条语句开始执行。在本例中,我们把数字0到9输出到控制台中,之后退出while块,再输出一个新行到控制台。

"do"循环语句

1、程序例:

class Whileloop

{

 

public static void Main()

{

int  intI= 0;

 

do

{

Console.Write("{0} ", intI);

intI ++;

} while (intI <10)

 

Console.WriteLine();

}

}

2、说明:

      "do" 循环的格式是: do { <语句> } while (<布尔表达式>);其中的语句可以是任何合法的C#语句,布尔表达式同以前的规定一样,其返回值要么为true,要么为false。

      "do" 循环可以保证:循环体中的语句至少执行一次。与此相对应的是:"while" 循环一开始时,计算布尔表达式的值,"while" 循环不能保证循环体中的语句能够至少执行一次。

"for" 循环语句

1、   程序例

class Forloop

{

public static void Main()

{

for (int i=0; i < 20; i++)

{

if (i == 10)

break;  //跳出循环

if (i % 2 == 0)

continue; //不执行本次循环体以后的语句,继续新的循环

Console.Write("{0} ", i);

}

Console.WriteLine();  //只打印出1,3,5,7,9这五个数字

}

}

2、   说明:

当已经精确地知道循环的次数时, For 循环语句就派上了用场。"for" 循环中,括号中内容由三个由分号隔开的部分: "(<初始化表>; <布尔表达式>; <post-loop 动作表>)"组成。

初始化表是个由逗号隔开的表达式,在"for" 循环的整个周期中,这些表达式仅仅计算一次。计算是在一开始进行的,并且在循环语句的执行之前进行。

一旦进行初始化后, "for" 循环就进入第二部分:布尔表达式的计算。 这里的布尔表达式可以写得很复杂,但是结果只能是true或者false。布尔表达式通常用来验证计数器变量的状态。

一旦布尔表达式的值为true时,就会执行"for" 循环大括号中的语句。通常情况下,这些语句从左大括号开始,不中断地一直执行到右大括号。但在上面的程序例中有几个例外,几个"if"语句改变了程序的流程。

第一个"if"语句检查"i"是否等于10,这里使用了"break"语句,可在此处跳出循环,转入 "for"块后面的第一条语句的执行。

第二条"if"语句使用了求余运算符,看看"i"是否能够被2整除,如果余数等于0,就执行 "continue"语句。控制将跳过循环体中余下的语句,转入下一轮新的循环。你需要在块中正确地组织好语句,一旦满足有关条件,就执行相应的语句。

一旦程序流程遇到continue语句,或者遇到块的结尾处的右括号, 就转入"for" 循环括号中的第三项:post-loop 动作表,该表由逗号隔开,在"for"块中的语句都执行完毕之后,就执行该动作表中的动作。

 

"foreach"循环语句

1、   程序例

class ForEachloop

{

public static void Main()

{

//定义一个数组

string[] names = {"Cheryl", "Joe", "Matt", "Robert"};

 

//打印出数组中所有元素

foreach (string person in names)

{

Console.WriteLine("{0} ", person);

}

}

}

 

2、   说明

"foreach" 循环列举出集合中所有的元素。上面程序例所使用的数组类型,就是这样的一个集合。(在"System.Collections"也可以由其他的数据类型作集合。). 在Main()方法中,我们所做的第一件事是:定义由四个字符串组成的数组names。

"foreach"括号中的表达式是由关键字in隔开的两个项组成。in右边的项是集合名,in左边的项是变量名,用来存放该集合中的每个元素。

该循环的运行过程如下:每一次循环时,从集合中取出一个新的元素值,放到只读变量中去,括号中的整个表达式返回值为true, "foreach"块中的语句就能够执行。一旦集合中的元素都已经被访问到,整个表达式的值为false,控制流程就转入到 "foreach" 块后面的第一条可执行语句。

 

其它控制语句

break:跳出循环

continue:结束本次循环,继续下一次循环

goto:跳转语句

retun:如果return 语句包围在带有finally块的一个或多个try块中,程序控制首先将被传递到最内层try块的finally块。如果程序控制已经达到一finally块的结束点,那么接下来,它将被传递到上一层try语句的finally块

throw:抛出一个异常

lock:它主要用于多线程间共享变量的同步处理。作用是对一个对象加上互斥锁。

using:C#的using语句包含一个或多个资源。一个资源就是实现了System.IDisposable接口的一个类或结构。它的处理过程是执行一条语句,然后释放该资源。在C#编译时,编译器会将using语句转换为三个部分:资源获取、资源使用、资源释放。资源的使用是包围一个带有finally语句的try语句。这个finally语句释放资源。如果获取资源的结果为null,那么finally语句中将不会调用Dispose方法,也不会抛出任何异常。

 

类和命名空间

结构和枚举

异常处理

数组、字符串

泛型、集合

………………

 

 

基础知识实在是太多了,如果你还没有学会,赶快装上MSDN,用到哪里查到哪里,这样即快速,又准确。

 如果认为此文对您有帮助,别忘了支持一下哦!

作者:齐飞

来源:http://youring2.cnblogs.com/

声明:本博客原创文字只代表本人工作中在某一时间内总结的观点或结论,与本人所在单位没有直接利益关系。非商业,未授权,贴子请以现状保留,转载时必须保留此段声明,且在文章页面明显位置给出原文连接。

转载:http://www.cnblogs.com/youring2/archive/2010/05/14/1735773.html

时间: 2024-11-01 20:26:55

第03篇:C#星夜拾遗之语法基础的相关文章

Java语法基础之for语句练习

以下是对Java语法基础中的for语句进行了详细介绍,需要的朋友可以过来参考下   控制语句--for练习语句的嵌套应用 累加求和,计数器 循环嵌套一.语句的嵌套应用语句嵌套形式.其实就是语句中还有语句.形式多种多样,没有固定的格式和套路.1.打印偶数for(int x=1;x<=10;x++) {  if(x%2==1) continue;  System.out.prinln("x="+x); }二.累加求和,计数器1.获取1~10的和,并打印.思路://1,定义变量用于存储

《C#本质论(第4版)》一1.2 C#语法基础

1.2 C#语法基础 C#本质论(第4版) 成功编译并运行HelloWorld程序之后,我们来分析代码,了解它的各个组成部分.首先熟悉一下C#关键字以及开发者选用的标识符. 初学者主题:关键字 为了帮助编译器解释代码,C#中的某些单词具有特殊地位和含义,我们将其称为关键字.关键字提供了具体的语法,编译器根据这些语法来解释程序员书写的表达式.在HelloWorld程序中,class.static和void均是关键字. 编译器利用关键字来识别代码的结构与组织方式.因为编译器对这些单词有着严格的解释,

javascript 语法基础 想学习js的朋友可以看看_基础知识

1:javascript区分大小写 2:javascript每一条语句必须以";"结束,与C语言一样 3:输出:document.write("字符串")--->还可以输出对应的html标记 4:改变窗体的颜色document.bgColor="red"; 4:类型转换:parseInt,parseFloat 5:随机函数:parseInt(Math.random()*90+10) 产生10--100的随机数 5:弹出对话框:alert(&

第一篇——第一文 SQL Server 备份基础

原文:第一篇--第一文 SQL Server 备份基础 当看这篇文章之前,请先给你的所有重要的库做一次完整数据库备份.下面正式开始备份还原的旅程. 原文出处: http://blog.csdn.net/dba_huangzj/article/details/22683687 前言 为什么要备份?理由很简单--为了还原/恢复.当然,如果不备份,还可以通过磁盘恢复来找回丢失的文件,不过SQL Server很生气,后果很严重.到时候你就知道为什么先叫你备份一次再开始看文章了.∩__∩.本系列将介绍SQ

前端必学之PHP语法基础_php实例

写在前面的话 PHP是一种创建动态交互性站点的强有力的服务器端脚本语言.PHP能够包含文本.HTML.CSS以及PHP代码,在服务器上执行,结果以纯文本返回浏览器 代码标识 PHP代码以<?php 开头,以?>结尾,且可以放置在文档中的任何位置 <?php // ?> PHP语句以分号(;)结尾,PHP代码块的关闭标签也会自动表明分号 <?php echo "Hello World!"; ?> 注释 PHP支持三种注释,包括两种单行注释和一种多行注释

第07篇:C#星夜拾遗之delegate示例

概念 delegate即委托.如果你使用过C++或者js中的回调函数,你会更容易明白一些.在异步操作中常常使用回调函数,例如在Ajax中,当HttpRequest执行异步请求时,就需要有一个状态改变时的回调函数.回调函数其实是一个方法调用的指针,也称为函数指针.在C#中,当需要把方法作为参数进行传递时,就需要用到delegate.   简单委托示例 定义一个委托,代码如下: private delegate string GetString(); 这个委托用来获取一个字符串.接下来在Main方法

Python语法基础_控制语句_输入输出语句详解

前言 程序最基本需要的两个要素,一个是数据,另外一个便是逻辑.而控制语句在程序中扮演的角色便是实现程序的逻辑,即数据的导向和对数据的操作.当然,这并不代表,程序中的数据的行为只能通过控制语句来实.但在Python编写的自动化脚本中,控制语句将会被频繁的使用. 输入 输入输出,简单来说就是从标准输入中获取数据和将数据打印到标准输出,常被用于交互式的环境当中,Python实现输入的方法有下面两种: raw_input() raw_input( ):获取输入后,返回一个String类型. 下面实现一个

Python语法基础_控制流语句_if、while、for

前言 控制流语句用于改变程序语句流(默认为自上而下顺序执行)的执行顺序,其中Python的基本控制流语句,主要有以下3种:  1. if 语句:根据条件返回的结果执行相应的代码块  2. for 循环:通过遍历容器对象的索引来实现循环  3. while 循环:根据条件返回是否为True来判断是否执行循环体  在本篇中主要会介绍Python中控制流语句,以及一些在应用上的经验. 软件环境 系统  Ubuntukylin 14.04 软件  Python 2.7.6 IPython 4.0.0 I

RabbitMQ消息队列入门篇(环境配置+Java实例+基础概念)

版权声明:本文为博主原创文章,转载注明出处http://blog.csdn.net/u013142781 目录(?)[+] 一.消息队列使用场景或者其好处 消息队列一般是在项目中,将一些无需即时返回且耗时的操作提取出来,进行了异步处理,而这种异步处理的方式大大的节省了服务器的请求响应时间,从而提高了系统的吞吐量. 在项目启动之初来预测将来项目会碰到什么需求,是极其困难的.消息队列在处理过程中间插入了一个隐含的.基于数据的接口层,两边的处理过程都要实现这一接口.这允许你独立的扩展或修改两边的处理过