gpt4 book ai didi

c# - 我可以存储对本地引用的引用吗?

转载 作者:行者123 更新时间:2023-11-30 13:45:41 24 4
gpt4 key购买 nike

明确地说,我想要指针指向指针的行为,这个问题的目的是生成干净、可读的代码。

我有一些代码包含检查多个 Dictionary.TryGetValue 调用结果的条件。如果它可以通过一次调用检索所有必需的对象,那就更干净了,所以我想编写一个扩展,允许我执行以下操作:

Dictionary<string, string> myDictionary; // Initialized somewhere

string x, y, z;
bool foundAllEntries = myDictionary.TryGetValues({"xvalue", out x}, {"yvalue", out y},
{"zvalue", out z});
if (foundAllEntries)
; // Do something with x, y, and z

但是,我想不出一种方法来将扩展方法引用传递给将保存输出的对象。这看起来应该是非常基本的东西。

如何在对象中存储对本地引用的引用?

请注意,这个问题并不是要求实现 TryGetValues 函数的替代方法。我可以通过多种方法使此“工作”,但没有一种方法生成的代码像我的方法那样干净。我正在尝试。

最佳答案

This seems like something that should be very basic.

它不仅不是基本的,而且是完全不可能的:没有办法用 refout 修饰数据类型——这些修饰符只适用于正式的方法参数。换句话说,没有“引用变量”或“输出变量”之类的东西;语言中只有“引用参数”和“输出参数”。

此外,您不能将输出或引用参数作为可变长度参数列表的一部分(即 params 部分)传递,因此该方法也不起作用。

There are many ways I can make this 'work,' but none generate code as clean as the approach I'm trying to take.

奇怪的是,以上并不意味着您无法实现您正在尝试实现的方案,如果您应用 Proxy Design Pattern,代码将几乎与原始代码一样干净。 .诀窍是链接方法调用,并为结果提供隐式转换运算符,如下所示:

class MyMap {
internal IDictionary<string,string> dict = ...
public ItemGetterResult TryGetValues {
get {
return new ItemGetterResult(this, true);
}
}
}

class ItemGetterResult {
private readonly MyMap map;
private bool IsSuccessful {get;set;}
internal ItemGetterResult(MyMap theMap, bool successFlag) {
map = theMap;
IsSuccessful = successFlag;
}
public static implicit operator bool(ItemGetterResult r) {
return r.IsSuccessful;
}
public ItemGetterResult Get(string key, out string val) {
return new ItemGetterResult(
map
, this.IsSuccessful && map.dict.TryGetValue(key, out val)
);
}
}

现在调用看起来像这样:

bool foundAllEntries = myDictionary.TryGetValues
.Get("xvalue", out x)
.Get("yvalue", out y)
.Get("zvalue", out z);

关于c# - 我可以存储对本地引用的引用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27726777/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com