将 Visual Studio 2019 v16.3.2 与 .NET Core 3.0 项目设置为 C# 8 并启用可为空引用类型。
<PropertyGroup>
<TargetFramework>netcoreapp3.0</TargetFramework>
<LangVersion>8.0</LangVersion>
<Nullable>enable</Nullable>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)
如果我将其设置为将所有警告视为错误:
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
<WarningsAsErrors />
Run Code Online (Sandbox Code Playgroud)
它将其他警告报告为错误。例如,CS0168 The variable 'x' is declared but never used
被报告为错误。但所有可为空的引用警告仍报告为警告。例如,CS8600 Converting null literal or possible null value to non-nullable type.
仍然报告为警告。
如何将所有可为空的引用警告视为错误?
注意:即使将 CS8600 专门设置为错误处理,也不会导致其报告为错误。如果这样做有效,那么将它们全部视为错误仍然无济于事,因为有很多。
编辑:将特定警告设置为错误放入<WarningsAsErrors>CS8600;CS8602;CS8603</WarningsAsErrors>
csproj 并且不起作用。
根据MSDN杂志上的一篇文章,"尽可能使用"是最佳做法ConfigureAwait(false)
.此外,它指出,"如果你可以ConfigureAwait
在一个方法中的某个时刻使用,那么我建议你在那个点之后的那个方法中使用它." 该文章的作者Stephen Cleary 在他的博客中指出"在你的'库'异步方法中,尽可能使用ConfigureAwait(false)[强调添加]."
鉴于我await
在库项目中的大部分或全部语句应该被广泛使用,是否.ConfigureAwait(false)
可以做某事/更改设置以使其在我的项目/ dll中等待的默认行为不能继续在捕获的上下文?也就是说,我可以省略所有调用.ConfigureAwait(false)
,而只在我需要保留上下文时添加..ConfigureAwait(
true
)
我有一个基类DomainObject
用于我在NHibernate中使用的所有业务对象.它包含该Id
属性.
public abstract class DomainObject
{
public virtual int Id { get; private set; }
}
Run Code Online (Sandbox Code Playgroud)
我想写一个IEqualityComparer
比较我的域对象.如果两个对象具有相同Id
且对象类型相同,则它们应该相等.但是当我GetType()
用来获取对象的类型时,它将返回NHibernate代理类型.所以这段代码:
bool IEqualityComparer.Equals(object x, object y)
{
// null checking code skipped here
if(x is DomainObject && y is DomainObject)
{
return ((DomainObject) x).Id == ((DomainObject) y).Id
&& x.GetType() == y.GetType();
}
return x.Equals(y);
}
Run Code Online (Sandbox Code Playgroud)
不能正常工作,因为类型x is Asset
而且类型y is AssetProxy21879bba3e9e47edbbdc2a546445c657
.
那么,如何在可能是NHibernate代理对象的对象上获取实体类型?即在上面的例子Asset
而不是AssetProxy21879bba3e9e47edbbdc2a546445c657
?
它建议使用一个ConfigureAwait(false)
当你可以随时,特别是在图书馆,因为它可以帮助避免死锁和提高性能.
我编写了一个大量使用异步的库(访问数据库的Web服务).图书馆的用户遇到了僵局,经过多次痛苦的调试和修补后,我将其追踪到了单独使用await Task.Yield()
.我使用过的其他任何地方.ConfigureAwait(false)
,但是不支持Task.Yield()
.
对于需要等效的情况,推荐的解决方案是Task.Yield().ConfigureAwait(false)
什么?
我已经读过有关如何SwitchTo
移除某个方法的内容.我可以看出为什么那可能是危险的,但为什么没有相应的Task.Yield().ConfigureAwait(false)
?
编辑:
为了提供我的问题的进一步背景,这里有一些代码.我正在实现一个开源库,用于访问支持异步的DynamoDB(作为AWS的服务的分布式数据库).IX-Async库IAsyncEnumerable<T>
提供了许多操作返回.该库不提供从以"块"提供行的数据源生成异步枚举的好方法,即每个异步请求返回许多项.所以我有自己的通用类型.该库支持预读选项,允许用户指定在调用实际需要之前应该请求多少数据.MoveNext()
基本上,这是如何工作的,我通过调用GetMore()
和传递这些块之间的状态来请求块.我将这些任务放入chunks
队列并将它们出列并将它们转换为我放在单独队列中的实际结果.这个NextChunk()
方法就是问题所在.根据值的不同,ReadAhead
我会在完成最后一个(最多)之后保持获取下一个块,直到需要一个值但不可用(无)或仅获取超出当前使用值的下一个块(一些).因此,获取下一个块应该并行/不阻止获取下一个值.枚举器代码是:
private class ChunkedAsyncEnumerator<TState, TResult> : IAsyncEnumerator<TResult>
{
private readonly ChunkedAsyncEnumerable<TState, TResult> enumerable;
private readonly ConcurrentQueue<Task<TState>> chunks = new ConcurrentQueue<Task<TState>>();
private readonly Queue<TResult> results = new Queue<TResult>();
private CancellationTokenSource cts = new CancellationTokenSource();
private TState lastState;
private TResult current;
private …
Run Code Online (Sandbox Code Playgroud) 我喜欢Noda Time使用命名空间中的*Pattern
各种类型处理格式化和解析值NodaTime.Text
.但是,用户输入通常不像单个格式那样规则.例如,我们的应用程序使用时间格式,"h:mm tt"
但我们希望能够以下列任何格式解析用户输入:
h:mm tt
h:mmtt
(没有空间)h:mm t
h:mmt
(没有空间)h tt
hh:mm
有没有办法使用Noda Time来解析可能有多种格式的输入?
我有一种情况,我想依赖注入我的用户对象,但也将当前用户放在IoC容器中.我想要以下几行:
kernel.Get<User>(); // Should return a new User()
kernel.Get<User>("Current"); // Should return the current user
Run Code Online (Sandbox Code Playgroud)
有人可能认为像这样的绑定会起作用:
Bind<User>().ToSelf();
Bind<User>().ToMethod(LoadCurrentUser).InRequestScope().Named("Current");
Run Code Online (Sandbox Code Playgroud)
当然,这给了:
Ninject.ActivationException: Error activating User More than one matching bindings are available. Activation path: 1) Request for User Suggestions: 1) Ensure that you have defined a binding for User only once.
我理解错误,因为命名绑定不限制该绑定的应用程序,因此两个绑定都适用.很明显,我需要使用.When*()方法的上下文绑定,但我无法想出任何方法来做到这一点.我觉得应该有什么方法可以检测是否应用了命名实例.就像是:
// Not valid Ninject syntax
Bind<User>().ToSelf().WhenUnnamedRequested();
Bind<User>().ToMethod(LoadCurrentUser).WhenNamedRequested().InRequestScope().Named("Current");
Run Code Online (Sandbox Code Playgroud)
我找不到IRequest
界面上的任何地方或它的属性告诉我要求的名称.我该怎么做呢?
我目前正在使用DynamoDB并且扫描时遇到问题.我可以使用ExclusiveStartKey以正向顺序获取分页结果.但是,无论我设置是ScanIndexForward
true还是false,我都会从扫描操作中按顺序获得结果.如何从Scan
DynamoDB中以相反的顺序获得结果?
我发现自己经常编写这样的代码:
try
{
cancellationTokenSource.Cancel();
await task.ConfigureAwait(false); // this is the task that was cancelled
}
catch(OperationCanceledException)
{
// Cancellation expected and requested
}
Run Code Online (Sandbox Code Playgroud)
鉴于我请求取消,这是预料之中的,而且我真的希望忽略该异常。这似乎是一个常见的案例。
有没有更简洁的方法来做到这一点?我是否错过了有关取消的信息?看来应该有什么task.CancellationExpected()
方法什么的。
我正在尝试IUserType
为Noda Time LocalTime
类型创建一个NHibernate ,它将逻辑映射到time
Sql Server 2008/2012中的类型.我能够从数据库中获取值和加载值.但是,我不能编写涉及本地时间比较的查询,例如_session.Query<SchedulingTemplate>().Where(x => x.Start < end && x.End >= start)
给出错误SqlException (0x80131904): The data types time and datetime are incompatible in the less than operator.
我的用户类型的相关代码是:
public Type ReturnedType
{
get { return typeof(LocalTime); }
}
public override object NullSafeGet(IDataReader rs, string[] names, object owner)
{
var dbValue = NHibernateUtil.Time.NullSafeGet(rs, names);
if(dbValue == null)
return null;
return LocalDateTime.FromDateTime((DateTime)dbValue).TimeOfDay;
}
public override void NullSafeSet(IDbCommand cmd, object value, int index)
{ …
Run Code Online (Sandbox Code Playgroud) c# ×4
async-await ×3
nhibernate ×2
nodatime ×2
.net ×1
aws-sdk ×1
c#-8.0 ×1
cancellation ×1
jekyll ×1
ninject ×1
ninject-2 ×1
ruby ×1
task ×1