Dấu nháy kép trong C++

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;
}
0

Xem 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;
}
2

Thô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;
}
3

Rõ 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;
}
5

Bằ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;
}
6

Cá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;
}
8

Nế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;
}
9

Cũ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 {}
1

Vớ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

3 dấu ngoặc kép có nghĩa là gì?

Dấu ngoặc kép ba lần là một cách hay để có thể bao gồm các loại dấu ngoặc kép khác trong chuỗi của bạn mà không phải sử dụng các ký tự thoát . Ví dụ. print("He said \"my name's John\"") Ví dụ đó yêu cầu ký tự thoát \" để sử dụng dấu ngoặc kép.

việc sử dụng dấu ngoặc kép là gì?

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

Chuỗi trích dẫn ba là gì?

Đăng vào ngày 30 tháng 1 năm 2021 bởi John. Có một số cách để trích dẫn chuỗi trong Python. Dấu ngoặc kép để chuỗi trải rộng trên nhiều dòng . Ngắt dòng trong tệp nguồn của bạn trở thành ký tự ngắt dòng trong chuỗi của bạn. Chuỗi trích dẫn ba lần trong Python hoạt động giống như “here doc” trong các ngôn ngữ khác.

Làm cách nào để đặt dấu ngoặc kép trong C?

Để biểu thị dấu ngoặc kép trong một chuỗi ký tự, hãy sử dụng chuỗi thoát \" . Dấu nháy đơn (') có thể được biểu diễn mà không có chuỗi thoát. Dấu gạch chéo ngược (\) phải được theo sau bởi dấu gạch chéo ngược thứ hai (\\) khi nó xuất hiện trong một chuỗi.