小编Hei*_*nzi的帖子

是否有规范的方法来"修复""动态"IEnumerable?

IEnumerable不保证枚举两次会产生相同的结果.实际上,创建一个myEnumerable.First()在执行两次时返回不同值的示例非常容易:

class A {
    public A(string value) { Value = value; }
    public string Value {get; set; } 
}

static IEnumerable<A> getFixedIEnumerable() {
    return new A[] { new A("Hello"), new A("World") };
}

static IEnumerable<A> getDynamicIEnumerable() {
    yield return new A("Hello");
    yield return new A("World");
}

static void Main(string[] args)
{
    IEnumerable<A> fix = getFixedIEnumerable();
    IEnumerable<A> dyn = getDynamicIEnumerable();

    Console.WriteLine(fix.First() == fix.First()); // true
    Console.WriteLine(dyn.First() == dyn.First()); // false
}
Run Code Online (Sandbox Code Playgroud)

这不仅仅是一个学术性的例子:使用流行from ... in ... select new …

c# linq ienumerable

6
推荐指数
1
解决办法
287
查看次数

HKLM\Software\Microsoft\Windows NT\CurrentVersion:CurrentBuild 和 CurrentBuildNumber 有什么区别?

我问的是这两个注册表项:

注册表截图

两者似乎都包含 Windows 10 内部版本号(RTM/TH1 为 10240,1511/TH2 为 10586)。

这两者之间有任何(记录在案的)区别吗?我应该使用哪一个来确定 Windows 10 的“版本”?


脚注:我知道通常检查所需的功能比检查版本号更好。但是,请注意,想要获取当前正在运行的操作系统的版本是合法的,如果需要,我很乐意在评论中讨论。

registry windows-10

6
推荐指数
1
解决办法
4258
查看次数

调试时我无法在堆上看到我的字符串

我试图在使用非常大的字符串的.NET应用程序中调试内存问题.为此,我想设置一些断点并在执行的各个阶段分析堆.

问题是:当使用Visual Studio 2015的诊断工具时,似乎只有在没有调试的情况下启动应用程序时才会显示堆上的大字符串.这很不方便,因为它阻止我设置断点.

问题:这是一个已知的错误吗?或者我错误地使用诊断工具?


