从C#7.0开始,异步方法可以返回ValueTask <T>.解释说,当我们有缓存结果或通过同步代码模拟异步时,应该使用它.但是我仍然不明白使用ValueTask的问题是什么,或者实际上为什么async/await不是从一开始就使用值类型构建的.ValueTask何时无法完成这项工作?
今天,我试图将我的头围绕在彼此引用的不可变对象上.我得出的结论是,如果不使用惰性评估,你不可能做到这一点,但在这个过程中我写了这个(在我看来)有趣的代码.
public class A
{
public string Name { get; private set; }
public B B { get; private set; }
public A()
{
B = new B(this);
Name = "test";
}
}
public class B
{
public A A { get; private set; }
public B(A a)
{
//a.Name is null
A = a;
}
}
Run Code Online (Sandbox Code Playgroud)
我觉得有趣的是,我想不出另一种在尚未完全构造且包含线程的状态下观察A类对象的方法.为什么这甚至有效?有没有其他方法来观察未完全构造的物体的状态?
.NET的Shouldly断言库以某种方式知道调用断言方法的表达式,因此它能够将它显示在消息中.我试图找出它是如何工作但在源代码中丢失了.我怀疑它会查看已编译的代码,但我真的很想知道这是如何发生的.从文档中
map.IndexOfValue("boo").ShouldBe(2); // -> map.IndexOfValue("boo") should be 2 but was 1
Run Code Online (Sandbox Code Playgroud)
不知何故应该知道表达式map.IndexOfValue("boo")并且能够在测试失败消息中显示它.有谁知道这是怎么回事?
首先有一些问题(DropDownList有一个无效的SelectedValue,因为它不存在于项目列表中,DropDownList"有一个无效的SelectedValue,因为它不存在于项目列表中",asp:DropDownList错误:'DropDownList1'有一个SelectedValue,它是无效的,因为它不存在于项目列表中)关于这一点,并提出了解决办法,但我的问题是为什么会发生这种情况.更重要的是我对建议的解决方法不满意,我发现它们非常难看.
所以有一个页面有一个下拉列表和一个按钮:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs" Inherits="TestWebApplication.WebForm2" ViewStateMode="Disabled" %>
<html lang="en" >
<body>
<form id="form1" runat="server">
<div>
<asp:DropDownList ID="ddlTest" runat="server">
</asp:DropDownList>
<asp:Button Text="Test" ID="btnTest" runat="server" onclick="btnTest_Click" />
</div>
</form>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
我将ddlTest与Page_Init上的一些项绑定,然后在btnTest_Click中再次绑定:
using System;
namespace TestWebApplication
{
public partial class WebForm2 : System.Web.UI.Page
{
protected void Page_Init(object sender, EventArgs e)
{
//SelectedIndex is -1, SelectedValue is "", SelectedItem is null
ddlTest.DataSource = new[] { 1, 2, 3 };
ddlTest.DataBind();
ddlTest.SelectedValue = "3";
} …Run Code Online (Sandbox Code Playgroud) 我正在创建这样的GUID
Guid g = new Guid(new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF });
Console.WriteLine(g);
Run Code Online (Sandbox Code Playgroud)
这输出
03020100-0504-0706-0809-0a0b0c0d0e0f
Run Code Online (Sandbox Code Playgroud)
根据维基百科,guid中有四个部分,这解释了为什么字节顺序在四组中切换.然而,维基百科文章还指出所有部分都以Big Endian格式存储.显然前三部分不是Big Endian.guid的GetBytes()方法以与创建相同的顺序返回字节.这种行为的解释是什么?
我的解决方案中有一个.NET Standard 2.0项目,我正在使用IConfiguration接口.当我写名称VS建议我引用Microsoft.Extensions.Configuration.Abstractions.dll.如果我这样做,则添加在参考节点下.但是我也可以将它添加为NuGet包.两种方式似乎都有效.我假设参考VS建议是通过项目中引用的.NET Standard SDK添加的.
添加该引用的推荐方法是哪种?每种方法有哪些优点和缺点?
我们正在开发一个大型遗留应用程序,我们正在重新设计业务层和数据层.我们认为现在是重新设计缓存处理方式的好时机.是否有任何模式和最佳实践来实现缓存层(或在业务层中构建它)?
我能想到的唯一事情就是使用SQL Cache Dependency(这很难,因为我们有一个很大的遗留数据库,有很多表并不总是对应于业务对象)并且实现了强类型的CacheManager类隐藏字符串键并消除类转换问题.
我们可以做些什么更复杂的事情吗?有没有办法在执行更新/删除时强制执行缓存失效?我们应该以某种方式在缓存中维护单个对象并从DB中检索始终使用相同对象的ID列表吗?
基本上你在ASP.NET中使用什么缓存技术?太糟糕了,我们不能使用支持缓存的IoC容器或ORM框架:(
编辑:我更关注可维护性而不是性能.
在C#8.0中,我们可以有可为空的引用类型。文档指出存在4种可为空性。前三个非常清楚,但我无法理解“未知”的含义。文档说它与泛型一起使用,但是当我尝试对泛型中T类型的无约束变量调用方法时,它只会发出警告,就好像该类型可以为空。我看不到unknown和nullable之间的区别。为什么未知存在?它如何表现出来?
据我所知,在JavaScript!应该规范化一个布尔值,将其从某个其他类型转换为true或false.这意味着"0"转换为布尔值true.另一方面,如果我将它与false进行比较,事实证明它实际上是假的(因为比较的结果是真的).我在这里错过了什么规则.我在IE和Opera中测试了它.
c# ×6
.net ×3
asp.net ×2
asynchronous ×1
c#-8.0 ×1
caching ×1
guid ×1
immutability ×1
javascript ×1
shouldly ×1
webforms ×1