浅谈C#中的常量、类型推断和作用域

 更新时间:2013年12月19日 17:04:14   作者:  
这篇文章主要介绍了C#中的常量、类型推断和作用域,有需要的朋友可以参考一下

一、常量
常量是其值在使用过程中不会发生变化的变量。在声明和初始化变量时,在变量前面家关键字const,就可以把该变量指定为一个常量:

const int a=100;//a的值将不可以改变

常量的特征:

1.常量必须在声明时初始化。指定了其值以后,就不能再修改了。
2.常量的值必须能在编译时用于计算。因此不能从一个变量中提取的值来初始化常量。如果需要这么做,应该使用只读字段。
3.常量总是静态的,但注意,不必在常量的声明中包含修饰符static。(实际上,不允许)
在程序中使用常量至少有3个好处:

1.常量用易于理解的清楚的名称替代了含义不明确的数字或者字符串,使得程序更加易于阅读。
2.常量使程序更容易修改。例如在C#程序中有一个SalesTax常量,该常量的值为6%。如果以后销售税率发生变化,把新值赋给这个常量,就可以修改所有的税款计算结果,而不必查找整个程序,修改税率为0.06的每个项。
3.常量更容易避免程序出现错误。如果要把另一个值赋给程序中的一个常量,而该常量已经有了一个值,编译器就会报告错误。
如以下程序:

复制代码 代码如下:

namespace Test
{
    class ScopeTest
    {
        static int j=20;
        const string time= DateTime.Now.ToString();
        public static void Main()
        {
            int j=30;
            Console.WriteLine(j);
            return;
        }
    }
}

编译后产生错误:

error CS0133:指派给“Test.ScopeTest.time”的表达式必须是常量。

对于以上代码中的time,如果需要的话,可以为其赋于readonly属性。

常量和只读其实都是只能访问不能修改的。但是他们的赋值时机不太一样,一般常量在编译的时候已经确定并赋予其常量值。而只读其实是一个变量他在运行时需要动态装载的时候才会给他赋予一个值,而这个值一旦赋予就不能再更改了。

二、类型推断
类型推断使用var关键字。声明变量的语法有些变化。编译器可以根据变量的初始化值“推断”变量的类型,例如:

int someNumber=0;

就变成

var someNumber=0;

即使someNumber从来没有声明为int,编译器也可以确定,只要someNumber在其作用域内,就是一个int。编译后,上面两个语句是等价的。

下面是另外一个例子:

复制代码 代码如下:

namespace Test
{
     class Program
     {
         static void Main(string[] args)
          {
               var name ="Bugs Bunny";
               var age=25;
               var isRabbit=true;

               Type nameType=name.GetType();
               Type ageType=age.GetType();
               Type isRabbitType=isRabbit.GetType();

               Console.WriteLine("name is type "+nameType.ToString());
               Console.WriteLine("age is type "+ageType.ToString());
               Console.WriteLine("isRabbit is type"+isRabbitType.ToString());
               Console.ReadKey();
    }
   }
}

