浅谈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++变量,常量,数组和字符串,是C++入门学习中的基础知识,需要的朋友可以参考下,希望能够给你带来帮助...2021-10-21
详解JavaScript的AngularJS框架中的作用域与数据绑定
这篇文章主要介绍了JavaScript的AngularJS框架中的作用域与数据绑定,包括作用域的继承以及数据的单向和双向绑定等重要知识点,需要的朋友可以参考下...2016-03-07- 这篇文章主要介绍了Angularjs全局变量被作用域监听的正确姿势的相关资料,需要的朋友可以参考下...2016-02-12
深入理解javascript作用域第二篇之词法作用域和动态作用域
这篇文章主要介绍了javascript作用域第二篇之词法作用域和动态作用域的相关资料,非常不错,具有参考借鉴价值,感兴趣的朋友可以参考下...2016-07-29- 这篇文章主要介绍了c#共有其中变量类型有:静态变量、实类变量、数组元素、数值参数、引用参数、输出参数和局部变量,需要的朋友可以参考一下...2020-06-25
- 作用域是JavaScript最重要的概念之一,想要学好JavaScript就需要理解JavaScript作用域和作用域链的工作原理。今天这篇文章对JavaScript作用域示例详解的介绍,非常不错,感兴趣的朋友一起看下吧...2016-07-25
- 本文主要介绍AngularJS 作用域的知识,这里整理了基础资料,和示例代码以及实现效果图,有需要的小伙伴可以参考下...2016-08-24
- 在本篇文章里小编给大家整理了一篇关于R语言常量知识点总结内容,有兴趣的朋友们可以学习分享下。...2021-05-06
- 刚接触到指针时,关于C++常量指针,指针常量,指向常量的常指针容易混淆,所以整理下,希望能够帮助自己也帮助到大家...2021-10-18
- 这篇文章主要为大家详细介绍了js私有作用域中创建特权方法,何为特权方法,特权方法就是有权访问私有变量和私有函数的公有方法,感兴趣的小伙伴们可以参考一下...2016-01-26
- 关于JavaScript作用域你想知道的一切,本文全部告诉大家,帮助大家全面的了解JavaScript作用域,感兴趣的小伙伴们可以参考一下...2016-02-09
- 这篇文章记录了当时刚学习angular的时候踩的关于作用域的坑,希望给以后学习Angular作用域的朋友一个提醒,有需要的可以参考学习。...2016-08-24
- 下面小编就为大家分享一篇基于数据类型转换(装箱与拆箱)与常量详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-06-25
C++中四种对象生存期和作用域以及static的用法总结分析
以下是对C++中四种对象生存期和作用域以及static的用法进行了详细的介绍,需要的朋友可以过来参考下...2020-04-25- 本文主要讲解C语言 常量,这里整理了 C语言常量的基础知识,并附代码示例和示例详细讲解,希望能帮助开始学习C 语言的同学...2020-04-25
- 这里我们来简单总结C++中指针常量与常量指针的区别,包括如何声明和使用常量指针以及指针常量,需要的朋友可以参考下...2020-04-25
- 这篇文章主要介绍了C++ 常量成员常量返回值详解,需要的朋友可以参考下...2020-04-25
TENSORFLOW变量作用域(VARIABLE SCOPE)
这篇文章主要介绍了TENSORFLOW变量作用域(VARIABLE SCOPE),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-27- 在php开发中我们经常会面要提供预定义判断变量或常量或函数是不是有了,下面我来介绍一些常用的判断常量、变量和函数是否存在应用实例。 常量检测使用defined,定...2016-11-25
php dirname(__FILE__)与__FILE__常量的应用
在php中dirname()与__FILE__是我们的常量,本文章给大家详细介绍dirname()与__FILE__常量在使用过程中一些事项,大有兴趣的朋友可进入参考。 dirname() 函数 string...2016-11-25