51 câu hỏi phỏng vấn .NET Core
1. .NET Standard là gì?
.NET Standard là một đặc tả chính thức của các .NET APIs với mục đích có sẵn trên tất cả các triển khai .NET.
2. .NET Core là gì?
Nền tảng .NET Core là một .NET stack mới được tối ưu hóa để phát triển mã nguồn mở và phân phối nhanh trên NuGet.
.NET Core có hai thành phần chính. Nó bao gồm một runtime nhỏ được xây dựng từ cùng một cơ sở mã như .NET Framework CLR. .NET Core runtime bao gồm cùng một GC và JIT (RyuJIT), nhưng không bao gồm các tính năng như Application Domains hoặc Code Access Security. Runtime này được phân phối qua NuGet, như một phần của ASP.NET Core package.
.NET Core cũng bao gồm các class libraries cơ sở. Các libraries này phần lớn là các mã giống như các .NET Framework class libraries, nhưng đã được tính theo yếu tố (loại bỏ các dependencies) để cho phép gửi một bộ libraries nhỏ hơn. Các libraries này được vận chuyển dưới dạng các System.* NuGet packages trên NuGet.org.
3. .NET Framework là gì?
.NET là một Framework, là một tập hợp các lớp thư viện có thể tái sử dụng do Microsoft cung cấp để sử dụng trong các ứng dụng .NET khác và để phát triển, xây dựng và triển khai nhiều loại ứng dụng trên nền tảng Windows bao gồm:
- Console Applications
- Windows Forms Applications
- Windows Presentation Foundation (WPF) Applications
- Web Applications
- Web Services
- Windows Services
- Services-oriented applications sử dụng Windows Communications Foundation (WCF)
- Workflow-enabled applications sử dụng Windows Workflow
- Foundation (WF)
4. Sự khác biệt giữa String và string trong C # là gì?
string là một bí danh (alias) trong C # cho System.String. Vì vậy, về mặt kỹ thuật, không có sự khác biệt. Nó giống như int so với System.Int32.
Theo nguyên tắc, thường nên sử dụng string bất cứ khi nào bạn đề cập đến một đối tượng.
string place = "world";
Tương tự như vậy, thường nên sử dụng String nếu bạn cần tham chiếu cụ thể đến lớp.
string greet = String.Format("Hello {0}!", place);
5. Kể tên một số CLR services?
- Assembly Resolver
- Assembly Loader
- Type Checker
- COM marshalled
- Debug Manager
- Thread Support
- IL to Native compiler
- Exception Manager
- Garbage Collector
6. .NET application domain là gì?
Nó là một layer biệt lập được cung cấp bởi .NET runtime. Như vậy, các app domains tồn tại cùng trong một process (một process có thể có nhiều app domains) và có không gian địa chỉ ảo của riêng chúng.
App domains hữu ích là vì:
- Chúng ít tốn kém hơn các process đầy đủ.
- Chúng là đa luồng.
- Bạn có thể stop một cái mà không cần phải kill tất cả trong process đó.
- Phân tách resources / config / v.v.
- Mỗi app domain chạy ở cấp độ bảo mật riêng.
7. Kể ra các đặc tính của .NET Core?
- Triển khai linh hoạt: Có thể đưa vào ứng dụng của bạn hoặc được cài đặt song song với user hoặc toàn bộ máy.
- Đa nền tảng: Chạy trên Windows, macOS và Linux; có thể được chuyển sang hệ điều hành khác. Các hệ điều hành (OS), CPU và Application scenarios được hỗ trợ sẽ phát triển theo thời gian, được cung cấp bởi Microsoft, các công ty và cá nhân khác.
- Công cụ Command-line: Tất cả các Product scenarios có thể được thực hiện tại command-line.
- Tính tương thích: .NET Core tương thích với .NET Framework, Xamarin và Mono, thông qua .NET Standard Library.
- Mã nguồn mở: nền tảng .NET Core là mã nguồn mở, sử dụng giấy phép MIT và Apache 2. Tài liệu được cấp phép theo CC-BY. .NET Core là một dự án .NET Foundation.
- Được hỗ trợ bởi Microsoft: .NET Core được Microsoft hỗ trợ, theo .NET Core Support.
8. .NET Standard là gì?
- .NET Standard giải quyết vấn đề về chia sẻ mã của các nhà phát triển .NET trên tất cả các nền tảng bằng cách cung cấp tất cả các API mà bạn mong đợi và yêu thích trên các môi trường mà bạn cần: Desktop applications, Mobile apps & Games, và Cloud services.
- .NET Standard là một tập hợp các API mà tất cả các nền tảng .NET phải triển khai. Điều này hợp nhất các nền tảng .NET và ngăn chặn sự phân mảnh trong tương lai.
- .NET Standard 2.0 sẽ được thực thi bởi .NET Framework, .NET Core và Xamarin. Đối với .NET Core, điều này sẽ thêm nhiều API hiện có mà được yêu cầu.
- .NET Standard 2.0 bao gồm một miếng đệm tương thích cho các .NET Framework binaries, làm tăng đáng kể bộ thư viện mà bạn có thể tham khảo từ các thư viện .NET Standard của mình.
- .NET Standard sẽ thay thế các Portable Class Libraries (PCLs) làm công cụ để xây dựng các thư viện .NET đa nền tảng.
9. CLR là gì?
CLR là viết tắt của Common Language Runtime và nó là một Execution Environment. Nó hoạt động như một layer giữa Operating Systems và các ứng dụng được viết bằng ngôn ngữ .NET tuân theo Common Language Specification (CLS).
Chức năng chính của Common Language Runtime (CLR) là chuyển đổi Managed Code thành native code, sau đó thực thi chương trình.
10. Sự khác biệt giữa SDK và Runtime trong .NET Core là gì?
- SDK là tất cả những thứ cần thiết / giúp phát triển ứng dụng .NET Core dễ dàng hơn, chẳng hạn như CLI và trình biên dịch (compiler).
- Runtime là “máy ảo” lưu trữ / chạy ứng dụng và trừu tượng hóa tất cả các tương tác với hệ điều hành cơ sở.
11. MSIL là gì?
Khi chúng ta biên dịch mã .NET thì nó không được chuyển đổi trực tiếp thành native / binary code.
Đầu tiên nó được chuyển đổi thành mã trung gian được gọi là mã MSIL, sau đó được diễn giải bởi CLR.
MSIL độc lập với phần cứng và hệ điều hành.
Có thể có các mối quan hệ giữa các ngôn ngữ vì MSIL giống nhau đối với tất cả các ngôn ngữ .NET. MSIL tiếp tục được chuyển đổi thành native code.
12. Sự khác biệt giữa decimal, float và double trong .NET là gì?
Độ chính xác là điểm khác biệt chính.
- Float: 7 digits (32 bit)
- Double: 15-16 digits (64 bit)
- Decimal: 28-29 significant digits (128 bit)
Các trường hợp sử dụng chúng là:
- Đối với các giá trị là “số thập phân chính xác tự nhiên”, bạn nên sử dụng decimal. Điều này thường phù hợp với bất kỳ khái niệm nào do con người phát minh ra: giá trị tài chính là ví dụ rõ ràng nhất, nhưng cũng có những giá trị khác. Ví dụ, hãy xem xét số điểm dành cho thợ lặn hoặc người trượt băng.
- Đối với các giá trị là đồ tạo tác của tự nhiên mà không thể thực sự đo lường chính xác được, float / double là phù hợp hơn. Ví dụ, dữ liệu khoa học thường được biểu diễn dưới dạng này. Ở đây, các giá trị ban đầu sẽ không “chính xác theo số thập phân”, vì vậy, việc duy trì “độ chính xác thập phân” không quan trọng đối với các kết quả mong đợi. Các loại Floating binary hoạt động nhanh hơn nhiều so với decimal.
13. Sự khác biệt giữa .NET Core và Mono là gì?
Nói một cách đơn giản:
- Mono là bên thứ ba triển khai .Net Framework cho Linux / Android / iOs.
- .Net Core là phần triển khai riêng của Microsoft.
14. CTS là gì?
Common Type System (CTS) chuẩn hóa các kiểu dữ liệu của tất cả các ngôn ngữ lập trình sử dụng .NET dưới sự bảo trợ của .NET thành kiểu dữ liệu chung để giao tiếp dễ dàng và mượt mà giữa các ngôn ngữ .NET này.
CTS được thiết kế như một hệ thống phân cấp đối tượng gốc duy nhất với System.Object là kiểu cơ sở mà từ đó tất cả các kiểu khác được bắt nguồn từ đó. CTS hỗ trợ hai loại kiểu khác nhau:
- Value Types: Chứa các giá trị cần được lưu trữ trực tiếp trên stack hoặc được cấp phát nội tuyến trong một structure. Chúng có thể được tích hợp sẵn (các kiểu Standard primitive), do người dùng xác định (được xác định trong source code) hoặc kiểu enumerations (tập hợp các giá trị được liệt kê được biểu thị bằng labels nhưng được lưu trữ dưới dạng kiểu số).
- Reference Types: Lưu trữ một tham chiếu đến địa chỉ bộ nhớ của giá trị và được cấp phát trên heap. Các reference types có thể bất kỳ là pointer types, interface types hoặc self-describing types (các arrays và kiểu class chẳng hạn như class do người dùng định nghĩa, boxed value types và delegates).
15. Một unmanaged resource là gì?
- Nếu bạn tìm thấy nó trong Microsoft .NET Framework: đó là managed.
- Nếu bạn tự tìm kiếm nó quanh MSDN, đó là unmanaged.
Bất kỳ thứ gì ở ngoài mọi thứ tuyệt vời của .NET Framework mà bạn dùng lệnh gọi P/Invoke để sử dụng đều là unmanaged – và bạn phải chịu trách nhiệm dọn dẹp nó.
16. Giải thích hai loại triển khai (deployment) cho các ứng dụng .NET Core?
Framework-dependent deployment (FDD) – nó dựa vào phiên bản được chia sẻ trên toàn hệ thống của .NET Core trên hệ thống đích. Ứng dụng chỉ chứa mã của riêng nó và bất kỳ third-party dependencies bên ngoài các thư viện .NET Core. FDD chứa các tệp .dll có thể được khởi chạy bằng cách sử dụng tiện ích dotnet từ command line.
dotnet app.dll
Self-contained deployment – không như FDD, self-contained deployment (SCD) không dựa vào các thành phần được chia sẻ trên hệ thống đích. Tất cả các thành phần, bao gồm cả các thư viện .NET Core và .NET Core runtime, đều được bao gồm trong ứng dụng và độc lập với các ứng dụng .NET Core khác. SCD bao gồm tệp thực thi (chẳng hạn như app.exe trên nền tảng Windows), là phiên bản được đổi tên của máy chủ .NET Core dành riêng cho nền tảng, và tệp .dll (chẳng hạn như app.dll), là ứng dụng thực tế.
17. NuGet packages và packages.config là gì?
Tệp package.config không nào nữa. Tất cả packages hiện nay sẽ được quản lý trong tệp .csproj.
Tệp .csproj đã được dọn dẹp và nó cũng đóng vai trò của package.config (hoặc package.json trong Nodejs). Đó là nơi các packages và versions của bạn được lưu trữ.
NuGet packages là đơn vị tham chiếu và chúng có thể phụ thuộc vào các NuGet packages khác, nhưng chúng cũng có thể phụ thuộc vào các projects. Và như trước đây, các projects cũng có thể phụ thuộc vào các NuGet packages và projects khác. Điều đó có nghĩa là các projects và NuGet packages có thể hoán đổi cho nhau.
Với .NET Core, bạn có thể dễ dàng biến các dự án của mình thành các NuGet packages chỉ bằng một cú click bên trong các properties.
18. Trình biên dịch JIT là gì?
Trước khi máy tính có thể thực thi mã nguồn, các chương trình đặc biệt được gọi là trình biên dịch phải viết lại nó thành các lệnh máy, còn được gọi là object code. Quá trình này (thường được gọi đơn giản là “biên dịch”) có thể được thực hiện một cách rõ ràng hoặc ngầm định.
Biên dịch ngầm định là một quá trình gồm hai bước:
- Bước đầu tiên là chuyển đổi mã nguồn sang ngôn ngữ trung gian bằng trình biên dịch dành riêng cho ngôn ngữ.
- Bước thứ hai là chuyển ngôn ngữ trung gian sang hướng dẫn máy. Sự khác biệt chính với các trình biên dịch rõ ràng là chỉ các đoạn mã ngôn ngữ trung gian được thực thi mới được biên dịch thành các lệnh máy, trong runtime. .NET framework gọi trình biên dịch này là trình biên dịch JIT (Just-In-Time).
19. Explicit Compilation là gì?
Explicit compilation (biên dịch rõ ràng) chuyển đổi ngôn ngữ cấp trên thành object code trước khi thực thi chương trình.
Các Ahead of time (AOT) compilers (trình biên dịch trước thời hạn) được thiết kế để đảm bảo rằng, CPU có thể hiểu mọi dòng mã trước khi bất kỳ tương tác nào diễn ra.
20. Tại sao cần sử dụng IDisposable interface?
Công dụng “chính” của IDisposable interface là dọn dẹp các Unmanaged resources.
Lưu ý rằng mục đích của Dispose pattern là cung cấp một cơ chế để dọn dẹp cả hai Managed/Unmanaged resources và thời điểm điều đó xảy ra phụ thuộc vào cách mà phương thức Dispose được gọi.
21. BCL là gì?
Một .NET Framework library, BCL là tiêu chuẩn cho C# runtime library và một trong các Common Language Infrastructure (CLI) standard libraries.
BCL cung cấp các kiểu đại diện cho các kiểu dữ liệu CLI được tích hợp sẵn, quyền truy cập tệp cơ bản, collections, thuộc tính tùy chỉnh, định dạng, thuộc tính bảo mật, I/O streams, thao tác chuỗi và hơn nữa.
Base Class Library (BCL) theo nghĩa đen là cơ sở. Nó chứa các kiểu cơ bản, cơ bản như System.String và System.DateTime.
22. Sự khác biệt giữa .NET Core, .NET Framework, và Xamarin?
- .NET Framework là hương vị “đầy đủ” hoặc “truyền thống” của .NET được phân phối với Windows. Sử dụng .NET Framework khi bạn đang xây dựng một ứng dụng Windows hoặc UWP hoặc làm việc với ASP.NET 4.6+ cũ hơn.
- .NET Core là .NET đa nền tảng chạy trên Windows, Mac và Linux. Sử dụng .NET Core khi bạn muốn xây dựng console hoặc ứng dụng web có thể chạy trên bất kỳ nền tảng nào, kể cả bên trong Docker containers. Điều này không bao gồm các ứng dụng UWP / Desktop hiện tại.
- Xamarin được sử dụng để xây dựng các ứng dụng di động có thể chạy trên các thiết bị iOS, Android hoặc Windows Phone.
Xamarin thường chạy trên Mono, là phiên bản .NET được xây dựng để hỗ trợ đa nền tảng trước khi Microsoft quyết định chính thức sử dụng .NET Core. Giống như Xamarin, nền tảng Unity cũng chạy trên nền tảng Mono.
23. Những lợi ích của Explicit compilation là gì?
Ahead of time (AOT) mang lại thời gian khởi động nhanh hơn, đặc biệt là trong các ứng dụng lớn, nơi có nhiều mã cần thực thi khi khởi động. Nhưng nó đòi hỏi nhiều dung lượng ổ đĩa hơn và nhiều bộ nhớ / không gian địa chỉ ảo hơn để giữ cả IL và hình ảnh được biên dịch trước. Trong trường hợp này, JIT Compiler phải thực hiện nhiều thao tác I/O đĩa, chúng khá tốn kém.
24. Implicit compilation là gì?
Implicit Compilation (biên dịch ngầm định) là một quy trình gồm hai bước và nó cần một Virtual Machine để có thể thực thi mã của bạn.
- Bước đầu tiên của quy trình là chuyển đổi chương trình của bạn sang một mã bytecode mà Virtual Machine có thể hiểu được. .NET bytecode được gọi là Common Intermediate Language (CIL). Nó còn được gọi là Microsoft Intermediate Language (MSIL) hoặc Intermediate Language (IL).
- Bước thứ hai là chuyển đổi mã CIL thành mã máy. Đây là nhiệm vụ của Virtual Machine. Common Language Runtime (.NET Virtual Machine) chỉ chuyển đổi các đoạn CIL được thực thi thành các lệnh CPU trong runtime. .NET framework gọi trình biên dịch này là JIT (Just-In-Time) compiler.
25. Kestrel là gì?
Kestrel là một web server đa nền tảng được xây dựng cho ASP.NET Core dựa trên Libuv – một thư viện I / O bất đồng bộ đa nền tảng.
Nó là một máy chủ web mặc định được chọn để sử dụng trong tất cả các ASP.NET Core templates.
Nó thực sự rất nhanh.
Nó đủ an toàn và tốt để sử dụng mà không cần một Reverse proxy server. Tuy nhiên, bạn vẫn nên sử dụng IIS, Nginx hoặc Apache hoặc thứ gì đó khác.
26. Common Language Specification (CLS) có nghĩa là gì?
- Common Language Specification (CLS) là một tập hợp các tính năng ngôn ngữ cơ bản được hỗ trợ bởi Common Language Runtime (CLR) của .NET Framework.
- CLS là một phần đặc điểm kỹ thuật của .NET Framework.
- CLS được thiết kế để hỗ trợ các cấu trúc ngôn ngữ thường được các nhà phát triển sử dụng và tạo ra mã xác minh cho phép tất cả các ngôn ngữ tuân theo CLS để đảm bảo độ an toàn của loại mã.
- CLS bao gồm các tính năng chung cho nhiều ngôn ngữ lập trình hướng đối tượng. Nó tạo thành một tập hợp con các chức năng của Common Type System (CTS) và có nhiều quy tắc hơn được định nghĩa trong CTS.
27. .NET Core bao gồm những gì?
- Một .NET runtime, cung cấp một type system, assembly loading, một trình thu gom rác (garbage collector), tương tác với native code và các dịch vụ cơ bản khác.
- Một tập hợp các framework libraries, cung cấp các kiểu dữ liệu primitive, các kiểu hợp thành ứng dụng và các tiện ích cơ bản.
- Một bộ công cụ SDK và trình biên dịch ngôn ngữ cho phép nhà phát triển cơ sở trải nghiệm , có sẵn trong .NET Core SDK.
- Máy chủ ứng dụng ‘dotnet’, được sử dụng để chạy các ứng dụng .NET Core. Nó chọn runtime và lưu trữ runtime, cung cấp chính sách assembly loading và chạy ứng dụng. Máy chủ tương tự cũng được sử dụng để khởi chạy các công cụ SDK theo cách tương tự.
28. Giải thích sự khác biệt giữa “managed” code và “unmanaged” code?
- Managed code không được biên dịch thành mã máy mà sang một ngôn ngữ trung gian được một số dịch vụ trên máy thông dịch và thực thi, do đó nó đang hoạt động trong một framework bảo mật để xử lý những thứ nguy hiểm như memory và threads cho bạn. Nó chạy trên CLR (Common Language Runtime), cùng với những thứ khác, cung cấp các dịch vụ như thu gom rác, kiểm tra loại run-time và kiểm tra tham chiếu. Vì vậy, hãy nghĩ về nó như là, “Code của tôi được quản lý bởi CLR.“
- Unmanaged code được biên dịch thành mã máy và do đó được hệ điều hành thực thi trực tiếp. Do đó, nó có khả năng làm những điều gây tổn hại hoặc những tính năng mà Managed code không làm được. Đây là cách mọi thứ được sử dụng để hoạt động, vì vậy nó thường được liên kết với những thứ cũ như .dlls
29. Hãy nói về file mới: .csproj?
File .csproj hiện được sử dụng làm nơi quản lý các NuGet packages cho ứng dụng của bạn.
File explorer và Project explorer hiện được đồng bộ hóa. Đối với các dự án .NET Core, bạn có thể dễ dàng drop một file từ File explorer vào một project hoặc xóa nó khỏi hệ thống file và file đó sẽ biến mất khỏi project. Không còn source files nào trong file .csproj nữa.
Hiện tại bạn có thể chỉnh sửa file .csproj trực tiếp mà không cần unloading project.
30. Sự khác biệt giữa Class Library trong .NET Standard và Class Library trong .NET Core?
Compatibility (tính tương thích): các Class Libraries trong .NET Standard sẽ chạy trên bất kỳ runtime thuộc .NET Standard, chẳng hạn như .NET Core, .NET Framework, Mono / Xamarin. Mặt khác, các Class Libraries trong .NET Core chỉ có thể chạy trên runtime thuộc .NET Core.
API Surface Area: Các .NET Standard libraries đi kèm với mọi thứ trong NETStandard.Library trong khi các .NET Core libraries đi kèm với mọi thứ trong Microsoft.NETCore.App. Cái thứ hai bao gồm khoảng 20 thư viện bổ sung, một số trong số đó chúng ta có thể tự thêm vào .NET Standard library của mình (chẳng hạn như System.Threading.Thread) và một số trong số đó không tương thích với .NET Standard (chẳng hạn như Microsoft.NETCore.CoreCLR).
31. Sự khác biệt giữa .NET Standard và PCL (Portable Class Libraries) là gì?
Các cấu hình .NET Standard và PCL được tạo ra cho các mục đích giống nhau nhưng cũng khác nhau về các điểm chính.
Điểm tương đồng:
- Định nghĩa các API được sử dụng để chia sẻ mã nhị phân.
Điểm khác nhau:
- .NET Standard là một tập hợp các API được chọn, còn các cấu hình PCL được xác định bởi các điểm chung của các nền tảng hiện có.
- .NET Standard ấn bản một cách tuyến tính, trong khi cấu hình PCL thì không. Cấu hình PCL đại diện cho các nền tảng của Microsoft còn .NET Standard là platform-agnostic.
32. .NET Standard là gì?
- .NET Standard giải quyết vấn đề chia sẻ mã cho nhà phát triển .NET trên tất cả nền tảng bằng cách mang tất cả APIs mà bạn mong đợi và yêu thích vào các môi trường mà bạn cần như: desktop applications, mobile apps & games, và cloud services.
- .NET Standard là một tập hợp các APIs mà tất cả nền tảng .NET phải triển khai. Điều này hợp nhất các nền tảng .NET và ngăn chặn sự phân mảnh trong tương lai.
- .NET Standard 2.0 sẽ được thực thi bởi .NET Framework, .NET Core và Xamarin. Đối với .NET Core, nó sẽ có thêm nhiều API được yêu cầu.
- .NET Standard 2.0 bao gồm một miếng đệm tương thích cho các .NET Framework binaries, làm tăng đáng kể bộ thư viện mà bạn có thể tham khảo từ các .NET Standard libraries của mình.
- .NET Standard sẽ thay thế các Portable Class Libraries (PCLs) để làm công cụ xây dựng các thư viện .NET đa nền tảng.
33. Framework Class Library (FCL) là gì?
.NET Framework Class Library đúng như tên gọi của nó: một thư viện của lớp và các loại khác mà các nhà phát triển có thể sử dụng để làm cho cuộc sống của họ dễ dàng hơn. Mặc dù bản thân các lớp này được viết bằng C#, chúng có thể được sử dụng từ bất kỳ ngôn ngữ nào dựa trên CLR.
Framework Class Library (FCL) là thư viện rộng hơn chứa toàn bộ: ASP.NET, WinForms, XML stack, ADO.NET và hơn thế nữa. Bạn có thể nói rằng FCL bao gồm BCL.
Ở mức độ đơn giản, .NET Framework = libraries (FCL, BCL), trình biên dịch ngôn ngữ (C #, VB.NET) và Common Language Runtime (CLR).
34. Có cách nào để bắt multiple exceptions cùng một lúc mà không bị trùng lặp mã không?
Ví dụ:
try
{
WebId = new Guid(queryString["web"]);
}
catch (FormatException)
{
WebId = Guid.Empty;
}
catch (OverflowException)
{
WebId = Guid.Empty;
}
Có cách nào để bắt hai exceptions mà chỉ gọi lệnh WebId = Guid.Empty một lần không?
Giải pháp:
catch (Exception ex)
{
if (ex is FormatException || ex is OverflowException)
{
WebId = Guid.Empty;
return;
}
throw;
}
35. CoreCLR là gì?
CoreCLR là công cụ thực thi .NET trong .NET Core, thực hiện các chức năng như thu gom rác và biên dịch thành mã máy.
36. Khi nào chúng ta nên sử dụng .NET Core Class Library và .NET Standard Class Library?
Sử dụng .NET Standard library khi bạn muốn tăng số lượng ứng dụng tương thích với thư viện của mình và bạn đồng ý với việc giảm số lượng .NET API mà thư viện của bạn có thể truy cập.
Sử dụng .NET Core library khi bạn muốn tăng số lượng .NET API mà thư viện của bạn có thể truy cập và bạn có thể chỉ cho phép các ứng dụng .NET Core tương thích với thư viện của bạn.
37. Sự khác biệt giữa .NET Core và .NET Framework là gì?
.NET hiện nay nói chung có 2 hương vị:
- .NET Framework
- .NET Core
.NET Core và .NET Framework (đối với hầu hết các phần) đều có mối quan hệ subset-superset. .NET Core được đặt tên là “Core” vì nó chứa các tính năng cốt lõi từ .NET Framework, cho cả các thư viện runtime và framework. Ví dụ: .NET Core và .NET Framework chia sẻ GC, JIT và các loại như String và List.
.NET Core được tạo ra để .NET có thể là mã nguồn mở, đa nền tảng và được sử dụng trong nhiều môi trường bị hạn chế về tài nguyên hơn.
38. Giải thích sự khác biệt giữa Task và Thread trong .NET?
Thread đại diện cho một luồng (thread) cấp hệ điều hành, với stack và tài nguyên hạt nhân (kernel resources) của riêng nó. Thread cho phép mức độ kiểm soát cao nhất; bạn có thể Abort() hoặc Suspend() hoặc Resume() một luồng, bạn có thể quan sát trạng thái của nó và bạn có thể thiết lập các thuộc tính cấp luồng như stack size, apartment state, hoặc culture. ThreadPool là một trình bao bọc xung quanh một nhóm các threads được duy trì bởi CLR.
Lớp Task từ Task Parallel Library cung cấp những gì tốt nhất của cả hai thế giới. Giống như ThreadPool, một tác vụ (task) không tạo luồng cấp hệ điều hành của riêng nó. Thay vào đó, các tác vụ được thực thi bởi TaskScheduler; bộ lập lịch mặc định chỉ chạy trên ThreadPool. Không giống như ThreadPool, Task cho phép bạn biết được khi nào nó kết thúc và (thông qua generic Task) để trả về kết quả.
39. Những lợi ích của việc sử dụng JIT là gì?
- JIT có thể tạo mã nhanh hơn, vì nó nhắm mục tiêu đến nền tảng thực thi hiện tại. Biên dịch AOT phải nhắm mục tiêu đến mẫu số chung thấp nhất trong số tất cả các nền tảng thực thi có thể có.
- JIT có thể định cấu hình ứng dụng trong khi nó chạy và tự động biên dịch lại mã để mang lại hiệu suất tốt hơn trong hot path (các chức năng được sử dụng nhiều nhất).
40. Các tác vụ bất đồng bộ (Async / Await) hoạt động như thế nào trong .NET?
private async Task<bool> TestFunction()
{
var x = await DoesSomethingExists();
var y = await DoesSomethingElseExists();
return y;
}
Câu lệnh await thứ hai có được thực thi ngay lập tức hay sau khi câu lệnh await đầu tiên hoàn thành?
await tạm dừng phương thức cho đến khi hành động của nó hoàn tất. Vì vậy, await thứ hai sẽ được thực thi sau khi await đầu tiên hoàn thành.
Mục đích của await là nó sẽ trả lại thread hiện tại cho nhóm thread trong khi hoạt động được await chạy và thực hiện bất cứ điều gì.
Điều này đặc biệt hữu ích trong các môi trường hiệu suất cao, chẳng hạn như một máy chủ web, nơi một yêu cầu nhất định được xử lý trên một thread nhất định từ nhóm thread tổng thể. Nếu chúng ta không await, thì thread đã cho xử lý request (và tất cả tài nguyên của nó) vẫn “được sử dụng” trong khi lệnh gọi db / dịch vụ hoàn tất. Quá trình này có thể mất vài giây hoặc hơn, đặc biệt là đối với các cuộc gọi dịch vụ bên ngoài.
41. Sự khác biệt giữa AppDomain, Assembly, Process và Thread là gì?
- Một AppDomain là một đơn vị độc lập trong một process. AppDomains có thể được tạo trong runtime, được tải bằng mã và được tải xuống. Ranh giới độc lập của nó được thiết kế để làm cho các ứng dụng .NET đáng tin cậy hơn.
- Một Assembly chứa một hoặc nhiều modules, chứa các đoạn mã đã được biên dịch. Bạn thường sẽ thấy một assembly dưới dạng .EXE hoặc .DLL.
- Một Process là một ứng dụng đang thực thi.
- Một Thread là một execution context. Hệ điều hành thực thi mã trong một thread. Hệ điều hành chuyển đổi qua lại giữa các threads, cho phép từng thread thực thi lần lượt, do đó tạo cảm giác rằng nhiều ứng dụng đang chạy cùng một lúc.
Để tổng hợp tất cả lại với nhau (rất đơn giản) …
Một chương trình được thực thi. Một process được tạo bởi hệ điều hành, và trong thread đơn của nó, nó bắt đầu tải mã để thực thi. Trong một ứng dụng .NET, một AppDomain duy nhất được tạo bởi CLR. Cụm assembly thực thi của ứng dụng (.EXE) được tải vào AppDomain này và bắt đầu thực thi. Ứng dụng có thể sinh ra các processes mới, tạo các AppDomains, tải các assemblies khác vào các AppDomains này, sau đó tạo các Threads mới để thực thi mã trong bất kỳ AppDomains nào trong số này.
42. Sự khác biệt giữa các dự án .NET Framework / Core và các dự án .NET Standard Class Library?
Sử dụng .NET Standard library khi bạn muốn tăng số lượng ứng dụng tương thích với thư viện của mình và bạn đồng ý với việc giảm số lượng .NET API mà thư viện của bạn có thể truy cập.
Việc triển khai .Net Standard Library cho phép chia sẻ mã trên tất cả các phiên bản khác nhau của các ứng dụng .NET như .NET Framework, .NET Core và Xamarin.
43. Làm thế nào để chọn target version của .NET Standard library?
Khi chọn phiên bản .NET Standard, bạn nên cân nhắc sự đánh đổi này:
- Phiên bản càng cao, càng nhiều API có sẵn cho bạn.
- Phiên bản càng thấp, càng có nhiều nền tảng triển khai nó.
Bạn nên chọn target version thấp nhất có thể của .NET Standard. Vì vậy, sau khi bạn tìm thấy phiên bản .NET Standard cao nhất mà bạn có thể nhắm đến, hãy làm theo các bước sau:
- Hãy chọn phiên bản thấp hơn tiếp theo của .NET Standard và xây dựng dự án của bạn.
- Nếu dự án của bạn xây dựng thành công, hãy lặp lại bước 1. Nếu không, hãy chọn lại phiên bản cao hơn tiếp theo và đó là phiên bản bạn nên sử dụng.
44. .NET có hỗ trợ đa kế thừa không?
.NET không hỗ trợ đa kế thừa theo cách trực tiếp vì trong .NET, một lớp không thể kế thừa từ nhiều hơn một lớp.
.NET hỗ trợ đa kế thừa thông qua các Interfaces.
45. Tại sao .NET sử dụng trình biên dịch JIT thay vì chỉ biên dịch mã một lần trên máy đích?
Có hai thứ cần đạt được bằng cách sử dụng định dạng trung gian (intermediate format) như .NET hoặc Java:
- Bạn có thể chạy chương trình trên bất kỳ nền tảng nào, chính xác là vì mã được biểu diễn ở định dạng trung gian thay vì native code. Bạn chỉ cần viết một trình thông dịch cho định dạng trung gian.
- Nó cho phép một số tối ưu hóa run-time không thể (dễ dàng) tại thời gian biên dịch (compile-time): ví dụ: bạn có thể tận dụng các tính năng đặc biệt trên CPU mới, ngay cả khi những CPU đó không tồn tại khi bạn viết chương trình của mình – chỉ có trình biên dịch JIT mới cần biết về điều đó.
46. Tại sao thư viện .NET Standard tồn tại?
Lý do mà .NET Standard tồn tại là vì tính di động; nó xác định một tập hợp các API mà các nền tảng .NET đồng ý triển khai. Bất kỳ nền tảng nào triển khai .NET Standard đều tương thích với các thư viện sử dụng .NET Standard đó. Một trong những nền tảng tương thích đó là .NET Core.
Các mẫu thư viện .NET Standard tồn tại để chạy trên nhiều runtime. Ngược lại, các mẫu thư viện .NET Core tồn tại để truy cập nhiều API hơn (với chi phí tương thích) và để chỉ định một nền tảng mà dựa vào đó để xây dựng tệp thực thi.
47. Sự khác biệt giữa RyuJIT và Roslyn là gì?
- Roslyn là trình biên dịch sẽ biên dịch mã của bạn (C # hoặc VB) sang IL.
- RyuJIT là một trình biên dịch Just In Time biên dịch IL của bạn thành native code.
Hiện tại cả hai đều là mã nguồn mở.
48. Sự khác biệt giữa CIL và MSIL (IL) là gì?
CIL là thuật ngữ được sử dụng trong CLI Standard. MSIL là (tôi nghĩ là) CIL được tạo bởi các công cụ MS. Về hiệu quả, chúng đồng nghĩa với nhau.
- CIL – Common Intermediate Language – là thuật ngữ được sử dụng trong International Standard.
- MSIL – Microsoft Intermediate Language – là thuật ngữ sản phẩm để chỉ việc triển khai tiêu chuẩn đó của Microsoft.
49. Giải thích cách sử dụng Finalize và Dispose?
- Phương thức Finalizer được gọi khi đối tượng của bạn được thu gom rác và bạn không có gì đảm bảo khi nào điều này sẽ xảy ra (bạn có thể ép buộc nó, nhưng nó sẽ ảnh hưởng đến hiệu suất).
- Mặt khác, phương thức Dispose được gọi bằng code đã tạo ra class của bạn để bạn có thể dọn dẹp và giải phóng bất kỳ tài nguyên nào bạn đã có được (dữ liệu không được quản lý, kết nối cơ sở dữ liệu, xử lý tệp, v.v.) tại thời điểm mã được hoàn thành với đối tượng của bạn.
Các sử dụng thực tế là triển khai IDisposable và Dispose để bạn có thể sử dụng đối tượng của mình trong một câu lệnh using, chẳng hạn như using (var foo = new MyObject ()) {}. Và trong phần finalizer của bạn, bạn gọi Dispose, đề phòng trường hợp mã đang chạy của bạn quên “dispose”.
50. Bạn biết bao nhiêu loại JIT Compilations?
Có ba kiểu JIT compilation trong .NET framework:
- Pre-JIT biên dịch mã nguồn hoàn chỉnh thành native code trong một chu kỳ biên dịch duy nhất. Trong các ngôn ngữ .NET, điều này được thực hiện trong Ngen.exe (Native Image Generator). Tất cả các quy trình CIL được biên dịch thành native code trước khi khởi động. Bằng cách này, runtime có thể sử dụng các native images từ bộ đệm (cache) thay vì gọi JIT Compiler.
- Econo-JIT chỉ biên dịch những phương thức được gọi trong runtime. Tuy nhiên, các phương thức được biên dịch này sẽ bị loại bỏ khi chúng không được yêu cầu.
- Normal-JIT chỉ biên dịch những phương thức được gọi trong runtime. Các phương thức này được biên dịch ở lần đầu tiên chúng được gọi, và sau đó chúng được lưu trữ trong bộ nhớ cache. Khi các phương thức tương tự được gọi lại, mã được biên dịch từ bộ nhớ cache sẽ được sử dụng để thực thi.
51. Sự khác biệt giữa mô hình bất đồng bộ Node.js và async / await trong .NET?
Mô hình bất đồng bộ trong Node.js tương tự như mô hình bất đồng bộ cũ trong C # và .Net được gọi là Event-based Asynchronous Pattern (EAP). Các từ khóa async / await của C # làm cho mã bất đồng bộ trở nên tuyến tính và cho phép bạn tránh “Callback Hell” tốt hơn nhiều trong bất kỳ ngôn ngữ lập trình nào khác.
Node.js là đơn luồng (single-threaded) bất đồng bộ, trong khi ASP.NET là đa luồng (multi-threaded) bất đồng bộ. Điều này có nghĩa là mã Node.js có thể tạo ra một số giả định đơn giản hóa vì tất cả mã của bạn luôn chạy trên cùng một thread. Vì vậy, khi mã ASP.NET của bạn đang await, nó có thể tiếp tục trên một thread khác và tùy thuộc vào bạn để tránh những thứ như trạng thái luồng cục bộ (thread-local state).
Sự khác biệt tương tự cũng là một điểm mạnh của ASP.NET, bởi vì nó có nghĩa là ASP.NET bất đồng bộ có thể mở rộng quy mô tối đa với khả năng đầy đủ của máy chủ của bạn. Nếu bạn xem xét, chẳng hạn như một máy 8 lõi, thì ASP.NET có thể xử lý (các phần đồng bộ của) 8 request cùng một lúc. Nếu bạn đặt Node.js trên một máy chủ được cải tiến, thì thông thường bạn sẽ thực sự chạy 8 instances riêng biệt của Node.js và thêm một cái gì đó như nginx hoặc một trình cân bằng tải tùy chỉnh đơn giản để xử lý các yêu cầu định tuyến (routing) cho máy chủ đó.