C#变量
2016-07-18 10:41
260 查看
变量的初始化
变量初始化时C#强调安全性的一个例子,C#编译器需要用某个初始值对变量进行初始化才能使用。类和结构的成员变量可以不用显示初始化,默认为变量类型的默认值(整型默认0,字符串默认空)
class Program { private static string _str; static void Main(string[] args) { Console.WriteLine(_str); } }
方法体内部的局部变量,必须显示进行初始化,否则编译不通过(编译器提示:使用了未赋值的局部变量)
隐式类型(var)
编译器可以根据变量的初始值来推断出变量的类型。具体使用代码如下:static void Main(string[] args) { var name="Jock"; var age = 18; Console.WriteLine(name.GetType().ToString());//System.String Console.WriteLine(age.GetType().ToString());//System.Int32 }
使用隐式类型需要遵循一些规则:
var只能在表达式内修饰变量(不能修饰形参,全局变量等)
必须对其初始化(否则提示:隐式类型的局部变量必须已初始化)
常量(const)
在申明和初始化变量时,在变量类型前面加上const就可以把变量指定为常量,常量具有如下特点:常量在声明时必须初始化。
常量都是static类型,所以不需要也不允许static和const同时修饰
常量通常在编译时对其进行计算,所以不能从一个变量中提取值来初始化。
如下是常量声明初始化的代码:
class Program { private const int _app = 1; static void Main(string[] args) { const int app = 2; Console.WriteLine(app); Console.WriteLine(_app); } }
值类型和引用类型
C#把数据类型归为两大类:值类型和引用类型。从概念上区分,值类型直接存储值,引用类型存储对值的引用。值类型和引用类型的区别:
值类型直接存储值,引用类型存储对值的引用(即:指针,内存地址).
值类型存储在内存堆栈中,引用类型存储在内存托管堆上.
值类型从ValueType继承而来,引用类型直接从object继承
值类型由内存分配释放,引用类型需要由.net的GC来进行释放
int i=20;int j=i;变量i和j在不同的地址中存储值,互不干扰。如果换成引用类型,那么i和j都同时指向同一块托管堆。两个变量之间是相互干扰的。
那么,C#中预定的值类型有:int,double,float,decimal,sbyte,byte,uint,short,char,long,bool,struct,enum 等等基本类型。
预定引用类型有:string,class,object等
既然string是引用类型,那么为什么两个string之间并不互相干扰?
static void Main(string[] args) { string str1 = "Hello"; string str2 = str1; Console.WriteLine(str1);//Hello Console.WriteLine(str2);//Hello str2 = "Hello World"; Console.WriteLine(str1);//Hello Console.WriteLine(str2);//Hello World }
string 是一种特殊的引用类型,它是不可变的。修改一个字符串只会创建一个全新的字符串,而原来的字符串并不会改变,等待被GC回收。
将上面的代码换成StringBuilder,那么输出的效果就不一样的。
static void Main(string[] args) { StringBuilder sb = new StringBuilder("This is sb"); StringBuilder sb1 = sb; Console.WriteLine("sb=" + sb.ToString());//This is sb Console.WriteLine("sb1=" + sb1.ToString());//This is sb sb.Append(" Add"); Console.WriteLine("sb=" + sb.ToString());//This is sb Add Console.WriteLine("sb1=" + sb1.ToString());//This is sb Add }
CTS类型
C#并没有把预定的类型内置在C#语言中,而是内置在.net framework中,假设申明一个int类型,在.net实例中其实是System.Int32,具体可以是用GetType方法输出来查看。.net FCL体系结构中有 CTS(通用类型系统) CLS(公共语言规范) CLR(公共语言运行时)。主要是为了各种语言中的相互交互而制定的规则,而通常人们一听到.net 下意识就是关联了C#语言。
个人更加倾向于使用CTS的类型,这样不会产生误解;例:有些认为定义一个int类型的变量,在32位操作系统是32位,在64位系统就是64位字节。其实并不然。int对应的CTS类型是System.Int32,那么在任何情况都是32位字节。
总结
1.变量的申明和初始化:局部变量使用前必须初始化,成员变量不初始化是有默认值2.常量:常量都是static的,不能const和static同时修饰,在编译时计算,不能从变量提取值初始化,声明的同时必须初始化
3.隐式类型:只能修饰在表达式中,必须申明时初始化,可以根据初始化值推断具体的类型
4.值类型和引用类型的区别
5.CTS类型和基本类型的对应关系,尽量多使用CTS类型,避免产生歧义。
相关文章推荐
- C#线程(一)
- 获取C#代码执行的时间(精确到毫秒)
- C# 扩展方法
- c#事件的继承处理
- 更改C#项目的命名空间名称
- C#调用IE浏览器或者默认浏览器
- C#中==与Equals方法的区别
- C#生成注册码
- C#多线程编程
- C#基础知识(六)——冒泡排序的书写
- [C#]插入排序
- C#WebService发布以及IIS发布
- 【知识积累】C#中结构体和类的区别
- 【总结】机房合作碎知识总结一
- C#的第五节课
- C#界面设计
- 【转载】.NET/C#-uploadify视频文件or大文件上传
- C#已解决问题集锦
- C#转义 Console.WriteLine("{0}, {{{1}}}", "ab", "xyz");
- C#操作MSMQ向本地消息队列发送和接收消息