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

Object là gì?


Theo MSDN, "một định nghĩa lớp hoặc cấu trúc giống như một bản thiết kế chỉ định những gì kiểu có thể làm. Về cơ bản một Object là một khối bộ nhớ đã được cấp phát và cấu hình theo bản thiết kế. Một chương trình có thể tạo ra nhiều Object của cùng lớp. Các Object còn được gọi là instance và chúng có thể được lưu trữ trong một biến hoặc trong một mảng hoặc trong một tập hợp. Mã client là mã sử dụng các biến này để gọi các phương thức và truy cập các thuộc tính chung của đối tượng. Trong một ngôn ngữ hướng đối tượng như C#, một chương trình điển hình bao gồm nhiều Object tương tác động".

Các Object giúp chúng ta truy cập thành viên của một lớp hoặc cấu trúc hoặc chúng có thể là trường, phương thức hoặc thuộc tính bằng cách sử dụng "."

Sự khác biệt giữa câu lệnh continue và break trong C# là gì?


  • Sử dụng câu lệnh break, bạn có thể nhảy ra khỏi vòng lặp.
  • Sử dụng câu lệnh continue, bạn có thể nhảy qua một lần lặp và sau đó tiếp tục thực hiện vòng lặp của mình.

image

Property Accessors là gì?


Các phần hoặc khối get và set của một thuộc tính được gọi là accessors (trình truy cập).

class Person
{
   private string name; // field
   public string Name // property
   {
      get { return name; } // get method
      set { name = value; } // set method
   }
}

Chúng rất hữu ích để hạn chế khả năng truy cập của một thuộc tính.

  • set chỉ định rằng chúng ta có thể gán một giá trị cho một trường riêng tư (private) trong một thuộc tính, và nếu không có thuộc tính set này, trường nói trên sẽ giống như một trường chỉ để đọc (read-only field).
  • Với get, chúng ta có thể truy cập giá trị của trường riêng tư. Một bộ truy cập get chỉ định rằng chúng ta có thể truy cập công khai giá trị của một trường.

Boxing và Unboxing là gì?


Boxing và Unboxing đều được sử dụng để chuyển đổi kiểu nhưng có một số khác biệt:

  • Boxing - Boxing là quá trình chuyển đổi kiểu dữ liệu kiểu giá trị sang đối tượng hoặc sang bất kỳ kiểu dữ liệu interface nào được thực hiện bởi kiểu giá trị này. Khi CLR đóng gói một giá trị có nghĩa là khi CLR chuyển đổi một kiểu giá trị thành kiểu Object, nó sẽ bao bọc giá trị bên trong một System.Object và lưu trữ nó trên vùng heap trong miền ứng dụng.
  • Unboxing - Unboxing cũng là một quá trình được sử dụng để trích xuất loại giá trị từ đối tượng hoặc bất kỳ loại interface nào được triển khai. Boxing có thể được thực hiện ngầm, nhưng Unboxing phải rõ ràng bằng mã.
  • Khái niệm boxing và unboxing nhấn mạnh quan điểm thống nhất của C # về hệ thống kiểu trong đó một giá trị của bất kỳ kiểu nào cũng có thể được coi như một đối tượng.

Sự khác biệt giữa Struct và Class trong C# là gì?


