程序人生

人在他乡

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

第一章 程序设计


  “要想成为真正的程序员,我们需要进行一场洗礼。”
  “程序 = 数据结构 + 算法。”这样的公式很精辟,它越过了表层直接描述了程序的本质。不仅如此,这样几个简单的单词也让我们明白“我们应该学习什么内容?”。人们做任何事都有一定的程序,只是没有意识到。有些人将日常行动列成表格,这就是“编写程序”。

 

本章的学习重点:

  ◆    标识符
  ◆    变量与数据类型
  ◆    变量命名规范

 

1.3变量

  变量是编程语言中最小的逻辑单位,变量在程序中的作用是为了存储在用户使用应用程序时产生的临时数据,这些数据是暂时存放在内存中。定义一个变量需要告诉内存是什么数据类型的变量,就好像在生活中,一个杯子(数据类型)名字叫做牛奶杯(变量的名字)装的是(=)液体牛奶(临时数据)。

 

1.3.1标识符

  在C#中,标识符是用来声明变量、函数及其他各种用户定义的对象名。标识符的长度可长可短,可以使用一个字符,也可以由若干个字符组成。C#中标识符只能由大写字母、小写字母、下划线(_)、数字(0-9)和@字符组成。而且必须以大写字母、小写字母或下划线开头,不能以数字开头,同时标识符中间不能包含空格。例如:a;hello;Color;_Color;this_is_valid等都是合法的标识符形式;1test;Color.test;this is;$test;if;hello world等字符串则不能用作标识符。
  标识符大小写敏感,比如变量名name和Name代表两个不同的变量。尽管如此,我们仍不建议仅利用大小写不同来代表两个不同的标识符,大多数情况下,标识符应该是望名知义。
  @字符只可以用在标识符的第一个字符,带@前缀的标识符称为逐字标识符,这在与其他的编程语言建立接口时很有用,字符@并不是标识符的实际组成部分,因此在其他语言中可能将此标识符视为不带前缀的正常标识符。允许将@前缀于关键字用于标识符,如@class, @bool等。但是不到万不得已,不强烈建议这样做。下面我们来看一个示例:
1 using System;
2 namespace Microsoft.Example
3 {
4     public class TestKeyword
5     {
6         static void Main()
7         {
8             @class.@static(true);            //调用使用关键字定义的方法
9         }
10         class @class                    //使用关键字class定义一个类
11         {
12             public static void @static(bool @bool)                //使用关键字static定义一个方法
13             {
14                 if (@bool)                                    //使用关键字bool定义一个变量
15                 {
16                     System.Console.WriteLine("结果为true");    //输出结果
17                 }
18                 else
19                 {
20                     System.Console.WriteLine("结果为false");    //输出结果
21                 }
22             }
23         }
24     }
25 }
  上述代码中,@虽然出现在C#标识符中,但不作为C#标识符本身的一部分。因此,以上示例,定义了一个名为class的类,并包含一个名为static的方法,以及一个参数名为了bool的形参。这样,对于跨语言的移植带来了便利。因为,某个单词在C#中作为保留关键字,但是在其他语言中也许不是。
  最后的输出结果:结果为true
  我们再来看下面一个示例:
  class Program
  {
      public static void Test(string @str)
      {
            System.Console.WriteLine(str);
      }
  }
  当然@也可以加在非关键字之前,这样@str就一点效果也没有,@str等价于str,一般不鼓励使用。
  关键字是对编译器具有特殊意义的预定义保留标识符。它们不能在程序中用作标识符,除非它们有一个 @ 前缀。例如,@if 是一个合法的标识符,而 if 不是合法的标识符,因为它是关键字。
  下面是C#关键字列表
  abstract    event    new    struct
  As    explicit    null    switch
  Base    extern    object    this
  bool    false    operator    throw
  break    finally    out    true
  Byte    fixed    override    try
  Case    float    params    typeof
  catch    for    private    uint
  char    foreach    protected    ulong
  checked    goto    public    unchecked
  class    if    readonly    unsafe
  const    implicit    ref    ushort
  continue    in    return    using
  decimal    int    int    virtual
  default    interface    sealed    volatile
  delegate    internal    short    void
  Do    is    sizeof    while
  double    lock    stackalloc    Else
  long    static    enum    namespace
  string    get    partial    set
  value    where    yield   
  什么是关键字?为了帮助编译器对代码进行解释,C#中的一些单词具有特殊的地位和含义,我们把它们称为关键字(keyword)或者保留字(reserved word)。关键字提供了具体的语法,编译器根据这些语法来解释程序员书写的表达式。在HelloWorld程序中,class、static和void 均是关键字。
  编译器利用关键字来识别代码的结构与组织方式。由于编译器对这些单词有着严格的解释,所以只能遵照编程语言能够识别的特定规则来使用关键字。换言之,编程语言规定开发者只能将关键字放在特定的位置。一旦程序员违反了这些规则,编译器就会报错。

 

