- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
C#的ref局部变量是使用CLR功能(称为托管指针)实现的,该功能具有其自己的一组限制,但幸运的是不可变的不是其中之一。即在ILAsm中,如果您具有托管指针类型的局部变量,则完全有可能更改此指针,使其“引用”另一个位置。 (C ++ / CLI还将此功能公开为interior pointers。)
在ref locals上读取C#documentation似乎对C#的ref locals来说是可重定位的,尽管它基于CLR的托管指针。如果将它们初始化为指向某个变量,则无法使它们指向其他变量。我尝试使用
ref object reference = ref some_var;
ref reference = ref other_var;
最佳答案
[edit:]“ ref-reassign”是on the schedule for C# 7.3。我下面讨论的“条件引用”解决方法是deployed in C# 7.2。
我也一直对此感到沮丧,而最近stumbled on a workable answer。
从本质上讲,在C#7.2中,您现在可以使用ref locals初始化ternary operator,并且可以进行转换。有点折磨,成为ref-local重新分配的模拟。在C#代码的词法范围内向下移动时,可以通过多个变量向下“传递”参考本地分配。
这种方法需要大量非常规的思维和大量的计划。对于某些情况或编码方案,可能无法预期运行时配置的范围,以致于任何条件分配方案都可能适用。在这种情况下,您不走运。或者,切换到显示C++/CLI的managed tracking references。这里的紧张之处在于,对于C#,通过引入托管指针的常规用法(这些要点将在下文中进一步讨论)立即实现的简洁,优雅和高效的巨大而无可争辩的收获,随着所要求的扭曲程度而微不足道。克服重新分配问题。
接下来显示了让我困惑了很长时间的语法。或者,检查我在顶部引用的link。
通过三元运算符? :
的C#7.2 ref-local条件分配
ref int i_node = ref (f ? ref m_head : ref node.next);
ref local
困境的典型问题案例。它来自代码,这些代码在遍历单链接列表时会维护反向指针。在C / C ++中,这项任务应该是微不足道的(也许正是出于这种特殊原因,它还是CSE101讲师所钟爱的),但它完全是使用托管指针C#来完成的。
unsafe
C#中使用完整的本机指针。
ValueType
,原位)中的结构,例如
m_nodes = new Node[100];
,因此每个
next
指针都是整数(其在数组中的索引)。
struct Node
{
public int ix, next;
public char data;
public override String ToString() =>
String.Format("{0} next: {1,2} data: {2}", ix, next, data);
};
Node
结构而处于特殊情况。
static (int head, Node[] nodes) L =
(3,
new[]
{
new Node { ix = 0, next = -1, data = 'E' },
new Node { ix = 1, next = 4, data = 'B' },
new Node { ix = 2, next = 0, data = 'D' },
new Node { ix = 3, next = 1, data = 'A' },
new Node { ix = 4, next = 2, data = 'C' },
});
ValueType
进行成像的(两倍)性能成本。完成后必须将每个图像成像回来!毕竟,我们在这里使用值类型的原因肯定是为了最大化性能。正如我
discuss at length elsewhere on this site一样,结构在
.NET
中可能非常高效,但前提是您永远不要意外地将它们“抬起”到存储中。这很容易做到,并且可以立即破坏您的内存总线带宽。
int ix = 1234;
arr[ix].a++;
arr[ix].b ^= arr[ix].c;
arr[ix].d /= (arr[lx].e + arr[ix].f);
ValueType
字段访问在每个访问上都被独立地取消引用。尽管这种“优化”的确避免了上述带宽损失,但是一遍又一遍地重复相同的数组索引操作可能会导致一组完全不同的运行时损失。现在,(机会)成本是由于不必要地浪费了周期造成的,其中
.NET
重新计算可证明的不变物理偏移量或对阵列执行冗余边界检查。
ix
进行操作之前以任何方式将
arr
与其他线程共享,则JIT必须确保CPU实际上恰好触摸了
ix
存储位置6次,否更多,不少。
ix
在下面不需要存在,因为
1234
仅使用一次。随之而来的是,我之前如此明确地引入的错误无法传播到此示例,因为它没有表达方式,其好处在于,不存在的错误不会引入错误(与“不存在的错误相反。” 。',这肯定是一个错误)
ref Node rec = ref arr[1234];
rec.a++;
rec.b ^= rec.c;
rec.d /= (rec.e + rec.f);
ValueType
本身的实例成员函数和属性,尽管出于某些原因,似乎很多人不喜欢这种方法。无论如何,现在对于C#7 ref当地人来说,这一点很重要。
HashSet<T>
reference source [直接链接]中
.NET 4.7.1
的快照的快照,我将在没有太多解释的情况下显示我的版本:
int v1 = m_freeList;
for (int w = 0; v1 != -1; w++)
{
ref int v2 = ref (w == 0 ? ref m_freeList : ref m_slots[v1].next);
ref Slot fs = ref m_slots[v2];
if (v2 >= i)
{
v2 = fs.next;
fs = default(Slot);
v1 = v2;
}
else
v1 = fs.next;
}
v1
和
v2
的'ref'变量在作用域块之间交织在一起,并且三元运算符用于协调它们如何向下流动。例如,循环变量
w
的唯一用途是处理在链表遍历开始时针对特殊情况激活了哪个变量(前面已经讨论过)。
关于c# - 是否可以重新分配本地的裁判?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46036142/
我有一个应用程序,它会抛出 GKSession 并在各种条件下(连接超时、 session 失败等)创建一个新的 GKSession。不过,我遇到了内存泄漏问题,并且有时会在重新连接几次循环后崩溃。
比如我在宿主代码中有一个浮点指针 float *p 是否可以确定他指向的内存类型(设备/主机)? 最佳答案 在 UVA system 中, 运行时 API 函数 cudaPointerGetAttri
我已将项目转换为 .Net 4.0 并且以下代码不起作用: typeof(RuntimeTypeHandle).GetMethod("Allocate", BindingFlags.Instance
当我声明 char ch = 'ab' 时,ch 只包含 'b',为什么它不存储 'a'? #include int main() { char ch = 'ab'; printf("%c"
我对 Disk Sector 和 Block 有疑问。扇区是一个单位,通常为 512 字节或 1k、2k、4k 等取决于硬件。文件系统 block 大小是一组扇区大小。 假设我正在存储一个 5KB 的
假设我有 8 个人和5000 个苹果。 我想将所有苹果分发给所有 8 个人,这样我就没有苹果了。 但每个人都应该得到不同数量 将它们全部分发出去的最佳方式是什么? 我是这样开始的: let peopl
我正在构建的网站顶部有一个搜索栏。与 Trello 或 Gmail 类似,我希望当用户按下“/”键时,他们的焦点就会转到该搜索框。 我的 JavaScript 看起来像这样: document.onk
我有一小段代码: if (PZ_APP.dom.isAnyDomElement($textInputs)){ $textInputs.on("focus", function(){
我观察到以下行为。 接受了两个属性变量。 @property (nonatomic, retain) NSString *stringOne; @property (nonatomic, assign
我正在解决这样的问题 - 实现一个计算由以下内容组成的表达式的函数以下操作数:“(”、“)”、“+”、“-”、“*”、“/”。中的每个数字表达式可能很大(与由字符串表示的一样大)1000 位)。 “/
我有一组主机和一组任务。 每个主机都有 cpu、mem 和任务容量,每个任务都有 cpu、mem 要求。 每个主机都属于一个延迟类别,并且可以与具有特定延迟值的其他主机通信。 每个任务可能需要以等于或
该程序的作用:从文件中读取一个包含 nrRows 行和 nrColomns 列的矩阵(二维数组)。矩阵的所有元素都是 [0,100) 之间的整数。程序必须重新排列矩阵内的所有元素,使每个元素等于其所在
世界!我有个问题。今天我尝试创建一个代码,它可以找到加泰罗尼亚语号码。但是在我的程序中可以是长数字。我找到了分子和分母。但我不能分割长数字!此外,只有标准库必须在此程序中使用。请帮帮我。这是我的代码
我确定我遗漏了一些明显的东西,但我想在 Objective C 中创建一个 NSInteger 指针的实例。 -(NSInteger*) getIntegerPointer{ NSInteger
这个问题在这里已经有了答案: Difference between self.ivar and ivar? (4 个答案) 关闭 9 年前。
我如何将 v[i] 分配给一系列整数(v 的类型是 vector )而无需最初填充 最佳答案 你的意思是将 std::vector 初始化为一系列整数? int i[] = {1, 2, 3, 4,
我想寻求分配方面的帮助....我把这个作业带到了学校......我必须编写程序来加载一个 G 矩阵和第二个 G 矩阵,并搜索第二个 G 矩阵以获取存在数第一个 G 矩阵的......但是,当我尝试运行
我必须管理资源。它基本上是一个唯一的编号,用于标识交换机中的第 2 层连接。可以有 16k 个这样的连接,因此每次用户希望配置连接时,他/她都需要分配一个唯一索引。同样,当用户希望删除连接时,资源(号
是否有任何通用的命名约定来区分已分配和未分配的字符串?我正在寻找的是希望类似于 us/s 来自 Making Wrong Code Look Wrong ,但我宁愿使用常见的东西也不愿自己动手。 最佳
我需要读取一个 .txt 文件并将文件中的每个单词分配到一个结构中,该结构从结构 vector 指向。我将在下面更好地解释。 感谢您的帮助。 我的程序只分配文件的第一个字... 我知道问题出在函数 i
我是一名优秀的程序员,十分优秀!