如何重现

  1. 使用以下代码创建新的C#控制台应用程序(.NET 4.6.1):

    using System;
    using System.Threading;
    
    class Program
    {
        static void Main(string[] args)
        {
            string test1 = new string('a', 100000000);
            Thread.Sleep(2000);
            string test2 = new string('a', 100000000);
            Thread.Sleep(2000);
            string test3 = new string('a', 100000000);
    
            Console.WriteLine("Done");
            Console.ReadLine();
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 激活诊断工具(Ctrl + Alt + F2)并使用调试启动应用程序(F5).观察内存使用情况并注意每个字符串分配会将内存使用量增加200MB.在内存使用量达到最大值后,获取内存快照并查看堆.

  3. 观察到堆上占用最多内存的对象类型是一个10 KB的图标.显然,这是不正确的.

调试

  1. 停止申请.使用诊断工具再次启动它,不进行调试(Alt + F2).选择"内存使用"并开始.

  2. 再次注意内存的增加,拍摄快照并查看它.

  3. 观察显示三个大字符串(应该是).

在此输入图像描述

.net debugging profiling visual-studio-2015

6
推荐指数
1
解决办法
223
查看次数

为什么VB.NET中的实现属性必须匹配'ReadOnly'说明符?

以下适用于C#:

interface I
{
    int X { get; }
}

class C : I
{
    public int X
    {
        get { ... }
        set { ... }
    }
}
Run Code Online (Sandbox Code Playgroud)

以下在VB.NET中不起作用:

Interface I
    ReadOnly Property X As Integer
End Interface

Class C
    Implements I

    Public Property X As Integer Implements I.X
        Get
            ...
        End Get
        Set(value As Integer)
            ...
        End Set
    End Property
End Class
Run Code Online (Sandbox Code Playgroud)

错误信息Implementing property must have matching 'ReadOnly' or 'WriteOnly' specifiers非常明显,所以我知道这里有什么问题.这也不是一个大问题,因为解决这个限制很容易.

不过我很好奇:有谁知道为什么VB设计师决定以不同于C#的方式处理这种情况?

.net c# vb.net properties interface

5
推荐指数
1
解决办法
2055
查看次数

Entity Framework是否支持模型中的不同数据类型?

我正在考虑使用EF访问客户系统上安装的旧版SQL Server数据库.

问题是数据库模式不是100%一致的:虽然它们都具有相同(相关)的表和字段,但某些数字字段可能具有不同的数据类型.

据我所知,从应用程序的角度来看,类型是"兼容的":例如,包含小数字的字段可能是smallint客户A的数据库,但int客户B的数据库或包含价格的字段可能是decimal(10,2)在A的数据库上,但float在B的数据库上(是的,这意味着B可能会遇到浮点问题 - 毕竟它是一个遗留数据库).

由于我们不是唯一访问数据库的人,因此更改(并因此统一)模式不是一种选择.实体框架是否能够应对这种情况(即,double如果模型定义声称它是a ,它会优雅地接受SQL Server表中的a decimal(10,2))还是会崩溃?

c# sql-server entity-framework legacy-database

5
推荐指数
1
解决办法
2879
查看次数

.net字典使用多少个哈希桶?

我知道这是一个实现细节,但我很好奇:.NET字典中使用的散列桶的数量是否有限制?我假设它会2*numberOfElements附近,但是有没有人确切知道(或者它是否记录在任何地方)?

.net c# memory dictionary hashtable

5
推荐指数
1
解决办法
1610
查看次数

System.Diagnostics.Trace.WriteLine使用哪个跟踪源?

据我所知,有两种方法可以在.NET中创建跟踪消息.

  1. System.Diagnostics.Trace的静态方法:

    Trace.WriteLine("Something happened");
    
    Run Code Online (Sandbox Code Playgroud)
  2. System.Diagnostics.TraceSource的实例方法:

    var ts = new TraceSource("TraceTest");
    ts.TraceInformation("Something happened");
    
    Run Code Online (Sandbox Code Playgroud)

在我的app.config文件中,我可以为所有内容添加跟踪侦听器:

<system.diagnostics>
    <trace>
        <listeners>
            ...
        </listeners>
    </trace>
</system.diagnostics>
Run Code Online (Sandbox Code Playgroud)

或者对于一个特定的跟踪源:

<system.diagnostics>
    <sources>
        <source name="...">
            <listeners>
                ...
            </listeners>
        </source>
    </sources>
</system.diagnostics>
Run Code Online (Sandbox Code Playgroud)

我的问题

如果我使用第一种方法(System.Diagnostics.Trace的静态方法),使用哪个跟踪源名称?

我已经检查了System.Diagnostics.TraceMSDN页面,但没有找到答案.

.net c# trace system.diagnostics

5
推荐指数
1
解决办法
813
查看次数

为什么嵌套类"继承"?

请考虑以下代码示例:

class Outer
{
    public class Nested { }
}

class SubOuter : Outer { }

class Test
{
    Test()
    {
        Outer.Nested x;     // Makes sense.
        SubOuter.Nested y;  // Compiles, but why?
    }
}
Run Code Online (Sandbox Code Playgroud)

似乎嵌套类是由子类"继承"的.那是什么意思?如果我不能(或不能轻易)做到这个功能,我该怎么办?是不是Outer.NestedSubOuter.Nested完全等同?

澄清:当然它是编译的,因为C#规范是这样说的.我明白那个.我在问为什么 C#是这样设计的,因为它似乎没有为语言增加一些东西.如果您有一个相反的例子,即使用此功能更容易/更短/更好的一些代码,请在答案中分享它,我很乐意接受它.

.net c# inheritance nested-class

5
推荐指数
1
解决办法
258
查看次数

了解模拟权限

我有一个使用Windows身份验证和模拟的ASP.NET Web应用程序.这是web.config的相关部分:

<authentication mode="Windows"/>
<identity impersonate="true"/>
Run Code Online (Sandbox Code Playgroud)

应用程序代码现在尝试访问经过身份验证的用户有权访问的文件(XDocument.Load).这完全正常,直到今天我们开始得到以下异常:

System.UnauthorizedAccessException: Access to the path '...' is denied.
Run Code Online (Sandbox Code Playgroud)

(显然,管理员告诉我"服务器上没有任何变化".)

我能够通过向文件授予应用程序池标识权限来"修复"该问题.但是,我不明白为什么这样就解决了这个问题.

我的问题:如果使用模拟,为什么应用程序池标识仍然需要访问所使用的文件?模拟用户和应用程序池标识都需要访问吗?或者只有应用程序池标识?如果是后者,冒充的重点是什么?

c# asp.net iis impersonation

5
推荐指数
1
解决办法
601
查看次数

为什么在 .NET 7 中 DateTime.AddDays 不再四舍五入到最接近的毫秒?

.NET 7 文档DateTime.AddDays(double)

value 参数四舍五入到最接近的毫秒。

然而,这在 .NET 7 中显然不再成立。考虑以下最小示例(fiddle .NET 4.7.2fiddle .NET 7):

var d = 42005.416666666664; // Excel date
var date = new DateTime(1900, 1, 1, 0, 0, 0, 0).AddDays(d - 2.0);

Console.WriteLine(date.ToString("o"));

// .NET 4.8: Prints 2015-01-01T10:00:00.0000000
// .NET 7:   Prints 2015-01-01T09:59:59.9999997
Run Code Online (Sandbox Code Playgroud)

这是故意的更改(即文档有问题/过时),还是我发现了 .NET 7 中的错误?


笔记:

.net c# datetime .net-core

5
推荐指数
1
解决办法
88
查看次数