Bộ câu hỏi phỏng vấn C#/.Net phần 3

Reference Type trong C# là gì?


Các reference type không chứa dữ liệu thực tế được lưu trữ trong một biến, mà chúng chứa một tham chiếu đến các biến.

Nói cách khác, chúng đề cập đến một vị trí bộ nhớ. Sử dụng nhiều biến, các reference type có thể tham chiếu đến một vị trí bộ nhớ. Nếu dữ liệu trong vị trí bộ nhớ bị thay đổi bởi một trong các biến, thì biến kia sẽ tự động phản ánh sự thay đổi này theo giá trị. Ví dụ về các reference type có sẵn là: object, dynamic, và string.

Các biến kiểu dynamic trong C# là gì?


Bạn có thể lưu trữ bất kỳ loại giá trị nào trong biến kiểu dữ liệu động (dynamic data type). Việc kiểm tra kiểu cho các loại biến này diễn ra tại runtime.

Các kiểu Nullable trong C# là gì?


Một kiểu được cho là nullable nếu nó có thể được gán một giá trị hoặc có thể được gán null, có nghĩa là kiểu không có giá trị nào. Theo mặc định, tất cả các kiểu tham chiếu, chẳng hạn như String, là nullable, nhưng tất cả các kiểu giá trị, chẳng hạn như Int32, thì không.

Ví dụ: bạn có thể lưu trữ bất kỳ giá trị nào từ -2,147,483,648 đến 2,147,483,647 hoặc null trong một biến Nullable<Int32>. Tương tự, bạn có thể gán true, false hoặc null trong một biến Nullable<bool>.

Managed Code và Unmanaged Code là gì?


  • Managed Code - Mã được phát triển trong .NET framework được gọi là managed code (mã được quản lý). Mã này được thực thi trực tiếp bởi CLR với sự trợ giúp của việc thực thi managed code. Bất kỳ ngôn ngữ nào được viết trong .NET Framework đều là managed code.
  • Unmanaged Code - Mã được phát triển bên ngoài .NET framework được gọi là unmanaged code (mã không được quản lý). Các ứng dụng không chạy dưới sự kiểm soát của CLR được cho là unmanaged và một số ngôn ngữ nhất định như C++ có thể được sử dụng để viết các ứng dụng đó, chẳng hạn như truy cập các chức năng cấp thấp của hệ điều hành. Khả năng tương thích nền với mã VB, ASP và COM là những ví dụ về unmanaged code.

Enum trong C# là gì?


Một enum là một kiểu giá trị với một tập hợp các hằng số được đặt tên có liên quan thường được gọi là danh sách liệt kê (enumerator list). Từ khóa enum được sử dụng để khai báo một kiểu liệt kê. Nó là một kiểu dữ liệu primitive, do người dùng định nghĩa. Một enum được sử dụng để tạo các hằng số trong .NET framework. Tất cả các thành viên của enum đều thuộc kiểu enum. Chúng phải là một giá trị số (numeric value) cho mỗi kiểu enum.

Vài nét về enum:

  • enum là kiểu dữ liệu liệt kê trong C#.
  • enum là hằng số strongly typed. Chúng là strongly typed, tức là một enum của một loại không được gán ngầm cho một enum của một loại khác mặc dù giá trị cơ bản của 2 loại đó là như nhau.
  • enum (viết tắt của enumerations) làm cho mã của bạn dễ đọc và dễ hiểu hơn nhiều.
  • Giá trị enum được cố định. Enum có thể được hiển thị dưới dạng một chuỗi và được xử lý dưới dạng số nguyên.
  • Kiểu mặc định là int và các kiểu được chấp nhận là byte, sbyte, short, ushort, uint, long và ulong.
  • Mọi kiểu enum đều tự động lấy từ System.Enum và do đó chúng ta có thể sử dụng các phương thức System.Enum trên enum.
  • enum là các loại giá trị và được tạo trên stack chứ không phải trên heap.

Partial class là gì?


Một partial class được sử dụng để phân chia phần định nghĩa của một lớp thành hai hoặc nhiều lớp trong cùng một hoặc nhiều tệp mã nguồn. Bạn có thể tạo định nghĩa lớp trong nhiều tệp nhưng nó sẽ được biên dịch thành một lớp tại runtime và cũng như khi bạn tạo một instance của lớp này để bạn có thể truy cập tất cả các phương thức từ tất cả tệp nguồn với cùng một đối tượng.

Các partial class chỉ có thể được tạo trong cùng một namespace, nó không được phép được tạo trong các namespace khác nhau.

Tại sao lại sử dụng khối finally trong C#?


Khối finally sẽ được thực thi bất kể có exception hay không. Do đó khi thực thi mã trong khối try khi exception xảy ra, quyền điều khiển được trả về khối catch và khối finally sẽ được thực thi. Vì vậy, việc đóng kết nối với cơ sở dữ liệu / giải phóng các trình xử lý tệp có thể được để trong khối finally.

Sự khác biệt giữa từ khóa ref và out là gì?


ref cho trình biên dịch biết rằng đối tượng được khởi tạo trước khi vào hàm, trong khi out cho trình biên dịch biết rằng đối tượng sẽ được khởi tạo bên trong hàm. Vì vậy, trong khi ref là two-ways, thì outout-only.

Sự khác biệt giữa overloading và overriding là gì?


Overloading là khi bạn có nhiều phương thức trong cùng một phạm vi, có cùng tên nhưng khác tham số.

// Overloading
public class test
{
   public void getStuff(int id) {
   }
   public void getStuff(string name) {
   }
}

Overriding là một nguyên tắc cho phép bạn thay đổi chức năng của một phương thức trong một lớp con.

// Overriding
public class test
{
   public virtual void getStuff(int id)
   {
      //Get stuff default location
   }
}

public class test2 : test
{
   public override void getStuff(int id)
   {
      //base.getStuff(id);
      //or - Get stuff new location
   }
}

Có sự khác biệt giữa throw và throw ex không?


Có, giữa throw và throw ex có sự khác biệt như sau:

  • Khi bạn throw ex, exception đã ném đó sẽ trở thành exception "gốc". Vì vậy, tất cả dấu vết stack trước đó sẽ không ở đó nữa.
  • Nếu bạn throw, exception chỉ đi xuống dòng và bạn sẽ nhận được dấu vết stack đầy đủ.
static void Main(string[] args)
{
   try
   {
      Method2();
   }
   catch (Exception ex)
   {
      Console.Write(ex.StackTrace.ToString());
      Console.ReadKey();
   }
}

private static void Method2()
{
   try
   {
      Method1();
   }
   catch (Exception ex)
   {
      //throw ex resets the stack trace Coming from Method 1 and propogates it to the
      caller(Main)
      throw ex;
   }
}

private static void Method1()
{
   try
   {
      throw new Exception("Inside Method1");
   }
   catch (Exception)
   {
      throw;
   }
}
Avatar Techmely Team
VIẾT BỞI

Techmely Team