1.3.2变量与数据类型

  变量代表数据的实际存储位置。各个变量所能存储的数值由它本身的类型决定。在变量被赋值以前,变量自身的类型必须被明确地声明。
  例如:变量声明的语法格式
  数据类型 变量名(标识符);
  数据类型 变量名(标识符)= 初值;
  其中,第一种定义方法只是声明一个变量,并没有对变量进行赋值,此时变量使用默认。第二种定义方法对变量进行了初始化,但需注意的是,变量值应该与变量数据类型相一致。
  给变量赋值时,临时数据根据相应的数据类型合理的存放,比如杯子是不能用来装石头,同时我们要考虑到这样一种情况,现在我们往牛奶杯里装了牛奶,当牛奶喝完了,我们还可以用牛奶杯装可乐,临时数据改变了,但是数据类型没有改变,因为都是液体,这种情况我们习惯叫做修改了变量牛奶杯的值,或是重新给牛奶杯赋了一个值。
  C#语言共有7种变量类型:静态变量,实例变量,数组元素,值参数,引用参数,输出参数和局部变量。
  举个例子:
     class A
    {
        public static int x;
        int y;
        void F(int[] v, int a, ref int b, out int c)
        {
            int i=1;
        }
     }
  x 是一个静态变量;y 是一个实例变量;v[0]是一个数组元素;a 是一个值参数;b 是一个引用参数;c 是一个输出参数;i是一个局部变量。下面向大家简单介绍各种变量,更详细内容请参考相关章节。
  1、静态变量
  使用static修饰符定义的变量称为静态变量。静态变量只能通过类名直接访问,属于类成员。
  2、实例变量
  没有使用static 修饰符声明的变量称为实例变量。当创建某类的一个实例的时候,属于该类的实例变量也被生成,当不再有关于这个实例的引用而且实例的析构函数执行了以后,此实例变量失效。
  3、数组元素
  当任意一个数组实例被创建时,这个数组的元素也被同时创建,当不再有任何正对这个数组实例的引用时,它的元素也就此失效。
  4、值参数
  只要不带有ref 修饰的参数声明,我们都称它为值参数。不管这个参数是值类型还是引用类型。
  5、引用参数
  只要带有ref 修饰的参数声明,我们都称它为引用参数。如果是引用类型,传递的其实是引用的引用。
  6、输出参数
  只要带有out 修饰的参数声明,我们称它为输出参数。输出参数本身并不创建新的存储空间。同时,输出参数和引用参数很类似,只是输出参数不用初始化,就可以在方法内部使用。
  7、局部变量
  在方法中申明的变量,叫做局部变量。通常在for 循环语句或者switch 分支语句中出现。当控制权离开 for 循环语句或者 switch 分支语句时,其中的相关局部变量随即失效。
  变量还有一个重要的概念,就是作用域。变量的作用域就是可以访问该变量的代码区域。一般情况下,作用域有以下规则:
  1、如果这个变量是类的一个字段,不管是实例变量,还是静态变量,这个类就是它的作用域,这个类的所有代码都内访问到这个变量。
  2、如果这个变量是一个局部变量,作用域存在于声明该变量的块语句或方法结束的封闭花括号内。
  3、在for、while或类似语句中声明的局部变量存在于该循环体内。
  程序在不同部分为不同的变量使用相同的变量名是很常见的。只要变量的作用域是程序的不同部分,就不会有问题,也不会产生模糊性。但要注意,同名的局部变量不能在同一作用域内声明两次,不然,局部变量的作用域就会冲突,所以不能使用下面的代码:
  int x = 20;
  int x = 30;
  可以考虑使用下面的代码:
  public static int Main()
  {
      for (int i = 0; i < 10; i++)
      {
         Console.WriteLine(i);
      }        //这时变量i已经走出作用域
      for (int i = 9; i >= 0; i--)
      {
         Console.WriteLine(i);
      }        //这时变量i已经走出作用域
      return 0;
  }
  这段代码使用一个for循环打印出从0~9的数字,再打印从9~0的数字。重要的是在同一个方法中,代码中的变量i声明了两次。可以这么做的原因是在两次声明中,i都是在循环内部声明的,所以变量i对于循环来说是局部变量。
  下面看看另一个例子:
  public static int Main()
  {
      int j = 20;
      for (int i = 0; i < 10; i++)
      {
         int j = 30;            //编译失败
         Console.WriteLine(j + i);
      }
      return 0;
  }
  如果试图编译它,就会产生错误,局部变量j不能在这个作用域内声明两次,因为这会给变量j赋予不同的含义。

 

