Interview Notes

  • Home
  • Blog
    • Ntech Developers
    • Fanpage
    • Group
    • Github
  • Interview Notes
  • Social
    • Facebook
    • Twitter
    • Linkedin
  • About
  • Contact me

Khi nào dùng store khi nào dùng function?

Phân biệt 2 loại Index?
Phân biêt truncate table và delete table?

Phân biệt net framework và net core?
So sánh ControllerBase và Controller?
So sánh ICollection và IList?
Nêu lifecycle của Net Core, phân biệt AddSingleton, AddScoped và AddTransient?
So sánh Cookie và Session?

Khi nào dùng Local Storage, khi nào dùng Session Storage
Bạn biết gì về Identity Server 4 không? Phân biệt các loại Grant type trong IS4?
Mô tả hoạt động của CQRS?

Khi nào dùng Refresh token, khi nào dùng Revoke token?
Nêu cơ chế hoạt động của Saga Pattern?
Dùng masstransit cho những trường hợp nào?
So sánh RabbitMQ và Kafka?

So sánh http1 và http2?
So sánh grpc và http protocol?


 Code First:

Viết các class Model bằng code C# và generate Database từ class Model.

Ưu điểm:
- Rất phổ biến (vì các lập trình viên thường không thích thiết kế DB, nhưng thích thiết kế class)
- Kiểm soát hoàn toàn code model, thêm xóa sửa thuộc tính vô cùng dễ dàng
- Không phải nặng đầu suy nghĩ về DB. Đối với cách tiếp cận này, DB chỉ là cái “cục” data, lôi ra xài thôi
- Có thể version control Database

Nhược điểm
- Các thay đổi cấu trúc trực tiếp trên DB sẽ mất
- Khó kiểm soát những column sẽ tạo trên Db
- Hơi khó khi kết hợp với Db có sẵn

Database First:
Generate Model từ Database có sẵn và các class model sẽ ko được phép chỉnh sửa vì database không đổi.

Ưu điểm:
- Ít phổ biến hơn
- DB có thể được develop riêng
- Dùng được DB có sẵn
- Entity Framework sẽ tạo ra các Entity class cho bạn

Nhược điểm
- Không thể thay đổi code đã được Generate
- Khó khăn khi muốn thêm các DataAttribute và DisplayAttribute cho các class model
- Khó khăn khi muốn biểu diễn các kiểu quan hệ cha con của class
- Mỗi lần thay đổi cấu trúc DB, bạn sẽ phải update lại mapping và model để phản ánh sự thay đổi đó

 IEnumerable nằm trong namespace System.Collections

IEnumerable là một list hay contatiner giữ các item chỉ hỗ trợ filter nhưng không thể chỉnh sửa các item như thêm, xoá, sửa, đếm...
IQueryable, IList, IDictionary, ICollection kế thừa IEnumerable Interface.

- ICollection là interface cơ bản nhất trong số các interface đã liệt kê.
Đó là một interface có thể đếm được hỗ trợ Count và đó là về nó.
- IList kế thừa IEnumerable và ICollection, nhưng nó cũng hỗ trợ thêm và xóa các mục, truy xuất các mục theo chỉ mục...
Đó là giao diện được sử dụng phổ biến nhất cho "danh sách các đối tượng", điều mà tôi biết.
- IQueryable là một interface có thể liệt kê hỗ trợ LINQ.
Bạn luôn có thể tạo IQueryable từ IList và sử dụng LINQ tới Objects, nhưng bạn cũng thấy IQueryable được sử dụng để thực hiện hoãn lại các câu lệnh SQL trong LINQ to SQL và LINQ to Entities.
- IDictionary là một interface khác với ánh xạ các khóa duy nhất đến các giá trị.

