gpt4 book ai didi

javascript - 我们能否让这段话变得更简洁一些?

转载 作者:行者123 更新时间:2023-11-28 13:10:24 26 4
gpt4 key购买 nike

我想知道是否可以像 JavaScript 一样使用 C# 来快捷代码。我尝试用更少的行数编写以下代码:

public async Task<bool> EnsureAuthenticated()
{
if (!IsAuthenticated)
{
if (!(await Authenticate()).IsSuccess)
{
throw new AuthenticationException();
};
}
return true;
}

变成了:

public async Task<bool> EnsureAuthenticated()
{
Func<bool> throwException = () => { throw new AuthenticationException(); };
return IsAuthenticated || (await Authenticate()).IsSuccess || throwException();
}

我能得到的最接近的一句台词是:

public async Task<bool> EnsureAuthenticated()
{
return IsAuthenticated || (await Authenticate()).IsSuccess ||
((Func<bool>)(() => { throw new AuthenticationException(); }))();
}

与 JavaScript 中的等效代码(或 EcmaScript 2017,如果考虑到 async/await 的话)相比,它的代码量仍然太多。但我的问题主要是关于 lambda 部分 ((Func<bool>)(() => { throw new AuthenticationException(); }))() .

在 C# 或 C# vNext 中是否有更简洁的方法来执行此操作?

最佳答案

首先,C# 7 确实允许您执行您所描述的操作,方法是允许在条件运算符的第二个或第三个操作数中使用 throw ( ?:)。所以你可以这样写你的方法:

public async Task<bool> EnsureAuthenticated()
{
return (IsAuthenticated || (await Authenticate()).IsSuccess)
? true
: throw new AuthenticationException();
}

但是,看起来您正试图将可读代码转换为等同于糟糕(几乎不可读)的 JavaScript 代码,并且由于将这种编码风格强制转换为 C#,因此增加了一些额外的不可读性。

你可以这样做;这很简单:

public async Task<bool> EnsureAuthenticated()
{
if (!IsAuthenticated && !(await Authenticate()).IsSuccess)
{
throw new AuthenticationException();
}
return true;
}

您可以使用德摩根定律消除其中一个 !:

public async Task<bool> EnsureAuthenticated()
{
if (!(IsAuthenticated || (await Authenticate()).IsSuccess))
{
throw new AuthenticationException();
}
return true;
}

但是当你仔细想想,如果返回值只有一个可能的值,那它就毫无意义,所以你可以消除它。两种可能的结果将变为 (1) throw 或 (2) not throw 而不是 (1) throw 或 (2) return true:

public async Task EnsureAuthenticated()
{
if (!(IsAuthenticated || (await Authenticate()).IsSuccess))
{
throw new AuthenticationException();
}
}

当然,如果您决定让函数返回 true 或 false 而不是抛出异常,那么它就会变得非常简单和简洁:

public async Task<bool> EnsureAuthenticated()
{
return IsAuthenticated || (await Authenticate()).IsSuccess;
}

关于javascript - 我们能否让这段话变得更简洁一些?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43020836/

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