首页 > 解决方案 > 我应该选择 C# 7.0 元组而不是 `out` 吗?

问题描述

public Task<User> Register(User user, string password) 
{
    byte[] passwordHash, passwordSalt;
    CreatePasswordHash(password, out passwordHash, out passwordSalt);

    user.PasswordHash = passwordHash;
    user.PasswordSalt = passwordSalt;

    return user;
}

public void CreatePasswordHash(string password, out byte[] passwordHash, out byte[] passwordSalt) 
{
    using (var hmac = new System.Security.Cryptography.HMACSHA512())
    {
        passwordSalt = hmac.Key;
        passwordHash = hmac.ComputeHash(System.Text.Encoding.UTF8.GetBytes(password));
    }
}

或元组:

public Task<User> Register(User user, string password) 
{
    byte[] (passwordHash, passwordSalt) = CreatePasswordHash(password, passwordHash, passwordSalt);

    user.PasswordHash = passwordHash;
    user.PasswordSalt = passwordSalt;

    return user;
}

public (byte[], byte[]) CreatePasswordHash(string password, byte[] passwordHash, byte[] passwordSalt) 
{
    using (var hmac = new System.Security.Cryptography.HMACSHA512())
    {
        passwordSalt = hmac.Key;
        passwordHash = hmac.ComputeHash(System.Text.Encoding.UTF8.GetBytes(password));

        return (passwordSalt, passwordHash);
    }
}

我目前正在使用上面的代码,它使用out关键字。在这种情况下,是否最好使用 C# 7.0 值元组而不是使用out关键字?

标签: c#coding-stylec#-8.0c#-7.0

解决方案


它们几乎是一样的。

if (int.TryParse(text, out var value))

比眼睛更容易

var (success, value) = int.TryParse(text);
if (success)

但是如果你的方法是异步的,你就无法逃脱它

var (success, value) = await int.TryParseAsync(text);
if (success)

将来,您可能可以执行以下操作:

if (var (success, value) = int.TryParse(text); success)

但暂时没有。。


推荐阅读