这是我在2018年的时候发在Unity Forums上的帖子, 至今无人回复, 之前是想用TypedReference做DataTable的相关功能的, 可是结果不正确.

tiancaiwrkOct 18, 2018

System.TypedReference bugged? can't figure out how to use it !!!

C# has some way to get Generic Type target pointer, such as GCHandle / Marshal,
this time I want to use System.TypedReference for getting pointer of any struct, bug I think it's bugged...
I dont know how to report a BUG to Unity, just post it here
here is the code, it works in VS project but not unity project:
    void Start()
{
int v1 = ;
int v2 = ; var m1 = __makeref(v1);
var m2 = __makeref(v2); var val1 = __refvalue(m1, int); // val1 is 100
var val2 = __refvalue(m2, int); // val2 is 1000 Debug.Log(val1);
Debug.Log(val2); unsafe
{
*(IntPtr*)(&m1) = new IntPtr((void*)&v2); // 这里应该是把m1的值改变了的 m1应该为1000 val1 = __refvalue(m1, int); // val1 is 100 -- not changed 可是这里m1赋值没有变换, 还是100
val2 = __refvalue(m2, int); // val2 is 1000 Debug.Log(val1);
Debug.Log(val2); var ptr = *(IntPtr*)(&m1);
var p = (int*)ptr.ToPointer();
var data = *p; // data is 1000 -- changed 奇怪的是这里得到的m1的值又是1000 Debug.Log(data);
}
}
And what's more, if I dont Set the pointer of m1, the value of [data] is Strange!!
    void Start()
{
int v1 = ;
int v2 = ; var m1 = __makeref(v1);
var m2 = __makeref(v2); var val1 = __refvalue(m1, int); // val1 is 100
var val2 = __refvalue(m2, int); // val1 is 1000 Debug.Log(val1);
Debug.Log(val2); unsafe
{
var ptr = *(IntPtr*)(&m1);
var p = (int*)ptr.ToPointer();
var data = *p; // data is 536019728 [random] -- WTF 更奇怪的是直接取m1的值, 居然不对 Debug.Log(data);
}
}
This issue is happened in unity project, it works as expected in VS project.
the VS project value is :
        static unsafe void TT()
{
int v1 = ;
int v2 = ; var m1 = __makeref(v1);
var m2 = __makeref(v2); var val1 = __refvalue(m1, int); // val1 is 100
var val2 = __refvalue(m2, int); // val2 is 1000 unsafe
{
*(IntPtr*)(&m1) = new IntPtr((void*)&v2);  // m1值被赋值1000 val1 = __refvalue(m1, int); // val1 is 1000 VS工程编译的话, 这个m1值赋值正确的 1000
val2 = __refvalue(m2, int); // val2 is 1000 var ptr = *(IntPtr*)(&m1);
var p = (int*)ptr.ToPointer();
var data = *p; // data is 1000 这里也是正确的
}
}

  这个也是偶然想到极限速度对变量赋值的时候看到的做法, 测试以后发现不对劲. 以前大部分时候程序出错我们都会先想到是自己代码写错了, 不过这里可以看出

编译器也是有错的时候的......

