小编Sti*_*gar的帖子

为什么在C#中使用Task <T>而不是ValueTask <T>?

从C#7.0开始,异步方法可以返回ValueTask <T>.解释说,当我们有缓存结果或通过同步代码模拟异步时,应该使用它.但是我仍然不明白使用ValueTask的问题是什么,或者实际上为什么async/await不是从一开始就使用值类型构建的.ValueTask何时无法完成这项工作?

c# asynchronous

146
推荐指数
5
解决办法
2万
查看次数

不可变对象相互引用?

今天,我试图将我的头围绕在彼此引用的不可变对象上.我得出的结论是,如果不使用惰性评估,你不可能做到这一点,但在这个过程中我写了这个(在我看来)有趣的代码.

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类对象的方法.为什么这甚至有效?有没有其他方法来观察未完全构造的物体的状态?

c# immutability

76
推荐指数
5
解决办法
4875
查看次数

Shouldly断言库如何知道断言应用于的表达式?

.NETShouldly断言库以某种方式知道调用断言方法的表达式,因此它能够将它显示在消息中.我试图找出它是如何工作但在源代码中丢失了.我怀疑它会查看已编译的代码,但我真的很想知道这是如何发生的.从文档中

map.IndexOfValue("boo").ShouldBe(2); // -> map.IndexOfValue("boo") should be 2 but was 1
Run Code Online (Sandbox Code Playgroud)

不知何故应该知道表达式map.IndexOfValue("boo")并且能够在测试失败消息中显示它.有谁知道这是怎么回事?

.net c# shouldly

17
推荐指数
1
解决办法
748
查看次数

ASP.NET Web窗体DropDownList具有一个无效的SelectedValue,因为它不存在于项列表中

首先有一些问题(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)

asp.net webforms

16
推荐指数
1
解决办法
2万
查看次数

.NET中的Guid字节顺序

我正在创建这样的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 guid

16
推荐指数
2
解决办法
6201
查看次数

添加对dll的引用与在.NET Standard项目中添加NuGet包

我的解决方案中有一个.NET Standard 2.0项目,我正在使用IConfiguration接口.当我写名称VS建议我引用Microsoft.Extensions.Configuration.Abstractions.dll.如果我这样做,则添加在参考节点下.但是我也可以将它添加为NuGet包.两种方式似乎都有效.我假设参考VS建议是通过项目中引用的.NET Standard SDK添加的.

添加该引用的推荐方法是哪种?每种方法有哪些优点和缺点?

.net c# .net-standard

15
推荐指数
1
解决办法
6332
查看次数

什么是C#6.0 #pragma disable warnings功能?

C#6.0最终功能列表包含一个名为#pragma的功能,列为"已添加",示例是禁用警告.但是,在6.0之前的C#中确实存在此功能.在6.0中添加了什么?

c#

13
推荐指数
1
解决办法
482
查看次数

ASP.NET中缓存的模式和最佳实践是什么?

我们正在开发一个大型遗留应用程序,我们正在重新设计业务层和数据层.我们认为现在是重新设计缓存处理方式的好时机.是否有任何模式和最佳实践来实现缓存层(或在业务层中构建它)?

我能想到的唯一事情就是使用SQL Cache Dependency(这很难,因为我们有一个很大的遗留数据库,有很多表并不总是对应于业务对象)并且实现了强类型的CacheManager类隐藏字符串键并消除类转换问题.

我们可以做些什么更复杂的事情吗?有没有办法在执行更新/删除时强制执行缓存失效?我们应该以某种方式在缓存中维护单个对象并从DB中检索始终使用相同对象的ID列表吗?

基本上你在ASP.NET中使用什么缓存技术?太糟糕了,我们不能使用支持缓存的IoC容器或ORM框架:(

编辑:我更关注可维护性而不是性能.

asp.net caching

12
推荐指数
1
解决办法
9693
查看次数

什么是C#8中的未知可空性?

在C#8.0中,我们可以有可为空的引用类型。文档指出存在4种可为空性。前三个非常清楚,但我无法理解“未知”的含义。文档说它与泛型一起使用,但是当我尝试对泛型中T类型的无约束变量调用方法时,它只会发出警告,就好像该类型可以为空。我看不到unknown和nullable之间的区别。为什么未知存在?它如何表现出来?

c# c#-8.0 nullable-reference-types

11
推荐指数
1
解决办法
477
查看次数

为什么alert(!!"0")和alert(false =="0")都在JavaScript中输出true

据我所知,在JavaScript!应该规范化一个布尔值,将其从某个其他类型转换为true或false.这意味着"0"转换为布尔值true.另一方面,如果我将它与false进行比较,事实证明它实际上是假的(因为比较的结果是真的).我在这里错过了什么规则.我在IE和Opera中测试了它.

javascript

10
推荐指数
2
解决办法
1878
查看次数