我发现的其他用途TypedReference:

C#中的“专门化”泛型(这是类型安全的):

static void foo<T>(ref T value)
{//This is the ONLY way to treat value as int, without boxing/unboxing objectsif (value is int){ __refvalue(__makeref(value), int) = 1; }else { value = default(T); }
}

误用时不安全,但正确使用时快速和安全:

//This bypasses the restriction that you can't have a pointer to T,
//letting you write very high-performance generic code.
//It's dangerous if you don't know what you're doing, but very worth if you do.
static T Read<T>(IntPtr address)
{var obj = default(T);var tr = __makeref(obj);//This is equivalent to shooting yourself in the foot//but it's the only high-perf solution in some cases//it sets the first field of the TypedReference (which is a pointer)//to the address you give it, then it dereferences the value.//Better be 10000% sure that your type T is unmanaged/blittable...unsafe { *(IntPtr*)(&tr) = address; }return __refvalue(tr, T);
}

写一个方法的版本sizeof指令,有时会有用:

static class ArrayOfTwoElements<T> { static readonly Value = new T[2]; }static uint SizeOf<T>()
{unsafe {TypedReferenceelem1 = __makeref(ArrayOfTwoElements<T>.Value[0] ),elem2 = __makeref(ArrayOfTwoElements<T>.Value[1] );unsafe{ return (uint)((byte*)*(IntPtr*)(&elem2) - (byte*)*(IntPtr*)(&elem1)); }}
}

编写一个传递“state”参数的方法,以避免装箱:

static void call(Action<int, TypedReference> action, TypedReference state)
{//Note: I could've said "object" instead of "TypedReference",//but if I had, then the user would've had to box any value typestry{action(0, state);}finally { /*Do any cleanup needed*/ }
}

那么,为什么像这样的使用“不鼓励”(由于缺乏文档)?有什么特别的安全原因吗?如果它不与指针混合(无论如何都不是安全的或可验证的),那么它似乎是完全安全和可验证的。

最新情况:

示例代码来证明,确实,TypedReference可以是两倍的速度(或更多):

using System;
using System.Collections.Generic;
static class Program
{static void Set1<T>(T[] a, int i, int v){ __refvalue(__makeref(a[i]), int) = v; }static void Set2<T>(T[] a, int i, int v){ a[i] = (T)(object)v; }static void Main(string[] args){var root = new List<object>();var rand = new Random();for (int i = 0; i < 1024; i++){ root.Add(new byte[rand.Next(1024 * 64)]); }//The above code is to put just a bit of pressure on the GCvar arr = new int[5];int start;const int COUNT = 40000000;start = Environment.TickCount;for (int i = 0; i < COUNT; i++){ Set1(arr, 0, i); }Console.WriteLine("Using TypedReference:  {0} ticks",Environment.TickCount - start);start = Environment.TickCount;for (int i = 0; i < COUNT; i++){ Set2(arr, 0, i); }Console.WriteLine("Using boxing/unboxing: {0} ticks",Environment.TickCount - start);//Output Using TypedReference:  156 ticks//Output Using boxing/unboxing: 484 ticks}
}

用户回答回答于 2018-03-28

__arglist__makeref,和__refvalue语言扩展在C#语言规范中是没有文档的,这些构造用于在引擎盖下实现它们(vararg电话会议,TypedReference类型,arglistrefanytypemkanyref,和refanyva

在VarargLibrary中定义它可以很清楚地表明,它们主要是为了支持可变长度的参数列表,而不是其他的。变量参数列表在不需要与使用varargs的外部C代码接口的平台上没有什么用处。因此,Varargs库不是任何CLI配置文件的一部分。合法的CLI实现可能选择不支持Varargs库,因为它不包含在CLI内核配置文件中:

4.1.6 Vararg 大vararg特征集支持可变长度的参数列表和运行时类型的指针。undefined如果省略:对象引用方法的任何尝试。vararg调用约定或与vararg方法关联的签名编码(请参阅PartitionII)将引发System.NotImplementedException例外。方法使用CIL指令。arglistrefanytypemkrefany,和refanyval将抛出System.NotImplementedException例外。未指定异常的确切时间。类型System.TypedReference不需要定义。

最新情况(回复)GetValueDirect评论):

FieldInfo.GetValueDirectFieldInfo.SetValueDirect基类库的一部分。请注意,.NET Framework类库与基类库之间存在差异。BCL是CLI/C#的一致性实现所需的唯一条件。

一旦使用bcl之外的方法,就会放弃一些可移植性(随着Silverlight和MonoTouch等非.NET CLI实现的出现,这一点变得越来越重要)。即使实现想要增强与Microsoft.NET框架类库的兼容性,它也可以简单地提供GetValueDirectSetValueDirect带着...TypedReference不做TypedReference由运行时特别处理(基本上,使它们与它们的object没有性能效益的对应方)。

如果他们把它记录在C#中,它至少会有几个暗示:

  1. 就像任何一个特征,它五月成为新特性的障碍,特别是因为这个特性并不适合C#的设计,并且需要奇怪的语法扩展和运行时对类型的特殊处理。
  2. C#的所有实现都必须以某种方式实现这个特性,对于不运行在CLI之上或在没有Varargs的CLI之上运行的C#实现来说,这不一定是简单的/可能的。

用户回答回答于 2018-03-28

实际上,诸如指针这样的特性,stackalloc,并且在某些情况下存在某些优化的框架函数以提高性能。

