我应该选择C#7.0元组而不是'out'? 公共任务寄存器(用户,字符串密码) { 字节[]passwordHash,passwordSalt; CreatePasswordHash(password,out passwordHash,out passwordSalt); user.PasswordHash=PasswordHash; user.PasswordSalt=PasswordSalt; 返回用户; } public void CreatePasswordHash(字符串密码,out byte[]passwordHash,out byte[]passwordSalt) { 使用(var hmac=new System.Security.Cryptography.HMACSHA512()) { passwordSalt=hmac.Key; passwordHash=hmac.ComputeHash(System.Text.Encoding.UTF8.GetBytes(password)); } }

我应该选择C#7.0元组而不是'out'? 公共任务寄存器(用户,字符串密码) { 字节[]passwordHash,passwordSalt; CreatePasswordHash(password,out passwordHash,out passwordSalt); user.PasswordHash=PasswordHash; user.PasswordSalt=PasswordSalt; 返回用户; } public void CreatePasswordHash(字符串密码,out byte[]passwordHash,out byte[]passwordSalt) { 使用(var hmac=new System.Security.Cryptography.HMACSHA512()) { passwordSalt=hmac.Key; passwordHash=hmac.ComputeHash(System.Text.Encoding.UTF8.GetBytes(password)); } },c#,coding-style,core,c#-7.0,c#-8.0,C#,Coding Style,Core,C# 7.0,C# 8.0,或元组: public Task<User> Register(User user, string password) { byte[] passwordHash, passwordSalt; CreatePasswordHash(password, out passwordHash, out passwordSalt); user.PasswordHash = passwordHash; user.PasswordSalt = passwordS

或元组:

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));
    }
}
公共任务寄存器(用户,字符串密码)
{
字节[](passwordHash,passwordSalt)=CreatePasswordHash(password,passwordHash,passwordSalt);
user.PasswordHash=PasswordHash;
user.PasswordSalt=PasswordSalt;
返回用户;
}
public(字节[],字节[])CreatePasswordHash(字符串密码,字节[]passwordHash,字节[]passwordSalt)
{
使用(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
关键字?

它们几乎是一样的

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);
    }
}
眼睛比眼睛容易看

if (int.TryParse(text, out var value))
但若您的方法是异步的,那个么就无法逃避它

var (success, value) = int.TryParse(text);
if (success)
在将来,您可能可以执行以下操作:

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

但目前还没有。

这将是一个意见问题。按照你的代码标准去做,如果你有代码标准的话;否则,做你觉得更容易理解的事情。优化可读性,无论对您(和/或您的团队)来说是什么。有,但没有一个涵盖
out
vs.tuple。我不相信Microsoft会向.NET Core添加使用tuple的新API,但这只是我的猜测,这绝不是对你自己的代码的指导。我问这个问题的原因是,我对C#比较陌生,我学习C#的很多来源都建议尽可能避免
输出
。一般来说,我发现如果一个方法需要返回多个值,并且这些值彼此相关,那么编写一个具有值属性的类并返回该类的实例是有意义的(请注意,这不适用于像
TryParse
这样返回“成功”的方法值,并为某些
out
参数指定一个值,因为这两个值不直接相关)。如果它返回多个值,并且这些值不相关,那么可能应该将其分为两个方法。
if (var (success, value) = int.TryParse(text); success)