您的位置:首页 > 编程语言 > C#

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类型,避免产生歧义。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: