C#中new关键字的理解

C#程序中,我们经常见到如:

Bitmappicture=new bitmap(curentfilepath);【Bitmap是一个类,用作图像处理】

Int[ ]arr=new int[10]; 【C#中声明一个数组,并且初始化,数组大小是10,每个初始默认值是0】

这样的语句,这和C和C++中的写法不一样,在C或者C++中我们声明一个数组是: int  arr[10];这样去声明的。

为什么会这样了,C# 中定义有些变量如:

intwidth=10;

可以直接赋值,而有些如:

Int [ ]arr=new int[10];

OpenFileDialog opnDlg = new  OpenFileDialog( );

这样去赋值了。

 

我先说一下C,C++和C#的简单的区别(个人理解,不好勿喷),

C: C是一组数据类型和函数;

C++: 是类和一组函数;

C#: 一组类型的声明;

写C# 程序的而过程感觉就是一个不断声明类型的过程,C#中预定义的类型有16中,其中13中是简单的类型,如我们常见的int ,short,double,float等,还有三种是稍微复杂的类型,如object, string。其中object是其他类型的基础,包括简单类。此外还有6中自定义的类型:

类类型(class)

结构类型(struct)

枚举类型(enum)

数组类型(array)

托管类型(delegate)

接口类型(interface)

写一个C#程序就是这22种类型不断声明变量的过程。

声明的类型。必须就对声明类型的变量分配内存,即实例化对象。为变量分配内存的时候分为两种类型:一种是值类型,一种是引用类型,数据在内存中一般存在栈和堆中。

值类型的数据只需要一段简单的类存,将其中数据存放在其中,比如我们声明时候的简单类型:

如 int a;存储时就是一个值类型,在内存中只需要分配一段单独的内存,此时变量a并没有赋值,内存中给一个默认值为0;如果在定义:a=10;那就将10这个值存储进去。其存储的位置可以位于栈中,也可以位于堆中。

引用类型,(个人理解和C和C++中的指针相似),对声明的引用类型分配内存的时候要分配两段类存,第一段用来存储实际为引用赋值后的数据,位置必须在堆中。第二段用来存储一个引用,即第一段存放数据的位置,位置可以在堆中,也可以在栈中。(如果用C中指针理解,就是分配第一段位置存放的是数据,第二段位置放的是数据的地址,如int *P=10;第一段内存中放的是10 这个值,第二段内存中放的是存储10 这个值得内存的地址)

可以用下面图来表示引用这个过程:



懂了上面的这些,那就很容易理解为啥在C#中对声明变量的赋值有些是如:int a=10;有些是 int [ ] arr=new int[10];这样形式了,前面那张赋值在内存中存储时值类型的,所以在内存中只需开辟一块地方便可以了。

在C#中,数组,类,结构等复杂的声明类型实例化时在内存中都是按照引用类型存储的。

所以如:Bitmap  image=new  Bitamp();

上面语句其实是两句:

Bitmap  image;

Image =newBitmap();

 

Bitmap是一个类类型,故其实例化过程中分配内存是按照引用类型分配的,所以,new Bitmap()分配的是存储数据的内存,

Bitmap  image 分配的是存储数据引用的内存;

Bitmap  image= new Bitamp();一整句的意思,在我大概看了就是:分配了存储引用类型的地址,然后为数据分配内存,在将分配数据内存的地址赋给引用类型的变量


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值