社区
C#
帖子详情
“无法获取托管类型的地址和大小,或无法声明指向它的指针”如何解决
GoldWood
2010-01-19 05:35:01
如题
...全文
2875
8
打赏
收藏
“无法获取托管类型的地址和大小,或无法声明指向它的指针”如何解决
如题
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
8 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
xiesongque
2011-11-09
打赏
举报
回复
看看,谢谢!
doogi
2011-11-08
打赏
举报
回复
kankankan
armitis001
2011-09-02
打赏
举报
回复
我也不知道啊啊啊啊啊啊啊啊啊啊啊
ladsoft
2011-04-18
打赏
举报
回复
1
对于所有其他类型(包括 struct),sizeof 运算符只能在不安全代码块中使用。虽然可以使用 SizeOf 方法,但该方法返回的值和 sizeof 返回的值并不总是相同的。Marshal.SizeOf 在已封送处理类型后返回大小,而 sizeof 返回公共语言运行库分配的大小(包括任何空白)。
GoldWood
2010-01-20
打赏
举报
回复
晕,如果对方的API接口函数使用的大量的指针,而且我还必须要用,那怎么办
ouc_ajax
2010-01-19
打赏
举报
回复
[Quote=引用 2 楼 vrhero 的回复:]
即使与unsafe关键字一起使用时,也不允许获取托管对象的地址或大小或者声明指向托管类型的指针。
不要试图以C++的习惯来对待.NET...
[/Quote]
顶!
解释器解释的已经很详细了!
还是把你的类型定义成struct类型吧!(而且只能包含基本数据类型,不包含string)
这个是由c#语言本身的特性决定的! 高度强调类型安全,也就是说解释器必须能够
提前计算出用户访问的内存空间地址,不然他的程序域怎么实现...
vrhero
2010-01-19
打赏
举报
回复
即使与unsafe关键字一起使用时,也不允许获取托管对象的地址或大小或者声明指向托管类型的指针。
不要试图以C++的习惯来对待.NET...
boringame
2010-01-19
打赏
举报
回复
不知道问什么
值
类型
和引用
类型
的区别
值
类型
和引用
类型
的区别: 似乎“值
类型
和引用
类型
的区别”是今年面试的流行趋势,我已然是连续三次(目前总共也就三次)面试第一个问题就遇到这个了,这是多大的概率啊,100%. 言归正传,咱还是先来探讨探讨这二者之间有什么区别吧。记得有一次电话面试中,我直接跟面试官说:“值
类型
是现金, 引用
类型
是存折”,后来想想当时说这话虽是有点儿冲动地脱口而出,但也没什么不妥。我这人不善于背理论的教条,喜欢把书本上那些生硬的话跟现实生活中常见 的事物联系起来理解和记忆。 直白点儿说:值
类型
就是现金,要用直接用;引用
类型
是存折,要用还得先去银行取现。
声明
一个值
类型
变量,编译器会在栈上分配一个空间,这个空间对应着该值
类型
变量,空间里存储的就是该变量的值。引用
类型
的实例分配在堆上,新建一个引用
类型
实例,得到的变量值对应的是该实例的内存分配
地址
,这就像您的银行账号一样。具体哪些
类型
是值
类型
哪些是引用类 型,大家翻翻书,背一背就好了,不过我想,做过一段时间的开发,即使您背不了书上教条的定义,也不会把值
类型
和引用
类型
搞混的。接下来,还是老规矩,咱看 码说话吧。 1: public class Person 2: { 3: public string Name { get; set; } 4: public int Age { get; set; } 5: } 6: 7: public static class ReferenceAndValue 8: { 9: public static void Demonstration() 10: { 11: Person zerocool = new Person { Name = "ZeroCool", Age = 25 }; 12: Person anders = new Person { Name = "Anders", Age = 47 }; 13: 14: int age = zerocool.Age; 15: zerocool.Age = 22; 16: 17: Person guru = anders; 18: anders.Name = "Anders Hejlsberg"; 19: 20: Console.WriteLine("zerocool's age:"t{0}", zerocool.Age); 21: Console.WriteLine("age's value:"t{0}", age); 22: Console.WriteLine("anders' name:"t{0}", anders.Name); 23: Console.WriteLine("guru' name:"t{0}", guru.Name); 24: } 25: } 上面这段代码,我们首先创建了一个Person类,包含了Name和Age两个属性,毋庸置疑,Person类是引 用
类型
,Name也是,因为它是string
类型
的(但string是很特殊的引用
类型
,后面将专门有一篇文章来讨论),但Age则是值
类型
。接下来我们 来看看Demonstration方法,其中演示的就是值
类型
跟引用
类型
的区别。 首先,我们
声明
了两个Person类的实例对象,zerocool和anders,前面提到过,这两个对象都被分配 在堆上,而zerocool和anders本身其实只是对象所在内存区域的起始
地址
引用,换句话说就是
指向
这里的
指针
。我们
声明
对象实例时也顺便分别进行 了初始化,首先我们看,zerocool对象的值
类型
成员,我们赋值为25(对,我今年25岁),anders(待会儿你们就知道是谁了)的Name属 性,我们赋值为“Anders”。齐活儿,接下来看我们怎么干吧。 我们
声明
一个值
类型
变量age,直接在初始化时把zerocool的Age值赋给它,显然,age的值就是25了。 但这个时候zerocool不高兴了,他想装嫩,私自把自己的年龄改成22岁,刚够法定结婚年龄。然后我们又
声明
了一个引用
类型
的guy对象,初始化时就 把anders赋给它,然后anders露出庐山真面目了,他的名字叫“Anders Hejlsberg”(在此向C#之父致敬)。接下来我们来分别答应出这几个变量的值,看看有什么差别。 你可能要觉得奇怪(你要不觉得奇怪,也就不用再接着往下看了),为什么我们改了zerocool.Age的 值,age没跟着变,改了anders.Name的值,guru.Name却跟着变了呢?这就是值
类型
和引用
类型
的区别。我们
声明
age值
类型
变量,并将 zerocool.Age赋给它,编译器在栈上分配了一块空间,然后把zerocool.Age的值填进去,仅此而已,二者并无任何牵连,就像复印机一 样,只是把zerocool.Age的值拷贝给age了。而引用
类型
不一样,我们在
声明
guy的时候把anders赋给它,前面说过,引用
类型
包含的是只 想堆上数据区域
地址
的引用,其实就是把anders的引用也赋给guy了,因此这二者从此
指向
了同一块内存区域,既然是
指向
同一块区域,那么甭管谁动了里 面的“奶酪”,另一个变现出来的结果也会跟着变,就像信用卡跟亲情卡一样,用亲情卡取了钱,与之关联的信用卡账上也会跟着发生变化。一提到钱,估计大家伙 儿印象就深了些吧,呵呵! 另外,性能上也会有区别的。既然一个是直接操作内存,另一个则多一步先解析引用
地址
,那么显然很多时候值
类型
会减小 系统性能开销。但“很多时候”不代表“所有时候”,有些时候还得量力而为,例如需要大量进行函数参数传递或返回的时候,老是这样进行字段拷贝,其实反而会 降低应用程序性能。另外,如果实例会被频繁地用于Hashtable或者ArrayList之类的集合中,这些类会对其中的值
类型
变量进行装箱操作,这也 会导致额外的内存分配和内存拷贝操作,从应用程序性能方面来看,其实也不划算。 哦对了,上面提到了一个概念,装箱。那么什么是装箱呢?其实装箱就是值
类型
到引用
类型
的转化过程。将一个值
类型
变量 装箱成一个引用
类型
变量,首先会在
托管
堆上为新的引用
类型
变量分配内存空间,然后将值
类型
变量拷贝到
托管
堆上新分配的对象内存中,最后返回新分配的对象内 存
地址
。装箱操作是可逆的,所以还有拆箱操作。拆箱操作
获取
只想对象中包含值
类型
部分的
指针
,然后由程序员手动将其对应的值拷贝给值
类型
变量。接下来我们 来看看典型的装箱和拆箱操作。 1: public static class BoxingAndUnboxing 2: { 3: public static void Demonstration() 4: { 5: int ageInt = new int(); 6: 7: // Boxing operation. 8: object ageObject = ageInt; 9: 10: //ageObject = null; 11: 12: // Unboxing operation. 13: ageInt = (int)ageObject; 14: 15: Console.WriteLine(ageInt); 16: } 17: } 在该方法中,我们首先
声明
了一个值
类型
变量ageInt,但并未给它赋值,接着
声明
了一个典型的引用
类型
变量 ageObject,并把ageInt赋给它,这里就进行了一次装箱操作。编译器现在
托管
堆上分配一块内存空间(空间
大小
为对象中包含的值
类型
变量所占空 间总和外加一个方法表
指针
和一个SyncBlockIndex),然后把ageInt拷贝到这个空间中,再返回该空间的引用
地址
。接下来第13行则是拆箱 操作,编译器
获取
到ageObject对象中值
类型
变量的
指针
,然后将其值拷贝给值
类型
变量。如果你把第10行注释掉的代码打开(这是通俗说法,其实就是 取消注释),那么第13行就会抛出System.NullReferenceException异 常,要说问什么,这又会牵扯出值
类型
跟引用
类型
另一个大的不同。看见了吧,
声明
ageInt时并没有赋值,如果关掉第10行代码,程序不会报错,最后打印 出个0,这说明在
声明
值
类型
变量时,如果没有初始化赋值,编译器会自动将其赋值为0,既然值
类型
没有引用,那么它就不可能为空。引用
类型
不一样,它可以为 空引用,一张过期作废的银行卡是可以存在。而如果将一个空的对象拆箱,编译器上哪儿去找它里面的值
类型
变量的
指针
呢?所以这也是拆箱操作需要注意的地方。 最后,我们在把值
类型
和引用
类型
之间其它一些明显区别大致罗列如下,以便大家能顺利通过面试第一问。 • 所有值
类型
都继承自System.ValueType,但是ValueType没有附加System.Object包含之外其它任何方法,不过它倒是改写了Equals和GetHashCode两个方法。引用
类型
变量的Equals比较的是二者的引用
地址
而不是内部的值,值
类型
变量的Equals方法比较的是二者的值而不是……哦对了,值
类型
压根儿没有引用
地址
; • 值
类型
不能作为其它任何
类型
的基
类型
,因此不能向值
类型
中增加任何新的虚方法,更不该有任何抽象方法,所有的方法都是sealed的(不可重写); • 未装箱的值
类型
分配在栈上而不是堆上,而栈又不是GC的地盘儿,因此GC根本不过问值
类型
变量的死活,一旦值
类型
变量的作用范围一过,它所占的内存空间就立即被回收掉,不劳GC亲自动手。 以上罗列的都是值
类型
和引用
类型
之间的主要区别,文码并茂,相信应该给你留下比较深刻的印象,虽不够深,但愿能起到 抛砖引玉的作用。如果去面SDE职位,估计这深度就差不多了,我这文章不是面向那些要去面Senior SDE甚至Dev Lead的正神,咱这儿庙小,嘿嘿! 总之: 1. 值
类型
的数据存储在内存的栈中;引用
类型
的数据存储在内存的堆中,而内存单元中只存放堆中对象的
地址
。 2. 值
类型
存取速度快,引用
类型
存取速度慢。 3. 值
类型
表示实际数据,引用
类型
表示
指向
存储在内存堆中的数据的
指针
或引用 4. 值
类型
继承自System.ValueType,引用
类型
继承自System.Object 5. 栈的内存分配是自动释放;而堆在.NET中会有GC来释放 C#中基本数据
类型
是值
类型
,结构也是值
类型
。而数组、类、接口、字符串都是引用
类型
。
C#-
获取
托管
对象的
地址
fixed 语句禁止垃圾回收器重定位可移动的变量。 fixed 语句只在不安全的上下文中是允许的。 Fixed 还可用于创建固定
大小
缓冲区。 fixed 语句设置
指向
托管
变量的
指针
,并在执行该语句期间“固定”此变量。 如果没有 fixed 语句,则
指向
可移动
托管
变量的
指针
的作用很小,因为垃圾回收可能不可预知地重定位变量。 C# 编译器只允许在 fixed 语句中分配
指向
托管
变量的
指针
。 uns...
迁移到亚马逊云科技的
托管
数据库(一年有效期)
对于初次尝试云的组织而言,直接迁移策略是一项常见的举措。此直接迁移策略可能会是迁移到云的最简单方法。您的架构图看起来仍然相似,且团队的责任没有改变。但是您并没有充分利用云的优势。在这套由八门课组成的课程中,您将了解从自行管理的数据库(本地或云)迁移到完全
托管
的亚马逊云科技 (Amazon Web Services) 数据库
解决
方案的价值和过程。在本课程中,亚马逊云科技精英 Alex DeBrie 介绍了如何迁移到亚马逊云科技上的
托管
数据库服务。您可以观看 Alex 解释迁移过程的步骤,也可以使用自己的亚马逊云科技账户按顺序操作。课程结束时,您将对整个数据库迁移过程有一个客观的认识。本视频由 Amazon Web Services, Inc. 及其关联公司制作并享有版权。
菜鸟教程95题反思
关于C# 使用
指针
错误代码; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Console菜鸟教程95 { class Program { public struct programming { public f
c#第四次上机总结
c#第四次上机总结各位同学: 大家好! 在这次上机中,大家可以接触到C#3.0中引入的一个新内容:扩展方法。同时还要对方法(Methods)的其他方面作一些研究。1. 研究cs089,这是课件中的一个例子,计算和显示平方数的工作是在窗体的构造函数中完成的。虽然执行效果没有问题,但在编程模式上有点不合理。因为构造函数应该只负责控件的构造工作,具体的业务逻辑应该在其他地方展开。请修改该
C#
110,538
社区成员
642,577
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章