c#多任务

ala*_*ere 16 .net c# tuples variable-assignment

int a, b, n;
...
(a, b) = (2, 3);
// 'a' is now 2 and 'b' is now 3
Run Code Online (Sandbox Code Playgroud)

这种事情在C#中真的很有帮助.在这个例子中,'a'和'b'没有被封装在一起,例如位置的X和Y可能是.这是否以某种形式存在?

下面是一个不太重要的例子.

(a, b) = n == 4 ? (2, 3) : (3, n % 2 == 0 ? 1 : 2);
Run Code Online (Sandbox Code Playgroud)

Adam Maras在评论中表示:

var result = n == 4 ? Tuple.Create(2, 3) : Tuple.Create(3, n % 2 == 0 ? 1 : 2);
Run Code Online (Sandbox Code Playgroud)

然而,当他指出它创建一个新的三元组而不是更改指定的值时,上述示例的工作类型.

Eric Lippert要求用例,因此可能:

(a, b, c) = (c, a, b); // swap or reorder on one line
(x, y) = move((x, y), dist, heading);
byte (a, b, c, d, e) = (5, 4, 1, 3, 2);
graphics.(PreferredBackBufferWidth, PreferredBackBufferHeight) = 400;
Run Code Online (Sandbox Code Playgroud)

notallama也有用例,他们在下面给出了答案.

Eri*_*ert 22

我们已经考虑过为元组支持一个语法糖,但它没有成为C#4.0的标准.它不太可能成为C#5.0的标准; C#5.0团队非常忙于让异步/等待正常工作.我们将考虑该语言的假设未来版本.

如果您有一个非常可靠的用例,这将有助于我们确定该功能的优先级.

  • 大多数使用'out'参数的方法如果使用多个赋值重写它们将更具可读性和简洁性.编译器警告"out参数'x'必须在控制离开当前方法之前分配"指示容易出错的变量如何 - 如果您必须在return语句中指定所有返回变量,这将是一个不错的,自我强化的方式让程序员知道他们正在做正确的事情. (6认同)
  • 恕我直言,在阅读了Scala并阅读了其他语言如何解决这个问题之后,我现在发现元组的C#方法非常便宜和难看.我真的很期待看到这个功能在语言中完全实现,或者至少添加了一些语法糖.就像现在一样,它对我来说感觉就像一个半烤的功能. (2认同)
  • 我们这些编程本质上更具数学性能的人非常欣赏该语言中的多个赋值/元组支持.我最近广泛使用了F#,因为在我必须与COM代码交互的地方只使用C#,因为F#让我们或多或少地将形式从我们的论文直接转换成代码.我希望在C#中拥有这些功能,我的合作者也不会比我更熟悉函数式语言. (2认同)
  • @DanBarowy:事实上,F#经常因这个属性而受到称赞; 相比之下,C#有更多的"仪式".我不再能够强烈影响假设未来版本的功能集,但我知道Anders和Mads以及其他设计师都知道这是一个痛点. (2认同)

not*_*ama 7

用例:

使用IObservables非常好,因为它们只有一个类型参数.你基本上想要使用任意委托进行订阅,但是你被迫使用Action,这意味着如果你想要多个参数,你必须使用元组,或者创建自定义类来打包和解包参数.

来自游戏的例子:

public IObservable<Tuple<GameObject, DamageInfo>> Damaged ...

void RegisterHitEffects() {
    (from damaged in Damaged
     where damaged.Item2.amount > threshold
     select damaged.Item1)
    .Subscribe(DoParticleEffect)
    .AddToDisposables();
}
Run Code Online (Sandbox Code Playgroud)

变为:

void RegisterHitEffects() {
    (from (gameObject, damage) in Damaged
     where damage.amount > threshold
     select gameObject)
    .Subscribe(DoParticleEffect)
    .AddToDisposables();
}
Run Code Online (Sandbox Code Playgroud)

我觉得它更清洁.

另外,当您想要传递多个值时,可能IAsyncResult会有类似的问题.有时创建类只是为了改变一些数据是很麻烦的,但是现在使用元组会降低代码的清晰度.如果它们在同一个函数中使用,匿名类型很适合该法案,但如果你需要在函数之间传递数据它们不起作用.

此外,如果糖也适用于通用参数,那就太好了.所以:

IEnumerator<(int, int)>
Run Code Online (Sandbox Code Playgroud)

会不会去的

IEnumerator<Tuple<int,int>>
Run Code Online (Sandbox Code Playgroud)