C# 在不同编译下的不同表现的更多相关文章

  1. 关于executemany()方法在不同OS和DB API下的不同表现的测试

    昨天在参照着网上写一段关于MySQL连接池的配合gevent多线程调用的代码时遇到了一个问题,自己写的代码根本不能多线程执行,比单会话插入数据慢太多,直到今天早上才发现问题所在,把DB API从MyS ...

  2. 关于mysql的自增测试,innodb和myisam下的不同表现

    关于mysql的自增测试,innodb和myisam下的不同表现 innodb引擎下的自增id测试 1 innodb引擎下,如果显示insert了最大值,那么下次的AUTO_INCREMENT值就是这 ...

  3. 【问题】Java和Scala混合编译下无法正常使用lombok的问题

    工作中有java和scala和混合编译的工程,最近遇到一个问题,就是工程中有依赖java bean的scala文件,编译过程中发现编译器无法找到Java bean 中 lombok生成的getter, ...

  4. c语言在windows下和Mac下的不同表现!

    最近给一个等级考试的C语言培训班上课,学生问起一些++的问题.让我好生为难.因为这些不同的编译器处理方式,在不同的系统下表现并不一致. 不管你洋洋洒洒论述多么一大篇,在事实面前就一下显得苍白了.虽然这 ...

  5. 在用VC编译下debug和release的什么区别

    DEBUG和RELEASE 版本差异及调试相关问题:.         内存分配问题 1.          变量未初始化.下面的程序在debug中运行的很好. thing * search(thin ...

  6. 由button标签在 IE 8.0 下的异常表现引发的一场血案

    写在最前的最后:整篇文章絮絮叨叨说了半天,我得出一个最佳实践:和button标签say goodbay,用 a 标签模拟之. 首先看一个在chrome 下的简单demo 这样的布局在组件开发中再常见不 ...

  7. VS2010 release编译下进行调试,“当前不会命中任何断点,还没有为文档加载”问题解决方案

    在release模式下调试程序,经常出现"当前不会命中任何断点,还没有为文档加载"的问题,可尝试以下方法: 1. 属性 → 配置属性 → C/C++ → 常规 → 调试信息格式:选 ...

  8. 测试json字符和java对象属性不一样在多个json框架下转换的表现

    package com.longge.mytest; import java.io.IOException; import org.junit.Test; import com.alibaba.fas ...

  9. java中的Enum在@RestController(@ResponseBody) 注解下返回的表现

    参考文档 枚举 public enum CouponType { PLATFORM("平台优惠券"), NEWCOMER("新人专享优惠券"), INVITE( ...

随机推荐

  1. JS之for循环面试题

    今天同事问了道问题 ,b=; ,b<;++a,++b){ g=a+b } console.log(g) 问输出结果为多少??? 答案:12 这里要知道for循环的条件不管写多少个,必须都满足才可 ...

  2. Shiro内置过滤器

    Shiro内置过滤器 DefaultFilter 枚举类定义了shiro所有的默认过滤器. package org.apache.shiro.web.filter.mgt; public enum D ...

  3. H5/纯JS实现:把网页中的文字复制到剪切板

    copy =() => { const dom = document.getElementById(`collect-text-${t.Id}`) const selection = windo ...

  4. LeetCode 150:逆波兰表达式求值 Evaluate Reverse Polish Notation

    题目: 根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. Evaluate the value of an arithm ...

  5. torch_10_stackGAN-V2

    核心要点 StackGAN旨在生成高分辨率的真实图片. stackGAN-v1架构包含两个阶段:用于文本到图像的合成,阶段1GAN根据给定的文本描述绘制对象的形状和颜色,生成低分辨率图像.阶段2将阶段 ...

  6. Gitlab 备份还原/迁移

    Gitlab 备份还原 备份数据:通过命令进行备份操作 gitlab-rake gitlab:backup:create ... [DISABLED] Creating backup archive: ...

  7. 转 经典分类网络Googlenet

    转自https://my.oschina.net/u/876354/blog/1637819 2014年,GoogLeNet和VGG是当年ImageNet挑战赛(ILSVRC14)的双雄,GoogLe ...

  8. java架构之路-(tomcat网络模型)简单聊聊tomcat(二)

    上节课我们说到的Tomcat,并且给予了一般的tomcat配置,和配置的作用,提到了HTTP/1.1 也就是我们的网络通讯模型,那么HTTP/1.1又代表什么呢.我们来简答看一下. tomcat有四种 ...

  9. GitFirstRemote

    1.$ git ls-remote From git@github.com:Smoothfu/WPFITEMSSOURCEPRODUCTCOLLECTION.git9a6669a2e2c9e22b30 ...

  10. asp.net 创建虚拟目录 iis创建虚拟目录

    这几天本人接了个档案管理查询系统的小项目,踩过的坑. 其实功能都挺简单的,大致要求客户有很多pdf文档,为了方便管理,所有要开发一个相当于文件管理系统,本人正好有现成的文件管理系统,修改下就可以.其中 ...