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
我有一些代码可以有效地做到这一点:
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)的简写?
我可以在大括号内放什么东西吗?或者大括号本身有自己的含义吗?
任何可以帮助我理解这段代码真正含义的内容将不胜感激。谢谢。
我有一个像这样的类库项目文件:
<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)
有没有办法做类似的事情?
假设我有这个方法:
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,尽管代码正在执行完全相同的操作。圈复杂度真的降低了吗?如果是这样,怎么办?
我正在编写一个 .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 版本在哪里。
有什么想法可以解决这个问题并编译我的代码吗?
谢谢!
我正在编写一个 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 注入漏洞?