Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/466.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我们能把这一行写得更简洁些吗?_Javascript_C#_.net_Lambda_Roslyn - Fatal编程技术网

Javascript 我们能把这一行写得更简洁些吗?

Javascript 我们能把这一行写得更简洁些吗?,javascript,c#,.net,lambda,roslyn,Javascript,C#,.net,Lambda,Roslyn,我想知道是否可以使用更像JavaScript的C语言来编写快捷代码。我尝试用更少的行编写以下代码: public async Task<bool> EnsureAuthenticated() { if (!IsAuthenticated) { if (!(await Authenticate()).IsSuccess) { throw new AuthenticationException();

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

public async Task<bool> EnsureAuthenticated()
{
    if (!IsAuthenticated)
    {
        if (!(await Authenticate()).IsSuccess)
        {
            throw new AuthenticationException();
        };
    }
    return true;
}
公共异步任务确保重新验证()
{
如果(!已验证)
{
如果(!(等待身份验证()).IsSuccess)
{
抛出新的AuthenticationException();
};
}
返回true;
}
后来变成:

public async Task<bool> EnsureAuthenticated()
{
    Func<bool> throwException = () => { throw new AuthenticationException(); };
    return IsAuthenticated || (await Authenticate()).IsSuccess || throwException();
}
公共异步任务确保重新验证()
{
Func throweexception=()=>{抛出新的AuthenticationException();};
返回已验证的| |(等待验证())。IsSuccess | | ThroweException();
}
我能找到的最接近单班轮的是:

public async Task<bool> EnsureAuthenticated()
{
    return IsAuthenticated || (await Authenticate()).IsSuccess ||
    ((Func<bool>)(() => { throw new AuthenticationException(); }))();
}
公共异步任务确保重新验证()
{
返回已验证的| |(等待验证())。IsSuccess||
((Func)(()=>{throw new AuthenticationException();}))();
}
与JavaScript(或EcmaScript 2017,如果考虑异步/等待)中的等效代码相比,它仍然太多。但是我的问题主要是关于lambda部分
((Func)(()=>{throw new AuthenticationException();}))()

在C#或C#vNext中没有更简洁的方法来实现这一点吗?

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

public async Task<bool> EnsureAuthenticated()
{
    return (IsAuthenticated || (await Authenticate()).IsSuccess)
        ? true
        : throw new AuthenticationException();
}
但仔细想想,如果返回值只有一个可能的值,那么它是毫无意义的,因此可以消除它。这两种可能的结果变成(1)抛出或(2)不抛出,而不是(1)抛出或(2)返回
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;
}
公共异步任务确保重新验证()
{
返回IsAuthenticated | |(wait Authenticate())。IsSuccess;
}
首先,通过允许在条件运算符(
?:
)的第二个或第三个操作数中使用
throw
,C#7确实允许您执行与所描述的类似的操作。所以你可以这样写你的方法:

public async Task<bool> EnsureAuthenticated()
{
    return (IsAuthenticated || (await Authenticate()).IsSuccess)
        ? true
        : throw new AuthenticationException();
}
但仔细想想,如果返回值只有一个可能的值,那么它是毫无意义的,因此可以消除它。这两种可能的结果变成(1)抛出或(2)不抛出,而不是(1)抛出或(2)返回
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;
}
公共异步任务确保重新验证()
{
返回IsAuthenticated | |(wait Authenticate())。IsSuccess;
}

让它更简洁有什么用?您可以提取出一个方法,并在
return
语句中调用该方法。@Blip除了学习编译器行为,可能还有可读性之外,没有其他用处。让它更简洁有什么用?你可以提取出一种方法,并在<代码>返回< /Cord>语句中调用该方法。@ BLIP除了学习编译器行为之外可能没有用,也可能是可读性。+ 1:这是一个很好的建议,特别是当你考虑“代码>确保认证的< /代码>时,不传递该方法返回一个布尔值。+ 1:这是一个很好的建议,特别是当您考虑“代码>确保身份验证< /代码>时,不传递该方法返回布尔值。