一、常量

常量是其值在使用过程中不会发生变化的变量。在声明和初始化变量时,在变量前面家关键字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 wpfworld.com
{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#在变量之间有一个基本的区分,它把声明为类型级的变量字段看作字段,而把在方法中声明的变量看作局部变量。

转载于:https://www.cnblogs.com/wpfworld/p/3481296.html

C#中的常量、类型推断和作用域相关推荐

  1. java中无法推断类型参数_Java 10中的本地类型推断,或者如果它像鸭子一样嘎嘎叫...

    java中无法推断类型参数 最近,Oracle采用了一种新策略,即每六个月发布一次新的语言版本. 该策略假定只有每个第3版都将提供长期支持或LTS. 快速说明: 具有LTS的当前版本是Java 8: ...

  2. Java 10中的本地类型推断,或者如果它像鸭子一样嘎嘎叫

    最近,Oracle采用了一种新策略,即每六个月发布一次新的语言版本. 该策略假定只有每个第3版都将提供长期支持或LTS. 快速说明: 具有LTS的当前版本是Java 8: Java 9仅应在2018年 ...

  3. Java中的类型推断和lambda表达式

    文章目录 简介 类型的显示使用 Stream中的类型推断 类型推断中变量名字的重要性 类型推断对性能的影响 类型推断的限制 总结 简介 java是强类型的编程语言,每个java中使用到的变量都需要定义 ...

  4. java全局变量和局部变量_Java 10 –局部变量类型推断

    java全局变量和局部变量 在本文中,我们将看到作为JEP 286的一部分提出的名为Local Variable Type Inference的Java10功能. 从Java的第一个版本开始,它是一种 ...

  5. Java 10 –局部变量类型推断

    在本文中,我们将看到作为JEP 286的一部分提出的名为Local Variable Type Inference的Java10功能. 从Java的第一个版本开始,它是一种强类型语言,在这里我们需要提 ...

  6. F#简明教程二:F#类型系统和类型推断机制

    [51CTO独家特稿]在上一篇教程<F#与函数式编程概述>中我们了解到F#和函数式编程的一些特点,更多关于F#语言和函数式编程的介绍可以参考51CTO之前对微软MVP赵颉老师的专访< ...

  7. C++自学08:类型推断(auto/typeid)

    现在有下面一段代码 char16_t a=u'抱'; 之前说过,声明一个char16_t的变量a,但是需要在值前面加上小写的u,这就有意思了,既然我声明一个char16_t,那我加u干嘛?加u就代表我 ...

  8. 【Groovy】Groovy 动态语言特性 ( Groovy 中的变量自动类型推断以及动态调用 | Java 中必须为变量指定其类型 )

    文章目录 前言 一.Groovy 动态语言 二.Groovy 中的变量自动类型推断及动态调用 三.Java 中必须为变量指定其类型 前言 Groovy 是动态语言 , Java 是静态语言 ; 一.G ...

  9. C++基础学习(02)--(数据类型,变量类型,变量作用域,常量,修饰符类型)

    文章目录 目录 一. 数据类型 C++ 中的数据类型 typedef enumeration枚举类型 c++中变量类型 二.变量作用域 三.常量 四.修饰符类型 目录 一. 数据类型 C++ 中的数据 ...

  10. matlab中float类型的_Java局部变量类型推断(Var类型)的26条细则

    原文链接:https://dzone.com/articles/var-work-in-progress 作者:Anghel Leonard 译者:沈歌 Java局部变量类型推断(LVTI),简称 v ...

最新文章

  1. 刮刮乐html5效果擦除,利用HTML5的画布Canvas实现刮刮卡效果
  2. datagrid行内编辑时为datetimebox
  3. 【原】UCS-2和UTF-8的互相转换
  4. 纯c语言实现的改进暗通道去雾算法测试程序(附赠大量测试图像),基于改进暗通道先验算法的图像去雾...
  5. Linux操作命令(二)
  6. java 0xf0_用java做一个最小的操作系统内核
  7. mysql 前10条 平均数_mysql – 每组最新N条记录的平均值
  8. windows下游戏服务器端框架Firefly安装说明及demo运行
  9. 【数据预测】基于matlab双向长短时记忆BiLSTM(多输入单输出)数据预测【含Matlab源码 1826期】
  10. 课设题目:哈希表实现电话号码查找系统
  11. 艾司博讯:拼多多拼单人数不够怎么取消
  12. and no properties discovered to create BeanSerializer 问题解决
  13. mbr分区磁盘如何转换成gpt分区磁盘?
  14. oracle算加权平均的函数,如何用变异函数计算加权平均数?
  15. 无形胜有形——0day破解组织探秘
  16. Docker系列 深度使用nextcloud(一)
  17. Cisco路由器内部网关协议(IGP)实验:OSPF
  18. 海南“多规合一”改革促行政审批提速城乡面貌提质
  19. 阿里云客服机器人人工服务配置文档
  20. 华为Atlas张迪煊:在最好的时代,做最强AI算力底座

热门文章

  1. 9)Thymeleaf ⼯具类对象表达式
  2. Android 显式意图(Intent) 与 隐式意图
  3. java 上下文缓存_记一次JAVA 线上故障排查完整套路。
  4. 阶段5 3.微服务项目【学成在线】_day01 搭建环境 CMS服务端开发_15-MongoDb入门-用户...
  5. Codeforces 1110D. Jongmah 动态规划
  6. 百度移动搜索主要有如下几类结果构成
  7. [NOIP2015] 运输计划(第二弹)
  8. Visual Studio2017 数据库架构比较
  9. 处理了与日期相关的一些函数
  10. Vim 经常使用快捷键及键盘图