Cả Class và Str`uct đều là kiểu dữ liệu do người dùng xác định nhưng có một số khác biệt chính:

Struct

  • Struct là kiểu giá trị trong C# và nó kế thừa từ System.Value.
  • Struct thường được sử dụng cho lượng dữ liệu nhỏ hơn.
  • Struct không thể được kế thừa sang kiểu khác.
  • Một Struct không thể là abstract.

Class

  • Class là kiểu tham chiếu trong C# và nó kế thừa từ System.Object.
  • Các Class thường được sử dụng cho một lượng lớn dữ liệu.
  • Class có thể được kế thừa sang Class khác.
  • Một Class có thể là kiểu abstract.
  • Chúng ta có thể tạo một phương thức khởi tạo mặc định.

This có thể được sử dụng trong một phương thức Static không?


Chúng ta không thể sử dụng this trong phương thức static vì từ khóa this trả về một tham chiếu đến instance hiện tại của lớp chứa nó.

Các phương thức static (hoặc bất kỳ thành viên static nào) không thuộc về một instance cụ thể. Chúng tồn tại mà không cần tạo một instance của lớp và được gọi bằng tên của một lớp mà không phải theo instance, vì vậy chúng ta không thể sử dụng từ khóa này trong phần thân của phương thức Static, nhưng trong trường hợp phương thức mở rộng, chúng ta có thể sử dụng nó làm tham số hàm.

Sự khác biệt giữa string và StringBuilder trong C# là gì?


string

  • string là một đối tượng không thay đổi giữ giá trị chuỗi.
  • string có hiệu suất chậm vì nó tạo một phiên bản mới để ghi đè hoặc thay đổi giá trị trước đó.
  • string thuộc về namespace System.

StringBuilder

  • StringBuilder là một đối tượng có thể thay đổi.
  • Hiệu suất của StringBuilder rất nhanh vì nó sẽ sử dụng cùng một phiên bản của đối tượng StringBuilder để thực hiện bất kỳ hoạt động nào như chèn giá trị trong chuỗi hiện có.
  • StringBuilder thuộc về namespace System.Text.Stringbuilder.

Generics trong C# là gì?


Generics cho phép bạn trì hoãn việc đặc tả kiểu dữ liệu của các phần tử lập trình trong một lớp hoặc một phương thức, cho đến khi nó thực sự được sử dụng trong chương trình. Nói cách khác, generics cho phép bạn viết một lớp hoặc phương thức có thể hoạt động với bất kỳ kiểu dữ liệu nào.

class DataStore<T>
{
   public T Data { get; set; }
}
DataStore<string> store = new DataStore<string>();

Serialization trong C# là gì?


Serialization có nghĩa là lưu trạng thái của đối tượng của bạn vào bộ nhớ phụ, chẳng hạn như một tệp.

  • Binary serialization (Lưu dữ liệu đối tượng của bạn thành định dạng nhị phân).
  • Soap Serialization (Lưu dữ liệu đối tượng của bạn thành định dạng nhị phân; chủ yếu được sử dụng trong giao tiếp liên quan đến network).
  • XmlSerialization (Lưu dữ liệu đối tượng của bạn vào một tệp XML).

LINQ trong C# là gì?


LINQ là viết tắt của Language Integrated Query. LINQ có khả năng truy vấn tuyệt vời trên bất kỳ nguồn dữ liệu nào. Nguồn dữ liệu có thể là tập hợp các đối tượng, cơ sở dữ liệu hoặc tệp XML. Chúng ta có thể dễ dàng truy xuất dữ liệu từ bất kỳ đối tượng nào thực hiện interface IEnumerable <T>.

Có thể thực thi nhiều khối lệnh catch không?


Không, không thể thực thi nhiều khối lệnh catch. Khi đoạn mã của catch thích hợp được thực thi, trình điều khiển được chuyển đến khối finally và sau đó sẽ thực thi đoạn mã của khối finally.

Kể tên các loại lớp khác nhau trong C#?


Các loại lớp khác nhau trong C# là:

  • Partial class - Cho phép các thành viên của nó được chia ra hoặc chia sẻ với nhiều tệp .cs. Nó được biểu thị bằng từ khóa Partial.
  • Sealed class - Là lớp không thể được kế thừa. Để truy cập các thành viên của một sealed class, chúng ta cần tạo đối tượng của lớp đó. Nó được biểu thị bằng từ khóa Sealed.
  • Abstract class - Là lớp mà đối tượng của nó không thể được khởi tạo. Lớp chỉ có thể được kế thừa. Nó phải chứa ít nhất một phương thức. Nó được biểu thị bằng từ khóa abstract.
  • Static class - Là lớp không cho phép kế thừa. Các thành viên của lớp cũng là static. Nó được biểu thị bằng từ khóa static. Từ khóa này yêu cầu trình biên dịch kiểm tra bất kỳ trường hợp ngẫu nhiên nào của static class.

Việc xử lý exception được thực hiện như thế nào trong C#?


Xử lý exception được thực hiện bằng cách sử dụng bốn từ khóa trong C#:

  • try - Chứa một khối mã mà exception sẽ được kiểm tra.
  • catch - Nó là một chương trình bắt một exception với sự trợ giúp của trình xử lý exception.
  • finally - Nó là một khối mã được viết để thực thi bất kể exception có bị bắt hay không.
  • throw - Thảy ra một exception khi sự cố xảy ra.

Abstract class là gì?


Abstract modifier chỉ ra rằng thứ đang được sửa đổi có phần triển khai bị thiếu hoặc không đầy đủ. Abstract modifier có thể được sử dụng với các lớp, phương thức, thuộc tính, trình chỉ mục và sự kiện. Một Abstract class là một lớp được ký hiệu bằng từ khóa abstract và chỉ có thể được sử dụng như một lớp cơ sở.

abstract class Shape
{
   public abstract int GetArea();
}

class Square : Shape
{
   int side;

   public Square(int n) => side = n;

   // GetArea method is required to avoid a compile-time error.
   public override int GetArea() => side * side;

   static void Main()
   {
      var sq = new Square(12);
      Console.WriteLine($"Area of the square = {sq.GetArea()}");
   }
}

// Output: Area of the square = 144

Abstract class có các tính năng sau:

  • Một Abstract class không thể được khởi tạo.
  • Một Abstract class có thể chứa các phương thức trừu tượng và trình truy cập (accessors).
  • Không thể sửa đổi một Abstract class với sealed modifier vì hai modifier có ý nghĩa trái ngược nhau. Sealed modifier ngăn không cho một lớp được kế thừa và Abstract modifier yêu cầu một lớp được kế thừa.
  • Một Non-abstract class được kế thừa từ một Abstract class phải bao gồm các triển khai thực tế của tất cả các phương thức và accessors được kế thừa.

Bạn có thể truyền tham số cho một phương thức bằng bao nhiêu cách?


Có ba cách mà các tham số có thể được truyền cho một phương thức:

  • Value parameters (tham số giá trị) - Phương thức này sao chép giá trị thực của một đối số vào tham số chính thức của hàm. Trong trường hợp này, các thay đổi được thực hiện đối với tham số bên trong hàm không ảnh hưởng đến đối số.
  • Reference parameters (tham số tham chiếu) - Phương thức này sao chép tham chiếu đến vị trí bộ nhớ của một đối số vào tham số chính thức. Điều này có nghĩa là các thay đổi được thực hiện đối với tham số sẽ ảnh hưởng đến đối số.
  • Output parameters (tham số đầu ra) - Phương thức này giúp trả về nhiều hơn một giá trị.

namespace trong C# là gì?


  • namespace được thiết kế để cung cấp một cách để giữ cho một bộ tên riêng biệt với một bộ tên khác. Các tên lớp được khai báo trong một namespace không xung đột với các tên lớp tương tự được khai báo trong một namespace khác.
  • NET sử dụng namespace để tổ chức nhiều lớp của nó.
  • Khai báo namespace của riêng bạn có thể giúp bạn kiểm soát phạm vi của tên lớp và phương thức trong các dự án lập trình lớn hơn. namespace SampleNamespace
{
   class SampleClass
   {
      public void SampleMethod()
      {
         System.Console.WriteLine(
            "SampleMethod inside SampleNamespace");
      }
    }
}
Avatar Techmely Team
VIẾT BỞI

Techmely Team