IQueryable
+ IQueryable tốt nhất cho truy vấn dữ liệu out-memory như là database.
+ Khi truy vấn, IQueryable thực thi câu lệnh truy vấn và lọc dữ liệu trên Server luôn.
+ IQueryable hỗ trợ lazy loading. Vì thế nó phù hợp cho trường hợp phân trang.
+ IQueryable hỗ trợ custom query sử dụng phương thức CreateQuery và Execute.

 Trong C# mỗi khi bạn sửa đổi một String kết quả đều tạo ra một đối tượng String mới. Trong khi đó StringBuilder chứa trong nó một mảng các ký tự, mảng này sẽ tự động thay thế bởi một mảng lớn hơn nếu thấy cần thiết, và copy các ký tự ở mảng cũ sang.


Nếu bạn phải thao tác ghép chuỗi nhiều lần thì bạn nên sử dụng StringBuilder, nó giúp làm tăng hiệu năng của chương trình.
Tuy nhiên nếu chỉ ghép nối một vài chuỗi thì điều đó không cần thiết, bạn không nên lạm dụng StringBuilder trong trường hợp đó.

So sánh String và StringBuilder:

- String là một đối tượng kiểu immutable (bất biến) và sealed (bị niêm phong, không có khả năng tạo ra kế thừa), nghĩa là khi bạn tạo mới một đối tượng, các giá trị của đối tượng này hoàn toàn không thể thay đổi.
Sự thay đổi giá trị của String nếu diễn ra sẽ diễn ra trên một đối tượng mới.

- StringBuilder dùng một mảng char để lưu trữ các dữ liệu.
StringBuilder được tổ chức như một danh sách liên kết, do đó việc thao tác chuỗi cơ bản như chèn, xóa, cắt, tìm kiếm chuỗi… sẽ là những thao tác trên danh sách liên kết.
StringBuilder cũng có giới hạn sức chứa dữ liệu.

Khi nào nên dùng?
- Khi muốn tối ưu hiệu năng trong quá trình xử lý chuỗi, StringBuilder tỏ ra vượt trội hơn so với String khi nghiệp vụ bạn đang xử lí đòi hỏi việc thao tác chuỗi mà giá trị chuỗi biến động với số lượng lớn.
- Tuy nhiên StringBuilder không hỗ trợ vấn đề thao tác chuỗi mạnh mẽ như String, như nhiều toán tử thao tác như +, +=, =, … cũng như các phương thức như Contains, ToList, ToArray, ...
- Nếu nghiệp vụ bạn đang xử lí yêu cầu việc thao tác chuỗi mà giá trị của chuỗi biến động ít, String hoàn toàn là sự lựa chọn hợp lí bởi sự hỗ trợ đa dạng và đầy đủ các toán tử thao tác chuỗi và phương thức tích hợp đi kèm và cả tốc độ lập trình.

 Vấn đề bảo toàn dữ liệu khi dùng thread là rất quan trọng vì có thể gây ra những sai sót khi nhiều thread cùng thay đổi cùng dữ liệu tại một thời điểm.

Vì thế .Net cung cấp một số kĩ thuật để đồng bộ việc truy xuất dữ liệu.
Một khi được sử dụng, dữ liệu sẽ bị khóa lại và các thread khác muốn sử dụng phải chờ cho đến khi dữ liệu hay tài nguyên được giải phóng.

lock (syncObject){
    // …
}

Tham số sử dụng cho từ khóa lock phải là một đối tượng có kiểu tham chiếu.
Bất kì thread nào sử dụng đối tượng syncObj trên để đồng bộ hóa thông qua lock đều phải chờ cho đến khi đối tượng này được giải phóng.
Nếu có nhiều thread cùng chờ, chúng sẽ được đặt trong một danh sách kiểu queue (FIFO - First In First Out) để được xử lý theo thứ tự.


Deadlock
Đồng bộ hóa khi sử dụng thread là một công việc cần thiết, tuy nhiên nếu không cẩn thận bạn sẽ gặp phải tình trạng chương trình dừng hoạt động vô thời hạn.
Tình trạng này được đặt tên là deadlock. Deadlock xảy ra khi có ít nhất hai thread cùng đợi thread kia giải phóng, thật “trùng hợp” là cả hai lại đang giữ “chìa khóa” của nhau.

 Trong .NET đưa ra một interface có tên là IDisposable (System.IDisposable).

