C#变量

变量的初始化

变量初始化时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
        }

使用隐式类型需要遵循一些规则:

  1. var只能在表达式内修饰变量(不能修饰形参,全局变量等)

  2. 必须对其初始化(否则提示:隐式类型的局部变量必须已初始化)

常量(const)

在申明和初始化变量时,在变量类型前面加上const就可以把变量指定为常量,常量具有如下特点:

  1. 常量在声明时必须初始化。
  2. 常量都是static类型,所以不需要也不允许static和const同时修饰
  3. 常量通常在编译时对其进行计算,所以不能从一个变量中提取值来初始化。

如下是常量声明初始化的代码:

    class Program
    {
        private const int _app = 1;
        static void Main(string[] args)
        {
            const int app = 2;
            Console.WriteLine(app);
            Console.WriteLine(_app);
        }
    }

值类型和引用类型

C#把数据类型归为两大类:值类型和引用类型。从概念上区分,值类型直接存储值,引用类型存储对值的引用。

值类型和引用类型的区别:

  1. 值类型直接存储值,引用类型存储对值的引用(即:指针,内存地址).

  2. 值类型存储在内存堆栈中,引用类型存储在内存托管堆上.

  3. 值类型从ValueType继承而来,引用类型直接从object继承

  4. 值类型由内存分配释放,引用类型需要由.net的GC来进行释放

  5. 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类型,避免产生歧义。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值