1.3.3变量命名规范

  在编写代码时遵循命名规则,可以让程序更加易懂、易读;而且有些时候还能提供它的一些功能信息,有助于对程序的理解。有些朋友也知道一些命名规范,但是在编写代码的过程中所采用的命名方式经常变动,没有形成固定的风格。这里对C#的命名规范进行了总结,方便以后查询。
  命名规范的原则:
  1、在同一种技术中,尽量在所有的代码中采用同一种命名规范。
  2、尽量采用来自官方的命名规范。
  3、特殊情况,特殊处理,但是理由要充分。
  C#语言的变量主要使用三种命名法,它们分别是:匈牙利命名法、Camel命名法与Pascal命名法。
  匈牙利命名法:在Windows编程中使用非常普遍,由微软的一位匈牙利程序员提出。匈牙利命名法通过在变量名前面加上相应的小写字母的符号标识作为前缀,标识出变量的作用域、类型等。例如,strName表示这是一个字符串的变量。在面向对象的程序设计中匈牙利命名法使用起来非常别扭,也使用特别少,目前唯一建议使用的地方就是控件的变量名,例如:一个按钮,我们使用btnSubmit来命名,这样就很清楚这个变量是按钮,至于其他,就很少用,因为IDE现在已经很强大,提示功能很强。
  Camel命名法:即骆驼式命名法,原因是采用该命名法的名称看起来就像骆驼的驼峰一样高低起伏。Camel命名法有两种形式:混合使用大小写字母和单词之间加下划线,例如firstName和first_Name都属于Camel命名法,Camel命名法除了第一个单词外,所有单词第一个字母大写,其他字母小写。
  使用Camel大小写形式:public class helloWorld{...}
  Pascal命名法:与Camel命名法类似,不过Pascal命名法的所有首字母为大写字母,其他字母小写。
  使用Pascal大小写形式:public class HelloWorld{...}
  下面向大家列举一些常用的命名规则:
  1、使用Pascal的命名规范命名类和方法的名字。
  public class MyClass
  {
  public MyMethod(){…}
  }
  2、使用Camel命名规范命名局部变量和方法的参数。
  int number;
  void MyMethod(string myName){…}
  3、在命名接口的时候使用I作为前缀。
  interface IMyInterface{...}
  4、私有成员变量使用m_作为前缀。
  public class MyClass
  {
  private int m_Number;
  }
  5、自定义的属性类使用Attribute作为其后缀。
  6、自定义的异常类使用Exception作为其后缀。
  7、在命名方法的时候使用动宾结构的短语,比如:ShowDialog()。
  8、有返回值的方法应该有一个可以描述其返回值的名字,比如:GetObjectState()。
  9、使用有意义的变量名称。
  10、使用C#语言的类型而不使用System命名空间中其别名来申明变量。例如:
  使用object 而不是 Object
  使用string 而不是 String
  使用 int 而不是 Int32
  11、使用有意义的命名空间,比如使用公司的名称以及产品的名称。
  12、避免使用完全限定名。而使用using语句替换之。
  13、避免将using语句写在命名空间的内部。
  14、将所有的框架定义的命名空间为一组,自定义的和第三方的命名空间放在另一组。
  15.保持严格的缩进风格。
  16、在编写注释的时候注释的缩进和编码的缩进必须是相同级别的。
  17、尽可能在第一次使用局部变量的时候申明它。
  18、文件名称应该可以反映出它所包含的类。

posted on 2010-06-09 21:31  邹标财  阅读(211)  评论(0编辑  收藏  举报