- VisualStudio2022
- pprof-Hướng dẫn sử dụng nó trong bản mạng trực tiếp
- Triển khai C# các loại hộp chọn nhiều màu lựa chọn thả xuống, cây lựa chọn nhiều màu lựa chọn thả xuống và các nút tối đa
- [Ghi chú học tập] Cơ sở dữ liệu cấu trúc: cat tree
C# là một ngôn ngữ được nhập mạnh mẽ. báo phương thức định nghĩa tên, loại và loại (giá trị, tham chiếu hoặc đầu ra) cho từng tham số đầu vào và trả giá trị về. cũng bao gồm các tệp hệ thống, mạng kết nối, bộ sưu tập và đối tượng cũng như tháng. cấu hình điển hình sử dụng các kiểu từ lớp thư viện, cũng như các kiểu do người dùng định nghĩa để mô hình hóa các kiểu khái niệm cụ thể có thể chọn vấn đề miền của chương trình.
Nói một cách đơn giản, nó đề cập đến: các lớp, tham số, trường, thuộc tính, phương thức, mô-đun, tập hợp và các phần tử khác.
//Không có tên (mô-đun) => gõ không gian tên hệ thống Ví dụ_4_1 { //Lớp thuộc về loại lớp hệ thống UserLogin { // Các trường, (string user name, chuỗi mật khẩu) { this.username = tên người dùng;//Parameter=>Nhập hệ thống this.password = mật khẩu } //Phương thức=>Gõ bool công khai hệ thống Đăng nhập(string inputUsername, string inputPassword) { if (inputUsername == tên người dùng && inputPassword == mật khẩu) { return true; } else { return false } } } }
Trình biên dịch sử dụng loại thông tin để đảm bảo rằng tất cả các thao tác được thực hiện trong mã đều an toàn về kiểu, ví dụ:
int a = 5; int b = a + 2; //OK bool test = true; // Toán tử '+' không thể áp dụng cho loại toán 'int' và 'bool'.
Trình biên dịch nhúng loại thông tin vào chương trình dưới dạng siêu dữ liệu. "siêu dữ liệu" ở cấp IL.
CLR sử dụng siêu dữ liệu trong thời gian chạy để đảm bảo an toàn hơn cho loại và tránh lỗi chuyển đổi loại.
Hãy sử dụng windbg để tìm hiểu.
AppDomain là nền tảng nền tảng như nền tảng .net So với .net framework, chỉ còn lại hai, Miền hệ thống và Miền 1.
Cuộc đối thoại.
Mô-đun.
Lớp Chúng ta có thể sử dụng lệnh phụ để hiển thị các loại (lớp) được xác định trong mô-đun và các loại được xác định module-tham chiếu.
Phương thức cũng hiển thị phương thức của lớp cha objcet.
EEClass trong bảng Phương thức xuất ra trường lấy các trường của lớp.
Có một câu nói trên Internet rằng # trong C# thực ra là ++++. Tương đương với C++++, siêu bộ của C++. Từ quan điểm của CLR, tất cả các loại trong CLR đều có sự tương ứng một-một trong C++.
https://github.com/dotnet/runtime/blob/main/src/coreclr/vm/appdomain.cpp https://github.com/dotnet/runtime/blob/main/src/coreclr/vm/class.cpp https://github.com/dotnet/runtime/blob/main/src/coreclr/vm/field.cpp.
Trong các bài luận phỏng vấn bao gồm phần tám, có một câu hỏi thường được đặt ra: Sự khác biệt giữa loại giá trị và Các loại giá By vì no mô tả hai khái niệm từ góc thực hiện, nó tương đương với việc bắn một mũi tên trước và vẽ mục tiêu. hơn là dựa trên sự khác biệt đặc biệt là vốn có của hai loại.
Loại giá trị: Một loại giá trị này có thể hiển thị chứa tất cả dữ liệu của nó theo cách trực tiếp Giá trị của loại giá. Loại tham chiếu mô tả một giá trị để biết vị trí của các giá trị khác.
loại giá trị | tham chiếu kiểu | |
---|---|---|
Trọn đời | Chứa tất cả dữ liệu của nó, kín, tự động giải thích. phiên bản chính đó | Mô tả vị trí của các giá trị khác Thời gian tồn tại của các giá trị khác không phụ thuộc vào tham số giá trị chính reference. |
Khả năng chia sẻ | Theo mặc định, ngữ nghĩa "truyền theo giá trị" được sử dụng áp dụng, sao chép byte và giá trị ban đầu không bị ảnh hưởng. | Có thể chia sẻ nếu chúng tôi muốn sử dụng nó ở nơi khác. use. |
bình đẳng | Chúng tôi chỉ được coi là giống nhau nếu chúng giống nhau về phân tích chuỗi giá trị nhị phân. | Khi các vị trí được chỉ định bởi chúng giống nhau thì chúng sẽ giống nhau. |
Như có thể thấy từ định nghĩa, không có chỗ nào để nói ai được lưu trữ trên ngăn xếp và ai được lưu trữ trên heap. Trong thực tế, các loại giá trị được phân bổ trên ngăn xếp và các loại tham chiếu được phân bổ trên heap. Đó chỉ là quyết định thiết kế được Microsoft đưa ra dựa trên điều kiện thực tế khi thiết kế chuẩn CLI. Vì đây thực sự là một quyết định rất đúng đắn nên Microsoft đã áp dụng quyết định này khi triển khai các CLI khác nhau. Nhưng hãy nhớ rằng đây không phải là viên đạn bạc. Các nền tảng phần cứng khác nhau có thiết kế và kiểu triển khai lưu trữ trên thực tế khác nhau, điều này chủ yếu được phản ánh trong thiết kế của quá trình biên dịch JIT. Trình biên dịch JIT tồn tại trên nền tảng phần cứng x86/x64 vì có ngăn xếp, vùng nhớ heap và thanh ghi. JIT có thể sử dụng nó theo ý muốn. Nó có thể phân bổ các loại giá trị trên heap hoặc trong các thanh ghi. Miễn là nó không vi phạm định nghĩa về loại thì có gì sai?
Nếu bạn chỉ bắt đầu từ định nghĩa, việc lưu tất cả các loại giá trị vào heap là hoàn toàn khả thi, nhưng sẽ quá thuận tiện khi sử dụng các thanh ghi ngăn xếp hoặc CPU. Vì vậy, hai yếu tố tuổi thọ và chia sẻ chủ yếu được xem xét và đặt nó trong không gian ngăn xếp sẽ thích hợp hơn.
lớp nội bộ Chương trình { static void Main(string[] args) { var myStruct = new MyStruct(); myStruct.x = 100; myStruct.y = 102 } } struct MyStruct { public int x;
Có thể thấy rằng bố cục bộ nhớ của loại giá trị không có bất kỳ chi phí bổ sung nào. Nó được phân bổ trực tiếp trong ngăn xếp luồng và được giải phóng cùng với ngăn xếp luồng. Hoàn toàn phù hợp với các khái niệm về tuổi thọ/khả năng chia sẻ.
Bởi vì các kiểu tham chiếu có thể chia sẻ dữ liệu nên thời gian tồn tại của chúng không được xác định. Vì vậy, việc suy nghĩ về nơi lưu trữ các loại tham chiếu đơn giản hơn nhiều so với các loại giá trị. Nói chung, theo định nghĩa, việc lưu trữ kiểu tham chiếu trên ngăn xếp không phải là điều hiển nhiên và rõ ràng là nơi lưu trữ kiểu tham chiếu đó.
lớp nội bộ Chương trình { static void Main(string[] args) { var myClass = new MyClass(); myClass.y = 102; window.Break(); int y;
So sánh nó với tập hợp các loại giá trị, có thể thấy rõ sự khác biệt.
Cũng có thể xác minh bằng cách sử dụng Windbg rằng đối tượng MyClass được phân bổ trong vùng được quản lý và được cấu trúc dưới dạng objHeader + phương thức + chính đối tượng đó.
Ngoài việc được lưu trữ trên "ngăn xếp", các loại giá trị còn có thể được lưu trữ trong "các thanh ghi" và "các vùng được quản lý".
lớp nội bộ Ví dụStruct { public int Main(int i) { var myStruct = new MyStruct(); myStruct.vaule1 = i; return Helper(myStruct); } [MethodImpl(MethodImplOptions.AggressiveInliner)]//Yêu cầu trình biên dịch tạo phương thức linh hoạt nhất có thể nội tuyến Private int Helper(MyStruct arg) { return arg.vaule1; } } struct MyStruct { public int vaule1; public int vaule2; public int vaule4 }
Ở chế độ phát hành 64 bit, vì phương thức Trình trợ giúp được nội tuyến. Do đó, phương thức Trợ giúp sẽ không được gọi nên việc truyền dữ liệu Struct sang phương thức Trợ giúp sẽ bị bỏ qua. Trình biên dịch JIT tối ưu hóa toàn bộ hoạt động để chỉ hoạt động trên các thanh ghi CPU.
Đây có thể là một vấn đề về môi trường. Phiên bản phát hành của tôi không bao giờ được nội tuyến, điều này khiến cho nó không thể sao chép được trong Windbg. Bạn bè quan tâm có thể tham khảo trang 168 của <.NET Memory Management Guide>.
lớp nội bộ Ví dụStruct2 { public void Main() { var myStruct = new MyStruct2 { vaule1 = 100, vaule2 = 102 }; //Vì đại biểu là loại tham chiếu nên loại tham chiếu nội bộ đề cập đến một loại giá trị, điều này cũng sẽ thúc đẩy loại giá trị vào vùng nhớ được quản lý var f = () => { Console.WriteLine(t.vaule1); f(); window.Break(); } } struct MyStruct2 { public int vaule2; public int vaule3;
Có thể thấy rằng khi một kiểu giá trị được giữ bởi một kiểu tham chiếu thì nó cũng sẽ được cấp phát trong vùng heap.
Trước .NET9, tuyên bố này đúng vì không gian ngăn xếp không tuân theo định nghĩa của loại tham chiếu.
Nhưng sau .NET9, khái niệm này đã thay đổi. Đầu tiên chúng ta hãy nghĩ về một đoạn mã.
lớp công khai Ví dụClass { public void Main() { var myClass = new MyClass() { vaule1 = 100, vaule2 = 102 }; { public int vaule1; public int vaule2; public int vaule3; }
Mặc dù MyClass là một kiểu tham chiếu, nhưng trong phương thức, myClass thực sự không còn được sử dụng khi quá trình thực thi phương thức Main hoàn tất. Do đó, việc đặt myClass vào vùng nhớ heap sẽ gây ra gánh nặng cho GC và lãng phí bộ nhớ. JIT có thể được làm thông minh hơn không? Nếu vòng đời của loại tham chiếu tương tự như vòng đời của ngăn xếp luồng, thì nó có thể được đặt trong không gian ngăn xếp không?
Câu trả lời là có, và nó đã được sử dụng trong JAVA trong nhiều năm. Đây là phân tích thoát nổi tiếng.
.NET9 mới kích hoạt tính năng này nên phạm vi có phần hạn chế. Tuy nhiên, trong tương lai, tôi tin rằng phạm vi sẽ được mở rộng hơn nữa để đạt được mức phân bổ bộ nhớ hiệu suất cao hơn.
Phân bổ bộ nhớ .NET 9: Phân bổ bộ nhớ .NET 8
Hãy trích dẫn một ví dụ chính thức khác https://devblogs.microsoft.com/dotnet/performance-improvements-in-net-9/#object-stack-allocation.
// dotnet run -c Release -f net8.0 --filter "*" --runtimes net8.0 net9.0 sử dụng BenchmarkDotNet.Attribution; sử dụng BenchmarkDotNet.Running; (args); [Trình chẩn đoán bộ nhớ(false)] [Trình chẩn đoán tháo gỡ] [HideColumns("Job", "Error", "StdDev", "Median", "RatioSD")] Kiểm tra lớp công khai { [Điểm chuẩn] public int GetValue() => new MyObj(42).Value riêng tư MyObj { public MyObj(int value) => Value = value; public int Value { get;
Việc lắp ráp trong .net 8 như sau
; Tests.GetValue() đẩy rax mov rdi,offset MT_Tests+MyObj gọi CORINFO_HELP_NEWSFAST mov dword ptr [rax+8],2A mov eax,[rax+8] add rsp,8 ret ;
Phân bổ bộ nhớ trong .net 8 như sau.
Quá trình biên dịch trong .net 9 như sau.
; Tests.GetValue() mov eax,2A ret ;
Phân bổ bộ nhớ trong .net 9 như sau.
Có thể thấy rằng .NET9 trực tiếp thúc đẩy new MyObj(42).Value trả về 42 thông qua phương thức nội tuyến. Đối tượng MyObj sẽ không được tạo trong heap mà sẽ được gán trực tiếp trong không gian ngăn xếp.
Như bạn có thể thấy từ ví dụ trên, cốt lõi của loại giá trị và loại tham chiếu là liệu vòng đời của chúng có thể kiểm soát được hay không và liệu chúng có được chia sẻ bởi các luồng khác không? Bất kể loại nào, miễn là tuổi thọ của nó lớn hơn ngăn xếp luồng hoặc được chia sẻ bởi các luồng khác. Sau đó nó sẽ được phân bổ vào heap. Nếu không, nó sẽ được phân bổ vào ngăn xếp hoặc thanh ghi. Nói một cách đơn giản hơn, nếu JIT không biết khi nào đối tượng được giải phóng thì chắc chắn nó sẽ được cấp phát vào không gian heap. Nếu nó biết khi nào nó được giải phóng, nó sẽ được phân bổ vào không gian ngăn xếp hoặc thậm chí vào một thanh ghi càng nhiều càng tốt.
Cuối cùng, bài viết này về các nguyên tắc cơ bản của hệ thống loại .NETCore (TypesSystem) kết thúc tại đây. Nếu bạn muốn biết thêm về các nguyên tắc cơ bản của hệ thống loại .NETCore (TypesSystem), vui lòng tìm kiếm các bài viết CFSDN hoặc tiếp tục Duyệt qua các bài viết liên quan, tôi hy vọng vậy. bạn sẽ ủng hộ blog của tôi trong tương lai! .
Sự phát triển của Kiến trúc Dịch vụ Kể từ kỷ nguyên phân tán ban đầu, tôi có thể có cùng cách hiểu như hầu hết mọi người, nghĩ rằng nguồn của kiến trúc dịch vụ của chúng tôi là một kiến trúc duy nhất. Trên thực tế, ngay từ hệ thống đơn lẻ, điều này đã không xảy ra.
Tôi tin rằng mọi người thường nghe nói về tuần tự hóa và giải tuần tự hóa và sử dụng nó. Tuy nhiên, một số người có thể không biết: tại sao .net lại có thứ này và làm thế nào .net frameword triển khai cơ chế như vậy cho chúng ta. Ở đây tôi sẽ nói ngắn gọn về nó. tôi đang thực hiện tuần tự hóa và giải tuần tự hóa
Nội dung là cốt lõi của trang web. Để xây dựng một trang web thu hút sự chú ý của người dùng và công cụ tìm kiếm, bạn phải bắt đầu từ chính nội dung của trang web. Trong thời đại thông tin mạng phát triển nhanh chóng như hiện nay, rất nhiều thông tin chất lượng thấp liên tục tràn ngập toàn mạng và các công cụ tìm kiếm không quan tâm đến một số nội dung chất lượng cao.
Công nghệ phần cứng máy tính đã phát triển vượt bậc kể từ khi chiếc máy tính đầu tiên ra đời cho đến nay. Cho dù đó là PC được sử dụng bởi cá nhân hay máy chủ được sử dụng bởi công ty. CPU lõi kép, lõi tứ và tám lõi đã rất phổ biến. Bằng cách này, chúng ta có thể phân bổ chương trình của mình cho nhiều CPU máy tính để tính toán.
Các khái niệm cơ bản: Sao chép nông: nghĩa là các trường của đối tượng được sao chép, nhưng các đối tượng được các trường tham chiếu sẽ không được sao chép. Đối tượng được sao chép và đối tượng gốc chỉ có tên tham chiếu khác nhau nhưng chúng có chung một thực thể. Những thay đổi đối với bất kỳ đối tượng nào sẽ ảnh hưởng đến các đối tượng khác. Hầu hết các loại tài liệu tham khảo, thực
.NET hợp nhất API và SDK độc lập ban đầu vào một khung, điều này rất có lợi cho các nhà phát triển chương trình. Nó điều chỉnh CryptoAPI vào không gian tên System.Security.Cryptography của .NET, giải phóng các dịch vụ mật mã khỏi
Sự khác biệt giữa tệp và luồng tệp (theo cách nói của tôi): Trong quá trình phát triển phần mềm, chúng ta thường phân biệt "các thao tác đọc và ghi" của tệp với "các thao tác tạo, di chuyển, sao chép và xóa"
1. Lời nói đầu Thử nghiệm Unit luôn là một bài toán nan giải và khó khăn mà “ai cũng biết lợi ích rất nhiều nhưng vì nhiều lý do khác nhau mà chưa thực hiện được”. Việc thử nghiệm đơn vị có nên được thực hiện cụ thể hay không và mức độ cần thực hiện, mỗi dự án đều có tình huống riêng. bài viết này là
Xử lý sự kiện 1. Nguồn sự kiện: bất kỳ phần tử HTML (nút), nội dung, div, nút nào 2. Sự kiện: thao tác & của bạn
1. Phản chiếu là một trong những tính năng của Java. Nó cho phép một chương trình Java đang chạy có được thông tin riêng của nó và vận hành các thuộc tính bên trong của một lớp hoặc đối tượng. Oracle chính thức
1. Hiển thị mã nguồn 1?
Sau khi Java kết nối thông tin qua JDBC, nó sẽ nhận được một Connection đối tượng. các các cột khác nhau trong bảng, kiểu dữ liệu, kích hoạt, thủ tục được lưu trữ, thông tin vv.
Có may mắn khi mọi người nói về phản xạ, cơ mặt bắt đầu co giật! By vì trong số các ngôn ngữ được quản lý, Hiệu suất của nó thấp đến mức chúng tôi thậm chí không thể đảm bảo được trong nhiều trường hợp nhất.
1. So với chương trình kiểm soát Linux và Windows, cho dù đó là sách, video hay cộng đồng, bài đăng trên blog và tài khoản chủ trên trường, có rất ít người viết và manual.
Vấn đề: ifndef/define/endif” ====================================================== ============
Vô tình, .Net Core đã được tung ra phiên bản 3.1 và hầu hết các công việc sử dụng .Net làm nền tảng công nghệ của họ bắt đầu chuyển tiếp sang Core.
Tôi thường gặp câu hỏi này trong các cuộc phỏng vấn trước đây. liên hệ giữa ArrayList.LinkedList.Vector: Lúc đầu tôi chưa hiểu được sự khác biệt giữa ba điều này là gì? Này, tôi xấu hổ quá.
Danh sách các thông số hiểu được @RequestParam(required = true) Vui lòng nói về tóm tắt tham số kết luận @RequestParam(r
Mục lục FTP, FTPS và SFTP Giới thiệu về FTP FTPS SFTP Sự khác biệt giữa chế độ hoạt động và chế độ thụ động của phần mềm FTP
1. Mẫu truy cập khách hàng Mẫu truy cập khách hàng là một mẫu hành vi được phép bất kỳ khách truy cập riêng biệt nào có thể truy cập các phần tử được quản lý bên dưới quyền kiểm soát của quản trị viên. biểu tượng (nhưng điều này không bắt buộc, bạn có thể đồng ý cho phép thay đổi điều khiển).
Tôi là một lập trình viên xuất sắc, rất xuất sắc!