谈谈 c# 对象初始化问题
C#对象初始化
之前在学习过程中只是知道该如何初始化对象,但是却不明白为何要这么做,不这么做有什么问题。
现在就针对我最近遇到的问题(定义了全局字节数组没有初始化,然后在多线程里头使用,然后就一直报null的错误,一开始也没有想到是初始化的问题,就一直以为是通讯中断,数组没有赋值成功,调了一段时间,检查了一下代码,发现字节数组没有初始化,然后把它初始化之后试了一下还真是),在这里给大家分享一下。
初始化定义:
初始化在计算机编程领域中指为数据对象或变量赋初值的做法,如何初始化则取决于所用的程序语言以及所要初始化的对象的存储类型等属性。用于进行初始化的程序结构则称为初始化器或初始化列表。初始化和变量声明是有明显区别的,而且变量声明也先于初始化进行,但两者在实践中仍常被混淆。
一、关于使用new做了哪些事情呢 ?
1、 在 栈内存为引用开辟空间
2、 在 堆内存为对象开辟空间
3、 对 对象的成员变量进行 默认初始化 //默认初始化为null
4、 对 对象的成员变量进行 显示初始化 //赋予初始值
5、 通过 构造方法对 对象的成员 变量赋值
6、 对象初始化完毕,把对象地址赋值给引用变量
二 、变量声明后和变量赋值为null或变量调用了new的区别。
主要区分函数中的变量和对象中的字段的区别。
1、变量声明后,没有进行赋值的含义:
声明未赋值,会无法生成,提示‘使用了未赋值的变量’。
通过Reflecter可以看到,声明变量未赋值,实际是不存在的,那么就是说没有进行分配内存。
2、变量赋值为null
表明变量具有内存空间,但是内存中什么也不存在。
3、变量调用new
变量中存在了对象也就是存在了字段,只是字段进行了赋值,赋值为默认值。
C# 引用类型和值类型
1、引用类型
FCL(Framework)中的大多数类型都是引用类型,引用类型总是在托管堆中分配的,C#的new操作符会返回对象的内存地址,也就是指对象数据的内存地址。在使用引用类型时,存在以下性能问题,这是我们在开发中必须要注意的:
a、内存必须从托管堆上分配(也就是说每new一个对象,会占用内存,对象过多就会导致内存占用)
b、 堆上分配的每个对象都有一些额外的成员,这些成员必须初始化
c、对象中的其他字节(为字段而设),总是设为0
d、从托管堆中每分配一个对象,可能强制执行一次垃圾回收操作
所以当我们的应用程序中都是引用类型时,应用程序的性能会显著下降。
2、值类型
上面介绍了引用类型,知道了当从托管堆中每分配一个对象时,都会造成应用程序性能的下降。设想当使用Int32类型初始化一个数字6或者使用float初始化一个浮点数6.6的时候,都进行一次内存的分配,那么应用程序的性能会受到严重的影响.为了提供应用程序的性能,CLR提供了名为"值类型"的轻量级类型.
关于值类型和引用类型相信你们会遇到装箱拆箱的问题。
我暂时没时间去写,这些博客写的蛮好的,你们可以参考一下。
https://www.cnblogs.com/liqingwen/p/6486332.html
https://www.cnblogs.com/kdp0213/p/8533408.html
ok,今天分享就到这里,有问题的或者有建议的欢迎留言提出!!!
谈谈 c# 对象初始化问题的更多相关文章
- EC笔记,第一部分:4.确定对象初始化
04.确定对象初始化 将对象初始化,C++反复无常,所以在使用前应该手动初始化 1.分清赋值与初始化 以下例子: class test{ public: int a; test(){ a=0;//赋值 ...
- Linq专题之对象初始化器
在C#3.0之前,如果创建一个新的对象,往往需要调用类的构造函数来初始化该对象的值,在c#3.0提供了一个"对象初始化器"的机制,使得开发人员在创建新的对象时不通过调用类的构造函数 ...
- C++中对象初始化
在C++中对象要在使用前初始化,永远在使用对象之前先将它初始化. 1.对于无任何成员的内置类型,必须手工完成此事. 例如: int x=0; double d; std::cin>>d; ...
- JAVA 对象初始化的过程
对象初始化的过程例:Student S = new Student();1.因为new Student()用到了Student类,所以会把它从硬盘上加载进入内存2.如果有static静态代 ...
- Java对象初始化详解
在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一点是Java规范规定的.本文试图对Java如何执行对象的初始化做一个详细深入地介绍(与对象初始化相同,类在被加载之后也是需要初始化的,本 ...
- Java对象初始化详解(转)
在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一点是Java规范规定的.本文试图对Java如何执行对象的初始化做一个详细深入地介绍(与对象初始化相同,类在被加载之后也是需要初始化的,本 ...
- c#对象初始化
class test:IEquatable<test> { public int aa { get; set; } public string bb { get; set; } publi ...
- C#语法糖之第二篇: 参数默认值和命名参数 对象初始化器与集合初始化器
今天继续写上一篇文章C#4.0语法糖之第二篇,在开始今天的文章之前感谢各位园友的支持,通过昨天写的文章,今天有很多园友们也提出了文章中的一些不足,再次感谢这些关心我的园友,在以后些文章的过程中不断的完 ...
- Java父类子类的对象初始化过程
摘要 Java基本的对象初始化过程,子类的初始化,以及涉及到父类和子类的转化时可能引起混乱的情况. 1. 基本初始化过程: 对于一个简单类的初始化过程是: static 修饰的模块(static变量和 ...
随机推荐
- Bootstrap 图片形状
@{ Layout = null;}<!DOCTYPE html><html><head> <meta name="viewport&q ...
- huawei 通过BGP的团体属性进行路由控制
网络拓扑 XRV1的配置: =========================================================================== # sysname ...
- Win8 Metro(C#)数字图像处理--2.68图像最小值滤波器
原文:Win8 Metro(C#)数字图像处理--2.68图像最小值滤波器 /// <summary> /// Min value filter. /// </summary> ...
- c#代码安装字体文件
public class FontOperate { [DllImport("kernel32.dll", SetLastError = true)] static extern ...
- js通过沿着作用域链还是原型链查找变量
这是一道非常典型的JS闭包问题,结果和具体的解析请看这里. 对于其中的`函数作用域链的问题`博主似乎没有解释清楚,有一些疑问:js中的变量到底是沿着作用域链还是原型链查找呢? 首先,要分清作用域链与原 ...
- 【备忘】C#语言基础-2
泛型 CollectionClass<ItemClass> items = new CollectionClass<ItemClass>(); items.Add(new It ...
- [Erlang-0015][Lager] Erlang日志框架Lager简析
项目地址:https://github.com/basho/lager (欢迎任何形式的转载,但请务必注明出处:http://www.cnblogs.com/liangjingyang)
- Delphi结束进程模块
function KillTask(ExeFileName: string): integer; const PROCESS_TERMINATE = $0001; var ContinueLoop: ...
- GetSystemTimeAsFileTime讲解(从1601年1月1日到目前经过的纳秒)
void WINAPI GetSystemTimeAsFileTime( Out LPFILETIME lpSystemTimeAsFileTime ); 这个函数获取到的是从1601年1月1日到目前 ...
- 初探 C# 8 的 Nullable Reference Types
溫馨提醒:本文提及的 C# 8 新功能雖已通過提案,但不代表將來 C# 8 正式發布時一定會納入.這表示我這篇筆記有可能白寫了,也表示您不必急著瞭解這項新功能的所有細節,可能只要瞄一下底下的「概要」說 ...