Bộ ba trích dẫn của Python được giải cứu bằng cách cho phép các chuỗi trải dài trên nhiều dòng, bao gồm NEWLINEs, TAB nguyên văn và bất kỳ ký tự đặc biệt nào khác
Cú pháp của dấu ngoặc kép bao gồm ba dấu nháy đơn hoặc kép liên tiếp
Ví dụ
Bản thử trực tiếp
#!/usr/bin/python para_str = """this is a long string that is made up of several lines and non-printable characters such as TAB [ \t ] and they will show up that way when displayed. NEWLINEs within the string, whether explicitly given like this within the brackets [ \n ], or just a NEWLINE within the variable assignment will also show up. """ print para_str
đầu ra
Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau
Lưu ý cách mọi ký tự đặc biệt đã được chuyển đổi sang dạng in của nó, ngay xuống NEWLINE cuối cùng ở cuối chuỗi giữa "up. " và đóng ba dấu ngoặc kép. Cũng lưu ý rằng NEWLINE xảy ra với dấu xuống dòng rõ ràng ở cuối dòng hoặc mã thoát của nó [\n] −
this is a long string that is made up of several lines and non-printable characters such as TAB [ ] and they will show up that way when displayed. NEWLINEs within the string, whether explicitly given like this within the brackets [ ], or just a NEWLINE within the variable assignment will also show up.
Các chuỗi thô hoàn toàn không coi dấu gạch chéo ngược là một ký tự đặc biệt. Mỗi ký tự bạn đặt vào một chuỗi thô sẽ giữ nguyên cách bạn đã viết nó -
Phiên bản mới nhất của C#, 9. 0, được phát hành chính thức với. NET 5 vào tháng 11 năm 2020. Những ngày này đã có tin đồn về các tính năng của phiên bản tương lai, C# 10. ✅
Một trong những lợi thế lớn nhất của phần mềm nguồn mở là có thể thấy dự án phát triển như thế nào theo thời gian khi ngày tháng trôi qua. Với điều này, chúng tôi muốn đề cập đến cùng một C#, vì chúng tôi có thể theo dõi tiến trình của nó trên GitHub và xem tin tức chính của nó
Hãy bắt đầu với những tính năng quan trọng nhất của C# 9. 0 🤗
🔼 Trình khởi tạo mô-đun
Trong phiên bản C#9 mới nhất này. 0, thuộc tính [ModuleInitializer] được sử dụng để chỉ định một phương thức mà chúng ta có thể gọi trước bất kỳ mã nào trong mô-đun, phương thức đích phải là tĩnh, không có bất kỳ loại tham số nào và trả về giá trị rỗng
using system;
using System.Runtime.CompilerServices;
class Program
{
static void Main[string[] args]
{
Console.WriteLine[$"Data={Data}"];
}
public static string Data;
[ModuleInitializer]
public static void Init[]
{
Data="This static method is invoked before any other method in the module";
}
}
🔼 Tiện ích GetEnumerator
Câu lệnh foreach thường hoạt động trên một biến loại IEnumerator khi nó chứa định nghĩa về bất kỳ tiện ích mở rộng công khai nào cho GetEnumerator
Đây là cách chúng ta có thể thấy nó trong ví dụ này 👇
using system;
using System.Collections.Generic;
IEnumerator < string > colors = new List < string > {
"blue",
"red",
"green"
}.GetEnumerator[];
foreach[var colors in colors] {
Console.WriteLine[$ "{color} is my favorite color"];
}
public static class Extensions {
public static IEnumerator < T > GetEnumerator < T > [this IEnumerator < T > enumerator] => enumerator;
}
🔼 Các loại trả về hiệp biến
Trong C#9. 0, kiểu trả về của các phương thức ghi đè thường cụ thể hơn nhiều so với khai báo trong kiểu cơ sở 👇
abstract class Weather {
public abstract Temperature GetTemperature[];
}
class Spain: Weather {
public override Celsius GetTemperature[] => new Celsius[];
}
class USA: Weather {
public override Farenheit GetTemperature[] => ne Farenheit[];
}
class Temperature {}
class Celsius {}
class Farenheit {}
Phương thức GetTemperature[] có kiểu trả về là Nhiệt độ, lớp dẫn xuất là Spain ghi đè phương thức này và trả về một kiểu cụ thể là Celsius
Đó là một tính năng làm cho mã của chúng tôi linh hoạt hơn. ✅
🔼 Trình truy cập khởi tạo
Trình truy cập init làm cho các đối tượng bất biến dễ dàng hơn để tạo và sử dụng 👇,
Point point1 = new[] { X = 1, Y = 2};
Console.WriteLine[point1.ToString[]];
public record Point
{
public int X { get; init;}
public int Y { get; init;}
}
Trình truy cập init có thể được sử dụng với Cấu trúc, Thanh ghi và Lớp. Trình truy cập init có thể được sử dụng với Lớp, Cấu trúc và Thanh ghi 👇,
Point point1 = new[] { X = 1, Y = 2};
Point point2 = point1 with { Y = 4};
Console.WriteLine[point1.ToString[]];
public record Point
{
public int X { get; init;}
public int Y { get; init;}
}
🔼 Kỷ lục
Bây giờ chúng tôi có một loại tham chiếu mới được gọi là bản ghi mang lại cho chúng tôi giá trị bằng nhau. Để hiểu rõ hơn, chúng ta có ví dụ này 👇,
Point point1 = new[1, 2];
Console.WriteLine[point1.ToString[]];
Point point2 = new[1, 2]};
Console.WriteLine[point1.Equals[point2]];
public record Point
{
public int X { get;}
public int Y { get;}
public Point[int x, int y] => [X, Y] = [x, y];
}
Như chúng ta có thể thấy, bản ghi điểm là bất biến, bạn có thể đơn giản hóa rất nhiều cú pháp bằng cách sử dụng một bộ truy cập init vì các thuộc tính của nó là chỉ đọc
🔼 Thông số loại bỏ Lambda
C# 9 tiếp theo. 0 cải tiến là có thể sử dụng loại bỏ [_] làm tham số đầu vào của biểu thức lambda trong trường hợp tham số đó không được sử dụng
________số 8Đây là một tính năng cũng cho phép chúng tôi đọc mã theo cách sạch hơn và đẹp hơn
🔼 Target-Typed mới
Một tính năng rất quan trọng khác trong phiên bản C# mới nhất này là khả năng loại bỏ loại biểu thức mới khi loại đối tượng được biết rõ ràng
Hãy xem một ví dụ nhanh và đơn giản 👇
Point point = new[] {X = 1, Y = 2};
Console.WriteLine[$"point:[{point1.X}, {point.Y}]"];
public class Point
{
public int X { get; set; }
public int Y { get; set; }
}
Đây là một tính năng rất hữu ích vì nó cho phép bạn đọc mã một cách rõ ràng mà không cần phải sao chép loại
this is a long string that is made up of several lines and non-printable characters such as TAB [ ] and they will show up that way when displayed. NEWLINEs within the string, whether explicitly given like this within the brackets [ ], or just a NEWLINE within the variable assignment will also show up.0
🔼 Tuyên bố cấp cao nhất
Trong C#9. 0, có thể viết chương trình cấp cao nhất sau khi sử dụng khai báo
Ở đây chúng ta có thể xem ví dụ 👇
this is a long string that is made up of several lines and non-printable characters such as TAB [ ] and they will show up that way when displayed. NEWLINEs within the string, whether explicitly given like this within the brackets [ ], or just a NEWLINE within the variable assignment will also show up.1
Với các khai báo cấp cao nhất, bạn sẽ không cần khai báo bất kỳ khoảng trắng nào giữa các tên, phương thức chính hoặc chương trình lớp. Tính năng mới này có thể rất hữu ích cho các lập trình viên mới bắt đầu, vì trình biên dịch sẽ làm tất cả những điều này cho bạn
using system;
using System.Collections.Generic;
IEnumerator < string > colors = new List < string > {
"blue",
"red",
"green"
}.GetEnumerator[];
foreach[var colors in colors] {
Console.WriteLine[$ "{color} is my favorite color"];
}
public static class Extensions {
public static IEnumerator < T > GetEnumerator < T > [this IEnumerator < T > enumerator] => enumerator;
}
0Xem các tính năng mới trong C# 9. 0, giúp lập trình đơn giản và trực quan hơn nhiều
✅ Kỳ vọng C# 10
Những gì chúng ta có thể mong đợi trong phiên bản tương lai?
Được rồi, hãy nói về phiên bản tương lai 👇
- Điều gì có thể mang lại cái mới?
- Bạn muốn tôi có gì?
- Khả năng nó được thêm vào là gì?🤔
Lưu ý rằng các tính năng sắp ra mắt vẫn còn gây tranh cãi và không chắc chắn sẽ xuất hiện trong C# 10
Hãy nhớ rằng chúng không chỉ đơn giản là những ý tưởng hay đóng góp từ cộng đồng. Những tính năng mà tôi sắp đề cập này đang được các nhà phát triển của nó xáo trộn. Và mặc dù chúng không được triển khai trong phiên bản tiếp theo, nhưng ngày nay chúng đang được tinh chỉnh để chúng xuất hiện trong các phiên bản C# trong tương lai
Hãy bắt đầu 👍,
🔼 Không gian tên cấp tệp
Khi chúng tôi bắt đầu lập trình bằng C#, chúng tôi đã tạo ứng dụng "Xin chào thế giới". Biết điều này, chúng ta cũng biết rằng C# sử dụng cấu trúc khối cho các không gian tên
using system;
using System.Collections.Generic;
IEnumerator < string > colors = new List < string > {
"blue",
"red",
"green"
}.GetEnumerator[];
foreach[var colors in colors] {
Console.WriteLine[$ "{color} is my favorite color"];
}
public static class Extensions {
public static IEnumerator < T > GetEnumerator < T > [this IEnumerator < T > enumerator] => enumerator;
}
1Điều tốt nhất về điều này là các không gian tên có thể được phủ lên rất dễ dàng, đơn giản bằng cách lồng các khối. Theo cách tương tự, một tệp có thể chứa các loại trong bất kỳ tổ hợp không gian tên nào và nhiều tệp có thể chia sẻ cùng một không gian tên giữa chúng
Nếu chúng ta muốn gạch bỏ phần tiêu cực một chút, hệ thống này sẽ thêm một chút thụt vào nếu chúng ta so sánh nó với các ngôn ngữ ngoặc như JavaScript hoặc Java
Câu hỏi chúng tôi tự hỏi mình vào thời điểm này là
Có thể giữ chức năng đó, nhưng đồng thời giảm thụt đầu dòng dư thừa không?
Có ✅
Làm thế nào là nó có thể?
Nó chỉ đơn giản mở ra rằng việc nhập các không gian tên với phạm vi tệp, điều này sẽ cho phép thiết lập một không gian tên mặc định sẽ được áp dụng tự động cho toàn bộ tệp mà không cần thụt đầu dòng
using system;
using System.Collections.Generic;
IEnumerator < string > colors = new List < string > {
"blue",
"red",
"green"
}.GetEnumerator[];
foreach[var colors in colors] {
Console.WriteLine[$ "{color} is my favorite color"];
}
public static class Extensions {
public static IEnumerator < T > GetEnumerator < T > [this IEnumerator < T > enumerator] => enumerator;
}
2Thông thường chỉ có một không gian tên trong phạm vi tệp cho mỗi tệp, vì vậy sẽ không có vấn đề gì. Tương tự như vậy, hầu hết các tệp mã C# không bao gồm nhiều hơn một không gian tên
Ví dụ: nếu chúng tôi thêm một khối không gian tên vào một tệp sử dụng không gian tên trong phạm vi tệp, một không gian tên lồng nhau được tạo đơn giản
Hãy xem một ví dụ nhanh 👇,
using system;
using System.Collections.Generic;
IEnumerator < string > colors = new List < string > {
"blue",
"red",
"green"
}.GetEnumerator[];
foreach[var colors in colors] {
Console.WriteLine[$ "{color} is my favorite color"];
}
public static class Extensions {
public static IEnumerator < T > GetEnumerator < T > [this IEnumerator < T > enumerator] => enumerator;
}
3Rõ ràng rằng nó không phải là một tính năng quá lớn, nhưng tốt hơn hết là càng có nhiều cải tiến thì nhiệm vụ lập trình sẽ càng dễ dàng và trực quan hơn
🔼 Các nhà xây dựng chính
Trong các phiên bản C# được phát hành mới nhất, chủ đề về mã soạn sẵn đã được giảm đáng kể với các tính năng như thuộc tính tự động
Cải tiến chính của điều này không chỉ đơn giản là giảm số lượng mã được viết mà là giảm số lượng mã phải đọc. Nó làm cho việc điều hướng các cơ sở mã dễ dàng hơn và giảm thiểu những nơi phổ biến nhất có thể xảy ra lỗi
Các hàm tạo chính là một triển khai rất tốt, một lần nữa sẽ làm giảm số lượng mã được viết. Chúng ta có thể thấy nó với ví dụ đơn giản này có một lớp có hàm tạo và hai thuộc tính chỉ đọc
using system;
using System.Collections.Generic;
IEnumerator < string > colors = new List < string > {
"blue",
"red",
"green"
}.GetEnumerator[];
foreach[var colors in colors] {
Console.WriteLine[$ "{color} is my favorite color"];
}
public static class Extensions {
public static IEnumerator < T > GetEnumerator < T > [this IEnumerator < T > enumerator] => enumerator;
}
4Điều mà số liệu thống kê cho chúng ta biết là 70% các lớp của nó có các hàm tạo và hơn 90% trong số chúng chỉ đơn giản là không làm gì khác hơn là sao chép các tham số vào các thuộc tính
Nếu bạn chưa viết bất kỳ loại mã xây dựng nào, đừng lo lắng vì chúng ta vẫn có thể tạo và sử dụng lớp theo cách tương tự
using system;
using System.Collections.Generic;
IEnumerator < string > colors = new List < string > {
"blue",
"red",
"green"
}.GetEnumerator[];
foreach[var colors in colors] {
Console.WriteLine[$ "{color} is my favorite color"];
}
public static class Extensions {
public static IEnumerator < T > GetEnumerator < T > [this IEnumerator < T > enumerator] => enumerator;
}
5Bằng cách sử dụng hàm tạo chính, xác thực thuộc tính không bị loại trừ. Theo cách tương tự, các quy tắc của nó có thể được thực thi trong một trình thiết lập thuộc tính
Hãy xem một ví dụ 👇,
using system;
using System.Collections.Generic;
IEnumerator < string > colors = new List < string > {
"blue",
"red",
"green"
}.GetEnumerator[];
foreach[var colors in colors] {
Console.WriteLine[$ "{color} is my favorite color"];
}
public static class Extensions {
public static IEnumerator < T > GetEnumerator < T > [this IEnumerator < T > enumerator] => enumerator;
}
6Các chi tiết khác cũng có thể thực hiện được [gọi hàm tạo cơ sở trong lớp dẫn xuất, thêm hàm tạo]. Nhược điểm chính của tất cả những điều này là các hàm tạo chính có thể xung đột với các thanh ghi vị trí
🔼 Chuỗi ký tự thô
Chúng ta đã biết rằng các chuỗi thông thường mà C# có, có xu hướng khá lộn xộn vì chúng cần có dấu ngoặc kép [''], dòng mới [\ n] và dấu gạch chéo ngược []. Những gì C# cung cấp trước vấn đề nhỏ này là việc sử dụng các ký tự đặc biệt
Ví dụ: chúng ta có thể thêm tiền tố vào một chuỗi bằng @ và có thể tự do thêm tất cả các chi tiết này mà không gặp vấn đề gì 👇,
using system;
using System.Collections.Generic;
IEnumerator < string > colors = new List < string > {
"blue",
"red",
"green"
}.GetEnumerator[];
foreach[var colors in colors] {
Console.WriteLine[$ "{color} is my favorite color"];
}
public static class Extensions {
public static IEnumerator < T > GetEnumerator < T > [this IEnumerator < T > enumerator] => enumerator;
}
7Điều mà chuỗi ký tự chuỗi thô cho phép là tạo các đường dẫn mới để tránh các sự cố thoát. Sử dụng dấu phân cách của một loạt dấu ngoặc kép, theo sau là dấu ngắt dòng để bắt đầu và dấu ngắt dòng theo sau cùng một số dấu ngoặc kép để đóng
Để hiểu đơn giản hơn, tôi để lại cho bạn ví dụ này bên dưới 👇,
using system;
using System.Collections.Generic;
IEnumerator < string > colors = new List < string > {
"blue",
"red",
"green"
}.GetEnumerator[];
foreach[var colors in colors] {
Console.WriteLine[$ "{color} is my favorite color"];
}
public static class Extensions {
public static IEnumerator < T > GetEnumerator < T > [this IEnumerator < T > enumerator] => enumerator;
}
8Nếu lo ngại của bạn là có khả năng có một chuỗi ba trích dẫn trong chuỗi, bạn chỉ cần mở rộng dấu phân cách để bạn có thể sử dụng tất cả các trích dẫn bạn muốn, miễn là phần đầu và phần cuối được tôn trọng
using system;
using System.Collections.Generic;
IEnumerator < string > colors = new List < string > {
"blue",
"red",
"green"
}.GetEnumerator[];
foreach[var colors in colors] {
Console.WriteLine[$ "{color} is my favorite color"];
}
public static class Extensions {
public static IEnumerator < T > GetEnumerator < T > [this IEnumerator < T > enumerator] => enumerator;
}
9Cũng giống như chuỗi @, dòng mới và khoảng trắng được giữ nguyên trong chuỗi thô. Điều xảy ra là khoảng trắng chung, nghĩa là lượng được sử dụng để chảy máu, bị cắt
Hãy xem đơn giản hơn với một ví dụ 👇,
abstract class Weather {
public abstract Temperature GetTemperature[];
}
class Spain: Weather {
public override Celsius GetTemperature[] => new Celsius[];
}
class USA: Weather {
public override Farenheit GetTemperature[] => ne Farenheit[];
}
class Temperature {}
class Celsius {}
class Farenheit {}
0Đối với điều này 👇,
abstract class Weather {
public abstract Temperature GetTemperature[];
}
class Spain: Weather {
public override Celsius GetTemperature[] => new Celsius[];
}
class USA: Weather {
public override Farenheit GetTemperature[] => ne Farenheit[];
}
class Temperature {}
class Celsius {}
class Farenheit {}
1Với điều này, tôi muốn giải thích với bạn rằng các chuỗi thô không nhằm mục đích thay thế các chuỗi @ mà bạn đang sử dụng ngay bây giờ
Thay vào đó, chúng được chuẩn bị cho những thời điểm cụ thể khi bạn cần một khối được đánh dấu hoặc mã tùy ý và ngược lại, bạn cần một phương pháp mã hóa được đảm bảo an toàn
🟢 Kết luận
Để kết thúc bài viết này, Dotnetsafer kết luận rằng C# vẫn còn nhiều năm phía trước và nó vẫn còn nhiều thứ cần bổ sung để công việc lập trình trở nên dễ dàng và tối ưu hơn