编译运行程序:(如何编译程序请参照C#入门篇)

name is type System.String

age is type System.Int32

isRabbit is type System.Boolean

使用var定义变量是需要一些规则的。变量必须初始化。否则,编译器就没有推断变量类型的依据。初始化器不能为空,且必须放在表达始中。不能把初始化器设置为一个对象,除非在初始化器中创建一个新对象。

三、变量的作用域
变量的作用域是可以访问该变量的代码区域。一般情况下,确定作用域有一下规则:

1.只要类在某个作用域内,其字段也在该作用域内
2.局部变量存在于声明该变量的块语句或方法结束的封闭花括号之前的作用域内。
3.在for、while或类似语句中声明的局部变量存在与该循环体内
大型程序的不同部分为不同的变量提供相同的变量名很常见。只要变量的作用域是程序的不同部分,就不会有问题。也不会产生模糊。但要注意,同名的局部变量不能在同一作用域内声明两次,所以如下代码是不能使用的:

int x=20;

int x=30;

再来看如下例子:

复制代码 代码如下:

using System;
namespace jb51
{
   pulic static int main()
   {
       For(int i=0;i<10;i++)
       {
           Console.writeLie(i);
       }
       For(int i=0;i>=10;i—
       {
           Console.WriteLine(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是在for循环开始前定义的,在执行for循环时应处于其作用域内,在Main方法执行后,变量j才超出作用域,第二个j(不合法)则在循环的作用域内,在作用域嵌套在Main方法的作用域内,编译器无法区别这两个变量。

字段或局部变量的作用域冲突:在某些情况下,可以区分名称相同(尽管其完全限定的名称不同)、作用域项目的两个标识。此时编译器允许声明第二个变量。原因是C#在变量之间有一个基本的区分,它把声明为类型级的变量字段看作字段,而把在方法中声明的变量看作局部变量。

相关文章

  • C#中WPF使用多线程调用窗体组件的方法

    C#中WPF使用多线程调用窗体组件的方法

    这篇文章主要介绍了C#中WPF使用多线程调用窗体组件的方法,涉及C#中多线程的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-04-04
  • c#的treeview绑定和获取值的方法

    c#的treeview绑定和获取值的方法

    这篇文章主要介绍了c#的treeview绑定和获取值的方法,需要的朋友可以参考下
    2014-04-04
  • C#窗口实现单例模式的方法

    C#窗口实现单例模式的方法

    本文介绍了C#窗口实现单例模式的方法,对于一个软件如果第二次打开程序,就把已经启动的那个进程的窗口放到最前端显示,需要了解的朋友可以参考下
    2015-07-07
  • C#中的Drawing 类案例详解

    C#中的Drawing 类案例详解

    文章解析WPF与WinForms的Drawing类差异,涵盖命名空间、继承链、常用类及应用场景,通过案例展示如何创建带阴影圆角矩形按钮,强调WPF的轻量、可动画特性与WinForms的即时绘制模式,对C# Drawing类相关知识感兴趣的朋友一起看看吧
    2025-08-08
  • 解读封送类、结构体和联合体实例

    解读封送类、结构体和联合体实例

    本文主要介绍了.NETFramework中类、结构体和联合体的封送处理,包括类通过COM互操作封送为接口、结构体通过StructLayoutAttribute属性指定布局和封送方式,以及联合体通过StructLayout(LayoutKind.Explicit)和FieldOffset特性精确控制内存布局
    2025-01-01
  • C#使用Pipelines实现处理Socket数据包

    C#使用Pipelines实现处理Socket数据包

    这篇文章主要为大家详细介绍了C#如何使用Pipelines实现处理Socket数据包,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-12-12
  • C#使用Socket发送和接收TCP数据实例

    C#使用Socket发送和接收TCP数据实例

    这篇文章主要介绍了C#使用Socket发送和接收TCP数据的实现方法,以实例的形式详细讲述了C#实现socket通信的完整实现过程,非常具有实用价值,需要的朋友可以参考下
    2014-10-10
  • C#注释的一些使用方法浅谈

    C#注释的一些使用方法浅谈

    C#注释的一些使用方法浅谈,需要的朋友可以参考一下
    2013-04-04
  • C#集合本质之链表的用法详解

    C#集合本质之链表的用法详解

    本文详细讲解了C#集合本质之链表的用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-08-08
  • 一个基于C#开发的Excel转Json工具使用教程

    一个基于C#开发的Excel转Json工具使用教程

    JSON吸引了工具构建者的注意,它们开发了用于重新格式化、验证和解析JSON的众多工具,这不足为奇,下面这篇文章主要给大家介绍了一个基于C#开发的Excel转Json工具的相关资料,需要的朋友可以参考下
    2022-11-11

最新评论