小编Nig*_*gel的帖子

如何在类模板中使用文件范围的命名空间声明?

C# 10 引入了文件范围的命名空间,我想在 Visual Studio 的类模板中使用它。我已将“类”模板文件更新为以下内容:

namespace $rootnamespace$;
class $safeitemrootname$
{
    //I put this comment here to make sure it's using the right file
}
Run Code Online (Sandbox Code Playgroud)

但是当我创建一个新的空类时,我得到了这个自动生成的代码:

namespace ProjectName
{
    internal class Class1
    {
        //I put this comment here to make sure it's using the right file
    }
}
Run Code Online (Sandbox Code Playgroud)

我需要做什么才能使空类的自动生成代码看起来像这样?

namespace ProjectName;  
internal class Class1
{

}
Run Code Online (Sandbox Code Playgroud)

作为参考,我使用的是 Visual Studio 2022 Professional,我的项目使用的是 C#10 和 .NET 6。

我正在修改的类模板文件的位置是:C:\Program Files\Microsoft Visual Studio\2022\Professional\Common7\IDE\ItemTemplates\CSharp\Code\1033\Class\Class.cs

c# templates visual-studio visual-studio-2022

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

我应该如何解释 C# 中的“空检查模式”

我有一些代码可以有效地做到这一点:

    private void DoStuff(int? a)
    {
        int c = 0;
        if (a is int b)
        {
            c = b;
        }
    }
Run Code Online (Sandbox Code Playgroud)

a is int b给了我一个警告:

使用非空模式而不是对任何非空值成功进行类型检查

使用 Resharper 的建议“使用空检查模式”会自动更正此代码,如下所示,从而导致警告消息消失:

   private void DoStuff(int? a)
    {
        int c = 0;
        if (a is { } b)
        {
            c = b;
        }
    }
Run Code Online (Sandbox Code Playgroud)

这很好,但现在我不明白我正在编写的代码。我该如何if(a is {} b)用英语来解释呢?

它是说“如果a不是 null 设置b为非a空值”吗?

或者是{}“底层类型a”(即int)的简写?

我可以在大括号内放什么东西吗?或者大括号本身有自己的含义吗?

任何可以帮助我理解这段代码真正含义的内容将不胜感激。谢谢。

c#

14
推荐指数
2
解决办法
5491
查看次数

如何隐藏依赖的 Nuget 包?

我有一个像这样的类库项目文件:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net6.0-windows</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="InformationLog" Version="2.1.1" />
  </ItemGroup>

</Project>
Run Code Online (Sandbox Code Playgroud)

我的类库有各种公共类型,例如PublicClass1. Nuget 包InformationLog有一个名为 的公共类型Log。我的类库需要Log在内部工作,但我不想让这种类型对我的类库的用户可见。我希望人们可以访问PublicClass1但不能Log访问InformationLog.

我可以保留InformationLog作为依赖项,强制引用我的类库的项目也使用InformationLognuget 包,我只是不希望 Nuget 包中的类型可见。

理想情况下,我希望项目文件中包含一些 XML 来解决此问题。像这样的东西:

  <PackageReference Include="InformationLog" Version="1.9.0" Access="Private"/>
Run Code Online (Sandbox Code Playgroud)

有没有办法做类似的事情?

c# xml nuget

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

为什么 switch 表达式不计入圈复杂度?

假设我有这个方法:

void DoStuff(int a)
{
    int b;
    switch (a)
    {
        case 1: 
            b = 5;
            break;
        case 2:
            b = 100;
            break;
        default:
            b = 0;
            break;
    }
    Console.WriteLine(b);
}
Run Code Online (Sandbox Code Playgroud)

Visual Studio 给出的圈复杂度为 4(在我看来,实际的圈复杂度是 3,但这不是重点)。

现在,如果我使用 switch 表达式重构代码,我会得到:

void DoStuff(int a)
{
    int b = a switch
    {
        1 => 5,
        2 => 100,
        _ => 0
    };
    Console.WriteLine(b);
}
Run Code Online (Sandbox Code Playgroud)

Visual Studio 现在表示圈复杂度为 1,尽管代码正在执行完全相同的操作。圈复杂度真的降低了吗?如果是这样,怎么办?

c# cyclomatic-complexity c#-8.0

6
推荐指数
0
解决办法
107
查看次数

如何在.Net5中引用WindowsBase?

我正在编写一个 .NET 5 类库,其中包含以下代码:

public T[] ConvertToArray<T>(BitmapFrame frame, int samplesPerPixel) where T:struct
{
    var pixelWidth = frame.PixelWidth;
    var array = new T[pixelWidth  * frame.PixelHeight * samplesPerPixel];
    var stride = pixelWidth * Marshal.SizeOf(typeof(T)) *samplesPerPixel;
    frame.CopyPixels(array,stride,0);//this line prevents the code from compiling
    return array;
}
Run Code Online (Sandbox Code Playgroud)

该行frame.CopyPixels给出以下编译错误:

CS7069 对类型“Freezable”的引用声称它是在“WindowsBase”中定义的,但找不到。应引用模块“WindowsBase,Version=4.0.0.0,Culture=neutral,PublicKeyToken=31bf385ad364e35”

我一直在尝试从以下路径添加对 WindowsBase.dll 的引用:C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.8\WindowsBase.dll

但我收到以下错误: 引用无效或不受支持

奇怪的是,Freezable 在Microsoft 文档中列在 .NET 5 下。也许问题是我正在使用适用于 .NET Framework 的 WindowsBase.dll,但我不知道 .NET 5 版本在哪里。

有什么想法可以解决这个问题并编译我的代码吗?

谢谢!

.net c# dll bitmapframe .net-5

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

如何参数化 SQL 表而不遭受 SQL 注入漏洞

我正在编写一个 C# 类库,其中的功能之一是能够创建与任何现有表的架构相匹配的空数据表。

例如,这个:

private DataTable RetrieveEmptyDataTable(string tableName)
{
    var table = new DataTable() { TableName = tableName };

    using var command = new SqlCommand($"SELECT TOP 0 * FROM {tableName}", _connection);
    using SqlDataAdapter dataAdapter = new SqlDataAdapter(command);
    dataAdapter.Fill(table);

    return table;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码可以工作,但是它有一个明显的安全漏洞:SQL注入。

我的第一直觉是像这样参数化查询:

    using var command = new SqlCommand("SELECT TOP 0 * FROM @tableName", _connection);
    command.Parameters.AddWithValue("@tableName", tableName);
Run Code Online (Sandbox Code Playgroud)

但这会导致以下异常:

必须声明表变量“@tableName”

在 Stack Overflow 上快速搜索后,我发现了这个问题,它建议使用我的第一种方法(带有 sqli 漏洞的方法)。这根本没有帮助,所以我继续搜索并发现了这个问题,它说唯一安全的解决方案是对可能的表进行硬编码。同样,这不适用于我的类库,它需要适用于任意表名。

我的问题是:如何参数化表名而不受到 SQL 注入漏洞?

c# sql sql-server sql-injection prepared-statement

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