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团队非常忙于让异步/等待正常工作.我们将考虑该语言的假设未来版本.
如果您有一个非常可靠的用例,这将有助于我们确定该功能的优先级.
用例:
使用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)
| 归档时间: |
|
| 查看次数: |
5599 次 |
| 最近记录: |