Interface này chỉ có định nghĩa một phương thức Dispose();

Các lớp triển khai interface này chỉ việc định nghĩa nội dung phương thức này để giải phóng các tài nguyên chiếm giữ - khi đối tượng bị hủy.

Tại sao cần tự giải phóng tài nguyên?
Trong .NET hầu hết các loại tài nguyên là được quản lý bởi CLR của hệ thống .NET, nên các tài nguyên, đối tượng không còn tham chiếu đến nó sẽ tự động được CLR thu hồi (GC). Đó là những tài nguyên quản lý được bởi .NET CLR.
Tuy nhiên, vẫn có những loại tài nguyên mà CLR .NET không quản lý được như mở file,  stream file và các kết nối mạng hay kết nối đến database.
Với những loại tài nguyên này dotnet không tự giải phóng nó thế nào, nên bạn phải có một cơ chế chủ động làm việc này khi không còn dùng đến nữa.

Khi một lớp nào đó, triển khai giao diện IDisposable thì có thể dùng với using.
Hết lệnh using đối tượng sẽ tự động được gọi Dispose.

 Bạn cần biết rằng trong C# biến được lưu trữ qua hai cách là Stack và Heap.

Stack dùng tham số (parameters) và địa chỉ biến, hoặc thêm một số thông tin khác. Nó thường dùng cho Value Types - một kiểu tham trị lưu trữ dữ liệu trong không gian bộ nhớ của riêng nó.
Ngược lại Heap được dùng lưu trữ các đối tượng của Reference Types - một kiểu tham chiếu chứa một con trỏ đến một vị trí bộ nhớ chứa dữ liệu.

So sánh struct và class

Giống nhau
- Đều chứa các phương thức (method) và các thuộc tính (Property).
- Đều có thể thực hiện các giao diện (implement interface)
- Đều có hàm khởi tạo

Struct
- Kiểu tham trị
- Không có Destructor
- Không thể khai báo Constructor  không có đối số
- Không có khả năng kế thừa

Class
- Kiểu tham chiếu
- Có Destructor
- Có thể khai báo constructor mặc định không tham số
- Có thể kế thừa

Bài đăng cũ hơn Trang chủ

ABOUT AUTHOR

NTechDevelopers

Follow us

New technology for developers

POPULAR POSTS

  • Interview notes: Senior Dot Net (Ver 08/2022)
    Khi nào dùng store khi nào dùng function? Phân biệt 2 loại Index? Phân biêt truncate table và delete table? Phân biệt net framework và net c...
  • Interview notes: Senior Dot Net (Ver 05/2022)
     - Giới thiệu về bản thân - Nói sơ lược về công nghệ của dự án gần nhất? - So sánh Net Framwork và Net Core? - Net core 3.1 có gì khác biệt ...
  • Interview notes: Junior DotNet (Ver 10/2019)
      1. Bài test: 30 phút Gồm 4 phần: OOP Data structure Database Design pattern 1.1 – Câu hỏi trắc nghiệm liên quan đến 4 thuộc tính 5 câu – C...

Categories

  • Concurrency
  • Database
  • Design Patterns
  • DotNet
  • Entity Framework
  • Frontend
  • Interview notes
  • OOP
  • Principles
  • Subversion Control
  • Unit test

Advertisement

Website đang trong quá trình cập nhập. Hi vọng các bạn ủng hộ!

About Me

NTechDevelopers is a community of Software development joined together with certain common goals: to learn, to teach and to have fun programming. I hope that you find NTechDevelopers to be a wealth of information and a valuable resource.

Popular Posts

  • Interview notes: Senior Dot Net (Ver 08/2022)
    Khi nào dùng store khi nào dùng function? Phân biệt 2 loại Index? Phân biêt truncate table và delete table? Phân biệt net framework và net c...

Advertisement

Copyright © 2022 Interview Notes. Created by NtechDevelopers