我们每个人的发展方式都不同,这很好。但是我们都有一些别人不知道的技巧或窍门。在这篇文章中,我想与你分享我的 5 大 C# 和 .NET 技巧和窍门。也许有些是熟悉的,也许有些是已知的,或者有些不适用于你。
Some 可能仅适用于 .NET 8。因此,如果在 Visual Studio 中看不到这些语句,请安装 Visual Studio,或 .NET 8 正式发布。
他的想法不是要详细地介绍它们,而是给你一个想法的简短描述和一个例子。如果您对特定提示/技巧有很多疑问,请在评论中告诉我。如果有足够的要求,我将用一整篇文章来介绍它。
在大多数示例中,我将假设以下类、枚举和列表:
public class Product
{
public int Id { get; set; }
public string Title { get; set; }
public int Stock { get; set; }
public Status Status { get; set; }
public bool Available { get; set; }
}
public enum Status
{
Ordered,
Delivered
}
List<Product> products = new()
{
new() { Id = 1, Title = "7Up", Status = Status.Ordered, Stock = 10, Available = true },
new() { Id = 2, Title = "Chips", Status = Status.Ordered, Stock = 0, Available = true },
new() { Id = 3, Title = "Sugar", Status = Status.Delivered, Stock = 67, Available = true },
new() { Id = 4, Title = "Meatballs", Status = Status.Delivered, Stock = 2, Available = true },
};
有时 if 语句是嵌套的。这是因为您需要进行多次检查才能得出结论。以以下代码为例:
if (chips.Stock == 0)
{
if (chips.Status == Status.Ordered)
{
chips.Available = false;
}
}
这是一段非常简单的小代码。但是你知道你可以将这两个if语句合并为一个吗?
if(chips is { Stock: 0, Status: Status.Ordered })
{
chips.Available = false;
}
这样,您可以将多个 if 语句变得非常小。不过,请留意可读性!这是一个小例子,但我设法将 6 个 if 语句合并为一个,但可读性是......不是那么好。
想象一下以下代码:
object? something = products\[0\];
if(something != null && something.GetType() == typeof(Product))
{
Product product = (Product)something;
Console.WriteLine($"The type you are looking at is a {product.GetType()} and has the title {product.Title}");
}
一种非常传统的检查对象的方法,我们假设它不知道实际类型是什么,它不是 null 并且它属于某种类型(在本例中为 Product)。
您也可以使用它,这也是传统的:
object? something = products[0];
if(something != null && something is Product)
{
Productproduct = (Product)something;
Console.WriteLine($"The type you are looking at is a {product.GetType()} and has the title {product.Title}");
}
两者都没有错,但是通过模式匹配会更容易一些。
模式匹配背后的想法是,你有一个空检查(something != null),针对特定类型(Product)测试它,强制转换,并减少代码。
如果你把它应用到上面的代码中,你会得到这个:
if(something is Product product)
{
Console.WriteLine($"The type you are looking at is a {product.GetType()} and has the title {product.Title}");
}
没有空检查,没有额外的强制转换,代码更少。
第一次听说这个,我有点害怕。通常,当某件事很长并且只由大词组成时,很难理解和/或实施。但这个不是。
我认为很多使用 C# 的人都已经在这样做了,但如果你还没有这样做,请不要感到羞耻。
这个应该检查一个变量是否为 null,如果是,它应该分配一个值。如果它不是 null,则应保留原始值。
以下示例将给出错误。想象一下变量 apple 是一个参数,而您不确定其值:
Product apple = null;
Console.WriteLine(apple.Title);
这意味着我们需要检查苹果是否为 null,因此我们需要初始化它并为 Title 属性赋值。容易:
Product apple = null;
if (apple == null)
apple = new() { Title = "Green apple" };
Console.WriteLine(apple.Title);
但是我们可以用 Null-Coalescing Assignment Operator 来缩小这种方式(我只是复制粘贴它,不会一直输入它)。
Product apple = null;
apple ??= new() { Title = "Green apple" };
Console.WriteLine(apple.Title);
更少的代码,如果你让我更好地阅读。但一如既往:注意可读性。
从 C# 7 开始可用,当前版本为 11。正如我们大多数人所知道的那样,可以使用参数初始化对象或类。像这样的东西:
public class Product
{
public int Id { get; set; }
public string Title { get; set; }
public int Stock { get; set; }
public Status Status { get; set; }
public bool Available { get; set; }
public Product(string title, int stock, Status status)
{
Title = title;
Stock = stock;
Status = status;
}
}
但是,您可以使用表达式设置属性的值,从而减少代码数量,并且不必担心构造和解构值。
public class Product
{
public int Id { get; set; }
public string Title { get; set; }
public int Stock { get; set; }
public Status Status { get; set; }
public bool Available { get; set; }
public Product(string title, int stock, Status status) => (Title, Stock, Status) = (title, stock, status);
}
要知道,在较新的版本中,您还可以在类本身上使用主构造函数,而不是定义构造函数。
public class Product(string title, int stock, Status status)
{
public int Id { get; set; }
public string Title { get; set; } = title;
public int Stock { get; set; } = stock;
public Status Status { get; set; } = status;
public bool Available { get; set; }
}
本文的最后一个。
DebuggerDisplayAttribute 显示有关已初始化对象的详细信息。
如果我们使用 apple(第 3 章:Null-Coalescing 赋值运算符)调试代码并将鼠标悬停在变量 apple 上,您将看到以下内容:
变量 apple shows {Product}
如果我们想看到苹果的内容,比如股票,我们需要扩展苹果手表(不,不是那个苹果手表)。但是,有一种更简单的方法可以更快地查看信息:DebuggerDisplayAttribute。
使用 DebuggerDisplayAttribute,您可以查看有关已初始化对象的详细信息。
这样,您可以查看有关对象的大量信息,而无需展开它。您可以根据需要自定义文本。
这些是我给你的 5 个 C# 和 .NET 提示和技巧。也许有些是你所知道的,也许有些是不知道的。也许你觉得它们无关紧要,也许你觉得它们相关,我希望你喜欢这篇文章。