Javascript 我们能把这一行写得更简洁些吗?
我想知道是否可以使用更像JavaScript的C语言来编写快捷代码。我尝试用更少的行编写以下代码: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();
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:这是一个很好的建议,特别是当您考虑“代码>确保身份验证< /代码>时,不传递该方法返回布尔值。