我会说初等类型安全的好处,也提高性能类似于Typedeference通过避免拳击和取消拳击。

static void call(Action<int, TypedReference> action, TypedReference state){action(0, state);
}

对此:

static void call<T>(Action<int, T> action, T state){action(0, state);
}

为什么TypedReference在幕后相关推荐

  1. AI一分钟 | 马斯克证实:特斯拉私有化的幕后推手是沙特主权基金;DeepMind的AI可以检测出超过50种眼疾...

    ▌谷歌 DeepMind 的 AI 可以检测出超过 50 种威胁视力的眼疾  DeepMind 周一发布了一项研究,显示其在使用人工智能诊断眼部疾病方面取得的进展.该研究发表在自然科学杂志上,该研 ...

  2. 陆奇谢幕后,百度的“新”时代

    作者 | 韩依民 转载自| 腾讯深网 尽管距离百度宣布陆奇职位变动的消息已经过去半个月,但这一职位变动所带来的影响仍未平息. 在刚刚过去的两个星期里,陆奇依然是媒体们追逐的热点人物,有关他下一站将去哪 ...

  3. 下一个大计算平台? Amazon Echo 研发幕后全揭露

    作为亚马逊打入智能家居并占据入口地位的标志产品,Echo的研发历程一波三折.本文记者采访内部一线人员,得到Echo问世幕后消息:亚马逊最初瞄准AR,不成后转做声控扬声器,Fire Phone的失败让这 ...

  4. 庖丁解牛迭代器,聊聊那些藏在幕后的秘密 1

    0x00 前言 在我之前的一篇博客<细说C#:不是"栈类型"的值类型,从生命周期聊存储位置>的最后,我以总结和后记的方式涉及到一部分迭代器的知识.但是觉得还是不够过瘾, ...

  5. 在幕后看看Swift中的Map,Filter和Reduce的实现

    一个函数接受一些输入,对它做一些事情并创建一个输出.功能有签名和正文.如果为函数提供相同的输入,则始终获得相同的输出.简而言之,这是函数的定义. 现在我们将通过仔细研究它们来讨论更多功能.我们将在Sw ...

  6. 神盾局hive是什么_《神盾局特工》第七季再爆幕后照,这位角色复古装又美出新高度...

    今天,<神盾局特工>第七季也是最终季再爆出了幕后照,复古装扮的汪可盈真的美出了新高度 之前也曝光过一张剧照,大家都是复古造型的打扮,按照第六季的结尾,长生人们决定穿越时间到神盾局刚开始建立 ...

  7. 互联网电商老三巨头在网站推广下逐步退居幕后新三巨头蓄势待发

    日前,黄峥借着拼多多公布财报的机会宣布辞任拼多多董事长,一石激起千层浪,这也标志着互联网电商老三巨头正式卸任退居幕后,而"新帅"三巨头整装待发即将带领互联网电商平台在网站推广之下走 ...

  8. Git历险记(四)——索引与提交的幕后故事

    我想如果看过<Git历险记>的前面三篇文章的朋友可能已经知道怎么用git add,git commit这两个命令了:知道它们一个是把文件暂存到索引中为下一次提交做准备,一个创建新的提交(c ...

  9. 【Kotlin】属性 与 幕后字段 ( 属性声明 | 属性初始化器 | 属性访问器 | field 属性幕后字段 | lateinit 延迟初始化属性 )

    文章目录 I . 属性 字段 总结 II . 属性声明 III . 属性初始化器 IV . get / set 属性访问器 V . 属性幕后字段 field VI . 变量和常量的区别 VII . 延 ...

最新文章

  1. knn的python代码_KNN-python代码实现
  2. bzoj1143/2718 祭祀river(最大独立集)
  3. css float属性
  4. Spark Master资源调度--worker向master注册
  5. SSD固态硬盘检测工具AS SSD参数
  6. 易语言 html邮件,易语言邮件收发源码
  7. PHP第一季视频教程.李炎恢.学习笔记(五)(第3章 操作符与控制结构(1)(2))
  8. 纪广华老师:谈谈学习数论的参考书
  9. 实验:windows密码破解
  10. 中医经典《伤寒论》-原文
  11. 机器学习结果指标评估
  12. Oracle第二财季业绩表现抢眼 | 搜狗推出“唇语识别”技术 | FF宣布完成超10亿美元A轮融资
  13. c语言程序输出s是什么,C语言中printf格式化输出函数
  14. Dubbo3的Triple协议踩坑记录
  15. 寻仙服务器维护到几点,寻仙10月14日上午服务器例行维护公告
  16. 如何在MD编辑器打出上下标
  17. 吴恩达创办Coursera是受他启发!74岁老父亲自述终身学习路,8年学完146门课程
  18. xmanager 5 linux 6.5,工欲善其事必先利其器 —— Xmanager Enterprise 5 和 RealVNC 5/6 介绍...
  19. 轮播图的做法(更换背景图片)
  20. 奇怪的报错(uncaught typeerror illegal invocation)

热门文章

  1. 1.Python数据类型、方法
  2. 集合框架(一) ----------Map集合遍历的方法
  3. CCTF部分赛题分析
  4. Winodws live writer
  5. 记一次 IIS 7.0 身份验证相关的问题解决
  6. PAT-Mars number
  7. 从java到C++入门
  8. 算法入门经典习题第一章
  9. 987C. Three displays
  10. html加注算法源码,200种加密算法(源码)