C# - 通过指针对字典值进行不安全交换

标签 c# performance pointers dictionary unsafe

我有两组字典,每组字典都包含相同的键并具有初始化值。

使用不安全的代码,我想交换他们的地址:

Dictionary<string, List<object>> d1 = ...
Dictionary<string, List<object>> d2 = ...
unsafe void SwapEntries(string index)
{
    int* tmp = &d1[index];
    &d1[index] = &d2[index]
    &d2[index] = tmp;
}

假设我已经正确记忆了我的指针算术,我正在寻找的输出将是这样的:

d1 = new Dictionary<string, List<int>>() { "a", { 1, 2, 3 } };
d2 = new Dictionary<string, List<int>>() { "a", { 4, 5, 6 } };
SwapEntries("a");
Console.WriteLine(d1["a"]); //4,5,6
Console.WriteLine(d2["a"]); //1,2,3

但是,当我尝试编写此内容时,出现编译错误“无法获取给定表达式的地址。”

1) 有没有更快的方法来执行我错过的地址交换?性能是这里唯一的优先事项。

2)我的指针算术正确吗?

3)我是否需要完全转移到包装器或不同的数据结构才能执行所描述的地址交换?

最佳答案

我同意马丁·乌尔里希的回答。

表达式d1[index]不是变量。这是对 get 的调用Dictionary<,> 定义的索引器的访问器。您不能使用 & 获取指向它的指针。运算符。

此外,在本例中,它的类型是 List<object> 。您只能使用指向值类型的指针,并且 List<>class类型。

即使您确实拥有真实的存储位置,并且其类型为 object[] ,这仍然是不可能的,因为数组的元素类型是 object 。所以arr[0] (对应于 d1[index][0] )将是 class再次输入,您将无法获取该地址。

斯科特·张伯伦(Scott Chamberlain)对您的问题的评论提供了一种简单的方法。只需使用

void SwapEntries(string index) 
{
    var tmp = d1[index];
    d1[index] = d2[index];
    d2[index] = tmp; 
}

这仅涉及将引用传递给两个现有的 List<object>有问题的实例。

关于C# - 通过指针对字典值进行不安全交换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44102604/

相关文章:

c++ - 当前实例成员函数的函数指针

char*** 代码无法正常工作

c# - 在 Windows 服务器机器上注册用 C# 编写的 Dll -(安装 C# 类库)

c# - Windows 8 应用程序中长时间启动后无法导航到页面

performance - 删除 chrome devTools 中的内存缓存

使用指针算术编码字符串长度函数

c# - 将表达式 <Func<Foo, bool>> 转换为另一个表达式 <Func<Bar, bool>> 的正确方法

c# - 使用 IIS 托管 WCF 服务的 C# 中的任务管理

python - 将字典与其他字典进行比较,并仅选择其他字典中存在的那些键

用于简单碰撞检测的 Javascript 位图