Phung Dang

Phung Dang

1678939676

50 câu hỏi và câu trả lời phỏng vấn C# phổ biến nhất

Trong bài viết C# này, chúng ta sẽ tìm hiểu về 50 câu hỏi và câu trả lời phỏng vấn C# phổ biến nhất. C# là một trong những ngôn ngữ lập trình phổ biến nhất và là ngôn ngữ goto để phát triển .NET. Vì vậy, nếu bạn là nhà phát triển .NET tham gia phỏng vấn .NET, bạn sẽ được hỏi các câu hỏi về lập trình C#. Dưới đây là 50 câu hỏi và câu trả lời phỏng vấn C# hàng đầu cho người mới bắt đầu và nhà phát triển C# chuyên nghiệp.

1. C# là gì? Và phiên bản mới nhất của C# là gì?

C# là một ngôn ngữ lập trình máy tính. Microsoft đã phát triển C# vào năm 2000 để cung cấp ngôn ngữ lập trình đa năng hiện đại có thể được sử dụng để phát triển tất cả các loại phần mềm nhắm mục tiêu đến các nền tảng khác nhau, bao gồm Windows, Web và Di động, chỉ sử dụng một ngôn ngữ lập trình. Ngày nay, C# là một trong những ngôn ngữ lập trình phổ biến nhất trên thế giới. Hàng triệu nhà phát triển phần mềm sử dụng C# để xây dựng mọi loại phần mềm. 

C# là ngôn ngữ chính để xây dựng các ứng dụng phần mềm Microsoft .NET. Các nhà phát triển có thể xây dựng hầu hết mọi loại phần mềm bằng C#, bao gồm ứng dụng Windows UI, ứng dụng bảng điều khiển, dịch vụ phụ trợ, API đám mây, dịch vụ Web, điều khiển và thư viện, ứng dụng serverless, ứng dụng Web, ứng dụng iOS và Android gốc, phần mềm AI và máy học, và các ứng dụng chuỗi khối.

C# cung cấp khả năng phát triển ứng dụng nhanh chóng với sự trợ giúp của Visual Studio IDE. C# là một ngôn ngữ lập trình hiện đại, hướng đối tượng, đơn giản, linh hoạt và hướng hiệu năng. C# được phát triển dựa trên các tính năng và trường hợp sử dụng tốt nhất của một số ngôn ngữ lập trình, bao gồm C++, Java, Pascal và SmallTalk. 

Cú pháp C# giống như C++. .NET và thư viện C# tương tự như Java. C# hỗ trợ các tính năng ngôn ngữ lập trình hướng đối tượng hiện đại, bao gồm Trừu tượng hóa, Đóng gói, Đa hình và Kế thừa. C# là một ngôn ngữ gõ mạnh. Hầu hết các kiểu trong .NET được kế thừa từ lớp Object.

C# hỗ trợ các khái niệm về lớp và đối tượng. Các lớp có các thành viên như trường, thuộc tính, sự kiện và phương thức. Đây là một bài viết chi tiết về C# và OOP. 

C# linh hoạt, hiện đại và hỗ trợ các nhu cầu lập trình hiện đại. Kể từ khi ra đời, ngôn ngữ C# đã trải qua nhiều lần nâng cấp. Phiên bản mới nhất của C# là C# 11.

2. Đối tượng trong C# là gì? 

Ngôn ngữ C# là ngôn ngữ lập trình hướng đối tượng. Các lớp là nền tảng của C#. Một lớp là một mẫu xác định cấu trúc dữ liệu và cách dữ liệu sẽ được lưu trữ, quản lý và truyền. Một lớp có các trường, thuộc tính, phương thức và các thành viên khác.

Trong khi các lớp là các khái niệm, các đối tượng là có thật. Các đối tượng được tạo bằng cách sử dụng các thể hiện của lớp. Một lớp định nghĩa kiểu của một đối tượng. Các đối tượng lưu trữ các giá trị thực trong bộ nhớ máy tính.

Bất kỳ thực thể nào trong thế giới thực có các đặc điểm nhất định hoặc có thể thực hiện một số công việc được gọi là Đối tượng. Đối tượng này còn được gọi là thể hiện, tức là bản sao của một thực thể trong ngôn ngữ lập trình. Các đối tượng là thể hiện của các lớp.

Ví dụ: chúng ta cần tạo một chương trình liên quan đến ô tô. Chúng ta cần tạo các thực thể cho ô tô. Hãy gọi nó là một lớp, Car. Một chiếc ô tô có bốn thuộc tính, tức là kiểu, loại, màu sắc và kích cỡ.

Để biểu diễn một chiếc ô tô trong lập trình, chúng ta có thể tạo một lớp Car với bốn thuộc tính Model, Type, Color và Size. Chúng được gọi là thành viên của một lớp. Một lớp có một số loại thành viên, hàm tạo, trường, thuộc tính, phương thức, đại biểu và sự kiện. Một thành viên lớp có thể là riêng tư, được bảo vệ hoặc công khai. Ngoài ra, vì các thuộc tính này có thể được truy cập bên ngoài lớp nên chúng có thể được công khai.

Một đối tượng là một thể hiện của một lớp. Một lớp có thể có nhiều thể hiện nếu cần. Ví dụ: Honda Civic là một thể hiện của Ô tô. Trong lập trình thực, Honda Civic là một đối tượng. Do đó, Honda Civic là một ví dụ của lớp Xe hơi. Các thuộc tính Model, Type, Color và Size của Honda Civic lần lượt là Civic, Honda, Red và 4. BMW 330, Toyota Carolla, Ford 350, Honda CR4, Honda Accord và Honda Pilot là một số ví dụ khác về các đối tượng của Car.

3. Mã được quản lý hoặc không được quản lý là gì? 

Mã được quản lý

“Mã được quản lý là mã được phát triển bằng .NET framework và các ngôn ngữ lập trình được hỗ trợ như C# hoặc VB.NET. Mã được quản lý được Common Language Runtime (CLR hoặc Runtime) trực tiếp thực thi và Runtime quản lý vòng đời của nó, bao gồm tạo đối tượng, cấp phát bộ nhớ và loại bỏ đối tượng. Bất kỳ ngôn ngữ nào được viết bằng .NET Framework đều là mã được quản lý".

Mã không được quản lý

Mã được phát triển bên ngoài .NET framework được gọi là 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à không được quản lý. Ví dụ: các ngôn ngữ như C hoặc C++ hoặc Visual Basic không được quản lý.

Các lập trình viên trực tiếp quản lý việc tạo đối tượng, thực thi và loại bỏ mã không được quản lý. Do đó, nếu các lập trình viên viết mã xấu, nó có thể dẫn đến rò rỉ bộ nhớ và phân bổ tài nguyên không mong muốn.”

.NET Framework cung cấp một cơ chế để mã không được quản lý được sử dụng trong mã được quản lý và ngược lại. Quá trình này được thực hiện với sự trợ giúp của các lớp bao bọc. 

4. Boxing và Unboxing trong C# là gì? 

Boxing và Unboxing đều được sử dụng để chuyển đổi loại.

Chuyển đổi từ loại giá trị sang loại tham chiếu được gọi là quyền anh. Boxing là một chuyển đổi ngầm. Đây là một ví dụ về quyền anh trong C#.

// Boxing
int anum = 123;
Object obj = anum;
Console.WriteLine(anum);
Console.WriteLine(obj);

Chuyển đổi từ loại tham chiếu sang loại giá trị được gọi là mở hộp. Đây là một ví dụ về unboxing trong C#.

// Unboxing
Object obj2 = 123;
int anum2 = (int)obj;
Console.WriteLine(anum2);
Console.WriteLine(obj);

5. Sự khác biệt giữa cấu trúc và lớp trong C# là gì? 

Lớp và cấu trúc đều là kiểu dữ liệu do người dùng định nghĩa nhưng có một số điểm khác biệt chính:

cấu trúc

  • Cấu trúc là một loại giá trị trong C# và kế thừa từ System.Value Type.
  • Cấu trúc thường được sử dụng cho lượng dữ liệu nhỏ hơn.
  • Cấu trúc không thể được kế thừa từ các loại khác.
  • Một cấu trúc không thể trừu tượng.
  • Không cần tạo đối tượng với từ khóa new.
  • Không có quyền tạo bất kỳ hàm tạo mặc định nào.

Lớp học

  • Lớp này là một kiểu tham chiếu trong C# và nó kế thừa từ Kiểu System.Object.
  • Các lớp thường được sử dụng cho một lượng lớn dữ liệu.
  • Các lớp có thể được kế thừa từ các lớp khác.
  • Một lớp có thể là một kiểu trừu tượng.
  • Chúng ta có thể tạo một hàm tạo mặc định.

Đọc các bài viết sau để tìm hiểu thêm về cấu trúc so với lớp,  Sự khác biệt về cấu trúc và lớp trong C#

6. Sự khác biệt giữa Giao diện và Lớp trừu tượng trong C# là gì? 

Dưới đây là một số khác biệt phổ biến giữa giao diện và lớp trừu tượng trong C#.

  • Một lớp có thể thực hiện bất kỳ số lượng giao diện nào, nhưng một lớp con nhiều nhất chỉ có thể sử dụng một lớp trừu tượng.
  • Một lớp trừu tượng có thể có các phương thức không trừu tượng (các phương thức cụ thể), trong khi trong trường hợp của giao diện, tất cả các phương thức phải là trừu tượng.
  • Một lớp trừu tượng có thể khai báo hoặc sử dụng bất kỳ biến nào, trong khi một giao diện không thể làm như vậy.
  • Trong một lớp trừu tượng, tất cả các thành viên dữ liệu hoặc chức năng là riêng tư theo mặc định, trong khi ở một giao diện, tất cả đều công khai; chúng tôi không thể thay đổi chúng theo cách thủ công.
  • Trong một lớp trừu tượng, chúng ta cần sử dụng các từ khóa trừu tượng để khai báo các phương thức trừu tượng; trong một giao diện, chúng ta không cần điều đó.
  • Một lớp trừu tượng không thể được sử dụng cho nhiều kế thừa, trong khi giao diện có thể được sử dụng cho nhiều kế thừa.
  • Một lớp trừu tượng sử dụng một hàm tạo, trong khi chúng ta không có bất kỳ hàm tạo nào trong một giao diện.

Để tìm hiểu thêm về sự khác biệt giữa lớp trừu tượng và giao diện, hãy truy cập  Lớp trừu tượng so với Giao diện .  

7. Một enum trong C# là gì? 

Một enum là một loại giá trị với một tập hợp các hằng số có tên liên quan, thường được gọi là danh sách liệt kê. 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 nguyên thủy do người dùng định nghĩa.

Kiểu enum có thể là số nguyên (float, int, byte, double, v.v.). Nhưng nếu bạn sử dụng nó bên cạnh int, thì nó phải được truyền.

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 là loại enum. Do đó, phải có một giá trị số cho mỗi loại enum.

Kiểu mặc định cơ bản của phần tử liệt kê là int. Theo mặc định, điều tra viên đầu tiên có giá trị 0 và giá trị của mỗi điều tra viên kế tiếp được tăng thêm 1. 

enum Dow {Sat, Sun, Mon, Tue, Wed, Thu, Fri};

Một số điểm về enum,

  • Enums là kiểu dữ liệu liệt kê trong C#.
  • Enums không dành cho người dùng cuối. Chúng dành cho các nhà phát triển.
  • Enums là hằng số được gõ mạnh. Chúng được gõ mạnh, nghĩa là, một enum của một loại có thể không được gán hoàn toàn cho một enum của loại khác mặc dù giá trị cơ bản của các thành viên của chúng là như nhau.
  • Bảng liệt kê (enums) 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 chuỗi và được xử lý dưới dạng số nguyên.
  • Loại mặc định là int và các loại được phê duyệt là byte, sbyte, short, ushort, uint, long và ulong.
  • Mỗi loại enum tự động xuất phát từ System.Enum, và do đó, chúng ta có thể sử dụng các phương thức System.Enum trên enum.
  • Enums là các loại giá trị được tạo trên ngăn xếp, không phải đống.

8. Sự khác biệt giữa câu lệnh “tiếp tục” và “ngắt” trong C# là gì? 

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

Ví dụ: Tuyên bố phá vỡ

using System;
using System.Collections;
using System.Linq;
using System.Text;
namespace break_example {
    Class brk_stmt {
        public static void main(String[] args) {
            for (int i = 0; i <= 5; i++) {
                if (i == 4) {
                    break;
                }
                Console.WriteLine("The number is " + i);
                Console.ReadLine();
            }
        }
    }
}

đầu ra 

Số là 0; 

Số là 1; 

Số là 2; 

Số là 3;

Ví dụ: Tuyên bố tiếp tục

using System;
using System.Collections;
using System.Linq;
using System.Text;
namespace continue_example {
Class cntnu_stmt {
public static void main(String[] {
        for (int i = 0; i <= 5; i++) {
            if (i == 4) {
                continue;
            }
            Console.WriteLine("The number is "+ i);
                Console.ReadLine();
            }
        }
    }
}

đầu ra

Số là 1;

Số là 2;

Số là 3;

Số là 5;

9. Sự khác biệt giữa hằng số và chỉ đọc trong C# là gì?

Const không là gì ngoài "hằng số", một biến có giá trị không đổi nhưng tại thời điểm biên dịch. Do đó, bắt buộc phải gán giá trị cho nó. Theo mặc định, const là tĩnh và chúng ta không thể thay đổi giá trị của biến const trong toàn bộ chương trình.

Readonly là từ khóa mà giá trị của nó chúng ta có thể thay đổi trong thời gian chạy hoặc gán nó trong thời gian chạy nhưng chỉ thông qua hàm tạo không tĩnh.

Ví dụ

Chúng tôi có một Lớp kiểm tra trong đó chúng tôi có hai biến, một là chỉ đọc và biến còn lại là hằng số.

class Test {
    readonly int read = 10;
    const int cons = 10;
    public Test() {
        read = 100;
        cons = 100;
    }
    public void Check() {
        Console.WriteLine("Read only : {0}", read);
        Console.WriteLine("const : {0}", cons);
    }
}

Ở đây, tôi đã cố gắng thay đổi giá trị của cả hai biến trong hàm tạo, nhưng khi tôi cố gắng thay đổi hằng số, nó báo lỗi thay đổi giá trị của chúng trong khối mà tôi phải gọi trong thời gian chạy.

ASP.NET

Cuối cùng, xóa dòng mã đó khỏi lớp và gọi hàm Check() này như trong đoạn mã sau:

class Program {
    static void Main(string[] args) {
        Test obj = new Test();
        obj.Check();
        Console.ReadLine();
    }
}
class Test {
    readonly int read = 10;
    const int cons = 10;
    public Test() {
        read = 100;
    }
    public void Check() {
        Console.WriteLine("Read only : {0}", read);
        Console.WriteLine("const : {0}", cons);
    }
}

đầu ra

ASP.NET 

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

Từ khóa ref chuyển các đối số theo tham chiếu. Do đó, bất kỳ thay đổi nào được thực hiện đối với đối số này trong phương thức sẽ được phản ánh trong biến đó khi điều khiển quay lại phương thức gọi.

Từ khóa out chuyển các đối số theo tham chiếu. Điều này rất giống với từ khóa ref.

ASP.NET

Để tìm hiểu thêm về từ khóa ref và out, hãy đọc bài viết sau:  Ref Vs. Ra từ khóa trong C#

11. Có thể sử dụng “this” trong một phương thức tĩnh không?

Chúng ta không thể sử dụng 'this' trong một phương thức tĩnh vì từ khóa 'this' trả về một tham chiếu đến thể hiện hiện tại của lớp chứa nó. Các phương thức tĩnh (hoặc bất kỳ thành viên tĩnh nào) không thuộc về một thể hiện cụ thể. Chúng tồn tại mà không cần tạo một thể hiện của lớp và được gọi với tên của một lớp chứ không phải theo thể hiện, 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 tĩnh. Tuy nhiên, trong trường hợp Phương thức mở rộng, chúng ta có thể sử dụng các tham số của phương thức.

Chúng ta hãy xem từ khóa “this”.

Từ khóa "this" trong C# là một loại biến tham chiếu đặc biệt được định nghĩa hoàn toàn bên trong mỗi hàm tạo và phương thức không tĩnh là tham số đầu tiên của lớp loại mà nó được định nghĩa.

12. Thuộc tính trong C# là gì?

Trong C#, thuộc tính là thành viên của lớp cung cấp cách đọc, ghi hoặc tính toán giá trị của trường riêng. Nó hiển thị một giao diện chung để truy cập và sửa đổi dữ liệu được lưu trữ trong một lớp đồng thời cho phép lớp duy trì quyền kiểm soát đối với cách dữ liệu đó được truy cập và thao tác.

Các thuộc tính được khai báo bằng cách sử dụng bộ truy cập get và set, xác định hành vi để nhận hoặc đặt giá trị thuộc tính. Bộ truy cập get truy xuất giá trị của thuộc tính, trong khi bộ truy cập set đặt giá trị của thuộc tính. Một thuộc tính có thể có một hoặc cả hai bộ truy cập, tùy thuộc vào việc nó là chỉ đọc, chỉ ghi hay đọc-ghi.

Ví dụ, hãy xem xét một lớp Người có tên trường riêng. Sau đó, một Tên thuộc tính có thể được tạo để cung cấp quyền truy cập vào trường này như thế này.

class Person
{
    private string name;

    public string Name
    {
        get { return name; }
        set { name = value; }
    }
}

Thuộc tính này cho phép trường tên được truy cập từ bên ngoài lớp, nhưng chỉ thông qua các phương thức thuộc tính. Điều này cung cấp một mức đóng gói và kiểm soát cách dữ liệu được truy cập và sửa đổi.

Các thuộc tính trong C# là một phần thiết yếu của lập trình hướng đối tượng và được sử dụng rộng rãi trong các ứng dụng để cung cấp một cách rõ ràng và an toàn để truy cập và sửa đổi dữ liệu lớp.

Tìm hiểu thêm tại đây: Thuộc tính trong C#

13. Phương thức mở rộng trong C# là gì?

Trong C#, một phương thức mở rộng là một phương thức tĩnh được sử dụng để mở rộng chức năng của một kiểu hiện có mà không sửa đổi kiểu ban đầu hoặc tạo một kiểu dẫn xuất mới. Các phương thức mở rộng cho phép các nhà phát triển thêm các phương thức vào các loại hiện có, chẳng hạn như các lớp, cấu trúc, giao diện, enum, v.v., không được xác định ban đầu trong các loại đó.

Các phương thức mở rộng được khai báo trong một lớp tĩnh và được định nghĩa là các phương thức tĩnh với tham số đầu tiên đặc biệt được gọi là tham số "this". Tham số "this" chỉ định loại được mở rộng và cho phép phương thức mở rộng được gọi như thể nó là một phương thức thể hiện của loại đó.

Ví dụ: hãy xem xét phương thức mở rộng sau để mở rộng kiểu chuỗi bằng cách cung cấp phương thức viết hoa chữ cái đầu tiên của chuỗi:

public static class StringExtensions
{
    public static string CapitalizeFirstLetter(this string str)
    {
        if (string.IsNullOrEmpty(str))
            return str;
        return char.ToUpper(str[0]) + str.Substring(1);
    }
}

Với phương thức mở rộng này, phương thức CapitalizeFirstLetter có thể được gọi trên bất kỳ đối tượng chuỗi nào như sau:

string s = "hello world";
string capitalized = s.CapitalizeFirstLetter(); // "Hello world"

Lưu ý rằng phương thức CapitalizeFirstLetter không được định nghĩa trong lớp chuỗi mà là một phương thức mở rộng được cung cấp bởi lớp StringExtensions.

Các phương thức mở rộng là một tính năng mạnh mẽ trong C# cho phép các nhà phát triển thêm chức năng mới vào các loại hiện có một cách dễ dàng và được sử dụng rộng rãi trong các ứng dụng để đơn giản hóa mã và cải thiện khả năng đọc mã.

Bạn có thể đọc các bài viết này,  Phương pháp mở rộng trong C# , để biết thêm chi tiết về các phương pháp mở rộng.

14. Sự khác biệt giữa Dispose và Finalize trong C# là gì?

Trong C#, cả hai phương thức Vứt bỏ và Hoàn thiện đều được sử dụng để giải phóng tài nguyên, nhưng chúng phục vụ các mục đích và hành vi khác nhau.

Phương pháp Vứt bỏ giải phóng các tài nguyên không được quản lý, chẳng hạn như xử lý tệp hoặc kết nối cơ sở dữ liệu, không được quản lý tự động bởi thời gian chạy .NET. Nó thường được triển khai trong một lớp triển khai giao diện IDis Dùng, định nghĩa phương thức Vứt bỏ.

Phương thức Vứt bỏ được mã máy khách gọi một cách rõ ràng để giải phóng tài nguyên khi chúng không còn cần thiết. Nó có thể được gọi hoàn toàn bằng cách sử dụng câu lệnh, đảm bảo rằng phương thức Vứt bỏ được gọi khi đối tượng vượt ra ngoài phạm vi.

Mặt khác, phương thức Finalize được sử dụng để thực hiện các thao tác dọn dẹp trên một đối tượng ngay trước khi nó được thu gom rác. Do đó, nó thường được triển khai trong một lớp ghi đè phương thức Object.Finalize.

Trình thu gom rác gọi phương thức Hoàn thiện, phương thức này sẽ tự động quản lý bộ nhớ của các đối tượng .NET, để giải phóng các tài nguyên không được quản lý chưa được giải phóng rõ ràng bằng phương thức Vứt bỏ.

Sự khác biệt chính giữa hai phương thức là phương thức Vứt bỏ là xác định và có thể được gọi một cách rõ ràng bằng mã máy khách. Ngược lại, phương thức Finalize không xác định và được gọi bởi trình thu gom rác vào thời điểm không xác định.

Điều quan trọng cần lưu ý là các đối tượng triển khai phương thức Vứt bỏ cũng nên triển khai phương thức Hoàn thiện như một cơ chế dự phòng trong trường hợp mã máy khách không gọi phương thức Vứt bỏ.

Tóm lại, phương pháp Vứt bỏ được sử dụng để giải phóng các tài nguyên không được quản lý một cách xác định. Ngược lại, phương thức Hoàn thiện được sử dụng như một cơ chế dự phòng để giải phóng các tài nguyên không được quản lý khi đối tượng được thu gom rác.

15. Đâu là sự khác biệt giữa String và StringBuilder trong C#?

StringBuilder và chuỗi được sử dụng cho các giá trị chuỗi, nhưng cả hai đều có nhiều điểm khác biệt trên cơ sở tạo cá thể và hiệu suất.

Sợi dây

Một chuỗi là một đối tượng bất biến. Bất biến là khi chúng ta tạo các đối tượng chuỗi trong mã để chúng ta không thể sửa đổi hoặc thay đổi đối tượng đó trong bất kỳ thao tác nào như chèn giá trị mới hoặc thay thế hoặc nối thêm bất kỳ giá trị nào với giá trị hiện có trong đối tượng chuỗi. Khi chúng ta phải thực hiện một số thao tác để thay đổi một chuỗi, đơn giản là nó sẽ loại bỏ giá trị cũ của đối tượng chuỗi và nó sẽ tạo một thể hiện mới trong bộ nhớ để giữ giá trị mới trong đối tượng chuỗi, ví dụ:

ASP.NET

Ghi chú

  • Đó là một đối tượng bất biến chứa giá trị chuỗi.
  • Về mặt hiệu suất, một chuỗi chậm vì nó tạo một phiên bản mới để ghi đè hoặc thay đổi giá trị trước đó.
  • Chuỗi thuộc về không gian tên Hệ thống.

StringBuilder

System.Text.StringBuilder là một đối tượng có thể thay đổi chứa giá trị chuỗi; có thể thay đổi có nghĩa là khi chúng ta tạo một đối tượng System.Text.Stringbuilder. Chúng ta có thể sử dụng đối tượng này cho bất kỳ hoạt động nào, chẳng hạn như chèn giá trị vào một chuỗi hiện có bằng các hàm chèn và thay thế hoặc nối thêm mà không cần tạo một phiên bản mới của System.Text.StringBuilder cho mọi lần, vì vậy, đối tượng này đang sử dụng đối tượng trước đó. Bằng cách đó, nó hoạt động nhanh hơn so với System.String. Hãy xem một ví dụ để hiểu System.Text.StringBuilder. 

ASP.NET

Ghi chú

  • StringBuilder là một đối tượng có thể thay đổi.
  • Xét về hiệu suất, StringBuilder rất nhanh vì nó sẽ sử dụng cùng một thể hiện của đối tượng StringBuilder để thực hiện bất kỳ thao tác nào, chẳng hạn như chèn một giá trị vào chuỗi hiện có.
  • StringBuilder thuộc về không gian tên System.Text.

16. Công dụng của delegate trong C# là gì?

Đại biểu là sự trừu tượng hóa của một hoặc nhiều con trỏ hàm (như đã tồn tại trong C++; giải thích về điều này nằm ngoài phạm vi của bài viết này). .NET đã triển khai khái niệm con trỏ hàm dưới dạng đại biểu. Với các đại biểu, bạn có thể coi một hàm là dữ liệu. Người đại diện cho phép các hàm được truyền dưới dạng tham số, được trả về từ hàm dưới dạng giá trị và được lưu trữ trong một mảng. Đại biểu có các đặc điểm sau:

  • Các đại biểu có nguồn gốc từ lớp System.MulticastDelegate.
  • Họ có một chữ ký và một loại trả lại. Chức năng được thêm vào người đại diện phải tương thích với chữ ký này.
  • Các đại biểu có thể trỏ đến các phương thức tĩnh hoặc cá thể.
  • Khi một đối tượng ủy nhiệm đã được tạo, nó có thể tự động gọi các phương thức mà nó trỏ tới khi chạy.
  • Các đại biểu có thể gọi các phương thức đồng bộ và không đồng bộ.

Đại biểu chứa một vài trường hữu ích. Cái đầu tiên chứa một tham chiếu đến một đối tượng và cái thứ hai chứa một con trỏ phương thức. Khi gọi đại biểu, phương thức thể hiện được gọi trên tham chiếu được chứa. Tuy nhiên, nếu tham chiếu đối tượng là null, thì bộ thực thi hiểu điều này có nghĩa là phương thức này là một phương thức tĩnh. Hơn nữa, gọi một đại biểu về mặt cú pháp cũng giống như gọi một hàm thông thường. Do đó, các đại biểu là hoàn hảo để thực hiện các cuộc gọi lại.

Tại sao chúng ta cần đại biểu?

Trước đây, API Windows thường xuyên sử dụng các con trỏ hàm kiểu C để tạo các hàm gọi lại. Sử dụng một cuộc gọi lại, các lập trình viên có thể định cấu hình một chức năng để báo cáo lại cho một chức năng khác trong ứng dụng. Vì vậy, mục tiêu của việc sử dụng gọi lại là để xử lý các hoạt động bấm nút, chọn menu và di chuyển chuột. Nhưng vấn đề với cách tiếp cận truyền thống này là các chức năng gọi lại không an toàn về kiểu. Trong .NET framework, vẫn có thể gọi lại bằng cách sử dụng các đại biểu với cách tiếp cận hiệu quả hơn. Tuy nhiên, các đại biểu duy trì ba phần thông tin quan trọng:

  • Các tham số của phương thức.
  • Địa chỉ của phương thức mà nó gọi.
  • Kiểu trả về của phương thức.

Một đại biểu là một giải pháp cho các tình huống mà bạn muốn chuyển các phương thức cho các phương thức khác. Bạn đã quá quen với việc truyền dữ liệu cho phương thức dưới dạng tham số nên ý tưởng truyền phương thức làm đối số thay vì dữ liệu nghe có vẻ lạ. Tuy nhiên, có những trường hợp bạn có một phương thức thực hiện một việc nào đó, chẳng hạn như gọi một số phương thức khác. Tại thời điểm biên dịch, bạn không biết phương thức thứ hai này là gì. Thông tin đó chỉ có sẵn trong thời gian chạy. Do đó, Đại biểu là thiết bị để khắc phục những phức tạp như vậy.

17. Các lớp niêm phong trong C# là gì?

Các lớp niêm phong được sử dụng để hạn chế tính năng kế thừa của lập trình hướng đối tượng. Khi một lớp được định nghĩa là lớp niêm phong, lớp đó không thể được kế thừa. 

Trong C#, công cụ sửa đổi niêm phong định nghĩa một lớp là niêm phong. Trong Visual Basic .NET, từ khóa Không kế thừa phục vụ mục đích của lớp niêm phong. Trình biên dịch sẽ đưa ra lỗi nếu một lớp được dẫn xuất từ ​​một lớp đã niêm phong. 

Nếu bạn đã từng nhận thấy, các cấu trúc được niêm phong. Bạn không thể lấy được một lớp từ một cấu trúc. 

Định nghĩa lớp sau định nghĩa một lớp kín trong C#:

// Sealed class
sealed class SealedClass
{
}

18. Lớp từng phần là gì?

Một phần lớp chỉ được sử dụng để phân chia định nghĩa của một lớp thành hai hoặc nhiều lớp trong cùng một tệp mã nguồn hoặc nhiều hơn một tệp nguồn. Bạn có thể tạo một định nghĩa lớp trong nhiều tệp, tệp này sẽ được biên dịch thành một lớp trong thời gian chạy. Ngoài ra, khi bạn tạo một thể hiện 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ả các tệp nguồn có cùng đối tượng.

Partial Classes có thể được tạo trong cùng một không gian tên. Tuy nhiên, không thể tạo một phần lớp trong một không gian tên khác. Vì vậy, hãy sử dụng từ khóa “partial” với tất cả các tên lớp mà bạn muốn liên kết với cùng tên của một lớp trong cùng một không gian tên. Hãy xem một ví dụ:

ASP.NET 

19. Sự khác biệt giữa boxing và unboxing trong C# là gì?

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

quyền anh

Quyền anh đang chuyển đổi loại dữ liệu loại giá trị thành đối tượng hoặc bất kỳ loại dữ liệu giao diện nào được triển khai bởi loại giá trị này. Ví dụ: khi các hộp CLR, một giá trị có nghĩa là khi CLR chuyển đổi một loại giá trị thành Loại đối tượng, nó sẽ 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. 

Ví dụ

ASP.NET

Mở hộp** **

Mở hộp cũng là một quá trình để trích xuất loại giá trị từ đối tượng hoặc bất kỳ loại giao diện đã triển khai nào. Quyền anh có thể được thực hiện ngầm, nhưng việc mở hộp phải rõ ràng bằng mã. 

Ví dụ:** **

 ASP.NET

Khái niệm boxing và unboxing làm cơ sở cho quan điểm thống nhất của C# về hệ thống kiểu trong đó một giá trị thuộc bất kỳ kiểu nào cũng có thể được coi là một đối tượng.

20. IEnumerable<> trong C# là gì?

IEnumerable là giao diện chính cho tất cả các bộ sưu tập không chung chung trong không gian tên System.Collections như ArrayList, HastTable, v.v. có thể được liệt kê. Phiên bản chung của giao diện này là IEnumerable<T>, một giao diện mẹ của tất cả các lớp bộ sưu tập chung trong không gian tên System.Collections.Generic như Danh sách<> và hơn thế nữa. 

Trong System.Collections.Generic.IEnumerable<T> chỉ có một phương thức duy nhất là GetEnumerator(), phương thức này trả về một IEnumerator. IEnumerator cung cấp khả năng lặp qua bộ sưu tập bằng cách hiển thị thuộc tính Hiện tại và các phương thức Di chuyển Tiếp theo và Đặt lại nếu chúng ta không có giao diện này với tư cách là cha mẹ, vì vậy chúng ta không thể sử dụng phép lặp bằng vòng lặp foreach hoặc không thể sử dụng đối tượng lớp đó trong truy vấn LINQ của chúng tôi.

ASP.NET 

21. Sự khác biệt giữa ràng buộc muộn và sớm trong C# là gì?

Khái niệm Early Binding và Late Binding thuộc tính đa hình trong C#. Tính đa hình là tính năng của lập trình hướng đối tượng cho phép một ngôn ngữ sử dụng cùng một tên ở các dạng khác nhau. Ví dụ: một phương thức có tên Add có thể cộng các số nguyên, số nhân đôi và số thập phân.

Đa hình chúng ta có hai loại khác nhau để đạt được: 

  • Thời gian biên dịch còn được gọi là Ràng buộc sớm hoặc Quá tải.
  • Thời gian chạy còn được gọi là ràng buộc muộn hoặc ghi đè.

Biên dịch đa hình thời gian hoặc ràng buộc sớm** **

Trong Compile time polymorphism hay Early Binding, chúng ta sẽ sử dụng nhiều phương thức có cùng tên nhưng khác loại tham số hoặc có thể là số lượng tham số. Do đó, chúng ta có thể thực hiện các tác vụ khác nhau với cùng một tên phương thức trong cùng một lớp, còn được gọi là Nạp chồng phương thức.

Xem cách chúng ta có thể làm điều đó trong ví dụ sau:

ASP.NET 

Đa hình thời gian chạy hoặc ràng buộc muộn

Đa hình thời gian chạy còn được gọi là ràng buộc muộn. Trong Run Time Polymorphism hoặc Late Binding, chúng ta có thể sử dụng cùng tên phương thức với cùng chữ ký, nghĩa là cùng loại hoặc số lượng tham số, nhưng không cùng lớp vì trình biên dịch không cho phép điều đó tại thời điểm biên dịch. Do đó, chúng ta có thể sử dụng liên kết đó trong thời gian chạy trong lớp dẫn xuất khi một đối tượng lớp con hoặc lớp dẫn xuất được khởi tạo. Đó là lý do tại sao chúng tôi gọi nó là Ràng buộc muộn. Chúng ta phải tạo các hàm lớp cha của tôi dưới dạng một phần và trong trình điều khiển hoặc lớp con dưới dạng các hàm ghi đè bằng từ khóa ghi đè. 

Ví dụ

ASP.NET 

22. Sự khác biệt giữa IEnumerable và IQueryable là gì?

Trước khi chúng ta đi vào sự khác biệt, hãy tìm hiểu IEnumerable và IQueryable là gì.

IEnumerable

Nó là giao diện chính cho tất cả các bộ sưu tập không chung chung trong không gian tên System.Collections như ArrayList, HastTable, v.v. có thể được liệt kê. Phiên bản chung của giao diện này là IEnumerable<T>, một giao diện mẹ của tất cả các lớp bộ sưu tập chung trong không gian tên System.Collections.Generic, như Danh sách<> và hơn thế nữa. 

Có thể truy vấn** **

Theo MSDN, giao diện IQueryable dành cho các nhà cung cấp truy vấn triển khai. Do đó, nó chỉ nên được triển khai bởi các nhà cung cấp cũng triển khai IQueryable<T>. Nếu nhà cung cấp cũng không triển khai IQueryable<T>, thì không thể sử dụng toán tử truy vấn tiêu chuẩn trên nguồn dữ liệu của nhà cung cấp.

Giao diện IQueryable kế thừa giao diện IEnumerable để nếu nó đại diện cho một truy vấn, thì kết quả của truy vấn đó có thể được liệt kê. Việc liệt kê làm cho cây biểu thức được liên kết với một đối tượng IQueryable được thực thi. Định nghĩa "thực thi cây biểu thức" dành riêng cho nhà cung cấp truy vấn. Ví dụ: nó có thể liên quan đến việc dịch cây biểu thức sang ngôn ngữ truy vấn thích hợp cho nguồn dữ liệu cơ bản. Các truy vấn không trả về vô số kết quả được thực thi khi phương thức Execute được gọi.

ASP.NET 

23. Điều gì xảy ra nếu các giao diện kế thừa có tên phương thức xung đột?

Chúng ta không cần định nghĩa tất cả nếu triển khai nhiều giao diện trong cùng một lớp với các tên phương thức xung đột. Nói cách khác, chúng ta có thể nói nếu chúng ta có các phương thức xung đột trong cùng một lớp, chúng ta không thể triển khai phần thân của chúng một cách độc lập trong cùng một lớp vì cùng tên và cùng chữ ký. Do đó, chúng ta phải sử dụng tên giao diện trước tên phương thức để loại bỏ việc tịch thu phương thức này. Hãy xem một ví dụ:

interface testInterface1 {
    void Show();
}
interface testInterface2 {
    void Show();
}
class Abc: testInterface1,
    testInterface2 {
        void testInterface1.Show() {
            Console.WriteLine("For testInterface1 !!");
        }
        void testInterface2.Show() {
            Console.WriteLine("For testInterface2 !!");
        }
    }

Bây giờ hãy xem cách sử dụng chúng trong một lớp học:

class Program {
    static void Main(string[] args) {
        testInterface1 obj1 = new Abc();
        testInterface1 obj2 = new Abc();
        obj1.Show();
        obj2.Show();
        Console.ReadLine();
    }
}

đầu ra

ASP.NET 

24. Mảng trong C# là gì?

Trong C#, chỉ số mảng bắt đầu từ số không. Điều đó có nghĩa là mục đầu tiên của một mảng bắt đầu ở vị trí thứ 0. Do đó, vị trí của mục cuối cùng trên một mảng sẽ có tổng số mục - 1. Vì vậy, nếu một mảng có mười mục thì mục thứ 10 trước đó nằm ở vị trí thứ 9. 

Trong C#, mảng có thể được khai báo là độ dài cố định hoặc động.

Một  mảng có độ dài cố định  có thể lưu trữ một số mục được xác định trước.

Một  mảng động  không có kích thước được xác định trước. Thay vào đó, kích thước của một  mảng động  tăng lên khi bạn thêm các mục mới vào mảng. Bạn có thể khai báo mảng có độ dài cố định hoặc động. Bạn thậm chí có thể thay đổi một mảng động thành tĩnh sau khi nó được xác định.

Chúng ta hãy xem các khai báo đơn giản của mảng trong C#. Đoạn mã sau định nghĩa mảng động đơn giản nhất gồm các kiểu số nguyên không có kích thước cố định.

int[] intArray;

Như bạn có thể thấy từ đoạn mã trên, phần khai báo của một mảng bắt đầu bằng một loại mảng theo sau là dấu ngoặc vuông ([]) và tên của mảng.

Đoạn mã sau khai báo một mảng chỉ có thể lưu trữ năm mục, bắt đầu từ chỉ mục 0 đến 4. 

int[] intArray;
intArray = new int[5];

 Đoạn mã sau khai báo một mảng có thể lưu trữ 100 mục từ chỉ số 0 đến 99. 

int[] intArray;
intArray = new int[100];

25. Constructor Chaining trong C# là gì? 

Constructor chaining là một cách để kết nối hai hoặc nhiều lớp trong một mối quan hệ dưới dạng Kế thừa. Trong Constructor Chaining, mọi hàm tạo của lớp con được ánh xạ ngầm tới một Trình tạo của lớp cha bởi từ khóa cơ sở, vì vậy khi bạn tạo một thể hiện của lớp con, nó sẽ gọi Trình tạo của lớp cha. Không có nó, việc kế thừa là không thể.

26. Sự khác biệt giữa Array.CopyTo() và Array.Clone() là gì?

Phương thức Array.Clone() tạo một bản sao nông của một mảng. Một bản sao nông của Mảng chỉ sao chép các phần tử của Mảng, cho dù là kiểu tham chiếu hay kiểu giá trị, nhưng nó không sao chép các đối tượng mà tham chiếu đề cập đến. Các tham chiếu trong Mảng mới trỏ đến cùng các đối tượng như trong Mảng ban đầu.

Phương thức tĩnh CopyTo() của lớp Array sao chép một phần của một mảng sang một mảng khác. Phương thức CopyTo sao chép tất cả các phần tử của một mảng sang một mảng một chiều khác. Ví dụ, mã được liệt kê trong Liệt kê chín sao chép nội dung của một mảng số nguyên sang các loại đối tượng khác nhau. 

27. Có thể thực thi Nhiều khối Catch trong C# không? 

Chúng ta có thể sử dụng nhiều khối catch với câu lệnh try. Điều này là do mỗi khối bắt có thể bắt một ngoại lệ khác nhau. Ví dụ mã sau đây cho thấy cách triển khai nhiều câu lệnh bắt với một câu lệnh thử.

using System;
class MyClient {
    public static void Main() {
        int x = 0;
        int div = 0;
        try {
            div = 100 / x;
            Console.WriteLine("Not executed line");
        } catch (DivideByZeroException de) {
            Console.WriteLine("DivideByZeroException");
        } catch (Exception ee) {
            Console.WriteLine("Exception");
        } finally {
            Console.WriteLine("Finally Block");
        }
        Console.WriteLine("Result is {0}", div);
    }
}

28. Mẫu thiết kế Singleton là gì và cách triển khai nó trong C#?

Mẫu thiết kế Singleton là một mẫu thiết kế sáng tạo đảm bảo rằng một lớp chỉ có một thể hiện và cung cấp một điểm truy cập toàn cầu cho thể hiện đó. Ngoài ra, mẫu này kiểm soát việc tạo đối tượng, giới hạn số lượng phiên bản có thể được tạo thành một phiên bản duy nhất, được chia sẻ trong toàn bộ ứng dụng.

Trong một triển khai Singleton điển hình, lớp Singleton có một hàm tạo riêng để ngăn việc khởi tạo trực tiếp và một phương thức tĩnh trả về một thể hiện duy nhất của lớp. Lần đầu tiên phương thức tĩnh được gọi, nó tạo một thể hiện mới của lớp và lưu trữ nó trong một biến tĩnh riêng. Các cuộc gọi tiếp theo đến phương thức tĩnh trả về cùng một thể hiện.

Ví dụ, hãy xem xét Kết nối cơ sở dữ liệu lớp Singleton được sử dụng để quản lý kết nối cơ sở dữ liệu. Lớp học có thể được thực hiện như thế này:

public class DatabaseConnection
{
    private static DatabaseConnection instance;
    private DatabaseConnection() { }

    public static DatabaseConnection GetInstance()
    {
        if (instance == null)
            instance = new DatabaseConnection();
        return instance;
    }

    // Database connection methods
    public void Connect() { /* ... */ }
    public void Disconnect() { /* ... */ }
}

Trong triển khai này, phương thức GetInstance được sử dụng để tạo hoặc truy xuất một thể hiện duy nhất của lớp. Hàm tạo là riêng tư, vì vậy lớp không thể được khởi tạo trực tiếp từ bên ngoài lớp.

Singletons được sử dụng rộng rãi trong các ứng dụng để quản lý tài nguyên tốn kém để tạo hoặc có tính khả dụng hạn chế, chẳng hạn như kết nối cơ sở dữ liệu, ổ cắm mạng, hệ thống ghi nhật ký, v.v.

Điều quan trọng cần lưu ý là các lớp Singleton có thể đưa ra các vấn đề tiềm ẩn như trạng thái toàn cầu và khó khăn khi kiểm tra đơn vị, vì vậy chúng nên được sử dụng cẩn thận và chỉ khi cần thiết.

29. Sự khác biệt giữa Throw Exception và Throw khoản 

Sự khác biệt cơ bản là ngoại lệ Ném sẽ ghi đè lên dấu vết ngăn xếp. Thật khó để tìm ra số dòng mã ban đầu đã đưa ra ngoại lệ.

Ném về cơ bản giữ lại thông tin ngăn xếp và thêm vào thông tin ngăn xếp trong trường hợp ngoại lệ mà nó được ném.

Hãy xem ý nghĩa của nó để hiểu rõ hơn về sự khác biệt. Tôi đang sử dụng một ứng dụng bảng điều khiển để dễ dàng kiểm tra và xem cách sử dụng của hai ứng dụng này khác nhau như thế nào về chức năng của chúng.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace TestingThrowExceptions {
    class Program {
        public void ExceptionMethod() {
            throw new Exception("Original Exception occurred in ExceptionMethod");
        }
        static void Main(string[] args) {
            Program p = new Program();
            try {
                p.ExceptionMethod();
            } catch (Exception ex) {
                throw ex;
            }
        }
    }

Bây giờ hãy chạy mã bằng cách nhấn phím F5 và xem điều gì sẽ xảy ra. Nó trả về một ngoại lệ và xem dấu vết ngăn xếp.

30. Bộ chỉ mục trong C# là gì?

C# giới thiệu một khái niệm mới gọi là Bộ chỉ mục, được sử dụng để coi một đối tượng là một mảng. Các bộ chỉ mục thường được gọi là mảng thông minh trong C#. Tuy nhiên, chúng không phải là một phần thiết yếu của lập trình hướng đối tượng.

Định nghĩa một bộ chỉ mục cho phép bạn tạo các lớp hoạt động như các mảng ảo. Sau đó, các thể hiện của lớp đó có thể được truy cập bằng cách sử dụng toán tử truy cập mảng [].

Tạo một bộ lập chỉ mục

< modifier > <
return type > this[argument list] {
    get {
        // your get block code
    }
    set {
        // your set block code
    }
}

Trong đoạn mã trên,

<công cụ sửa đổi>

Nó có thể là riêng tư, công khai, được bảo vệ hoặc nội bộ.

<kiểu trả về>

Nó có thể là bất kỳ loại C# hợp lệ nào.

31. Đại biểu multicast trong C# là gì?

Đại biểu là một trong những loại cơ sở trong .NET. Đại biểu là một lớp được sử dụng để tạo và gọi các đại biểu trong thời gian chạy.

Một đại biểu trong C# cho phép các nhà phát triển coi các phương thức như các đối tượng và gọi chúng từ mã của họ.

Thực hiện ví dụ về đại biểu Multicast:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
delegate void MDelegate();
class DM {
    static public void Display() {
        Console.WriteLine("Meerut");
    }
    static public void print() {
        Console.WriteLine("Roorkee");
    }
}
class MTest {
    public static void Main() {
        MDelegate m1 = new MDelegate(DM.Display);
        MDelegate m2 = new MDelegate(DM.print);
        MDelegate m3 = m1 + m2;
        MDelegate m4 = m2 + m1;
        MDelegate m5 = m3 - m2;
        m3();
        m4();
        m5();
    }
}

32. Sự khác biệt giữa Toán tử đẳng thức (==) và Phương thức Equals() trong C

Toán tử == và phương thức Equals() so sánh hai mục dữ liệu loại giá trị hoặc mục dữ liệu loại tham chiếu. Toán tử đẳng thức (==) là toán tử so sánh và phương thức Equals() so sánh nội dung của một chuỗi. Toán tử == so sánh danh tính tham chiếu trong khi phương thức Equals() chỉ so sánh nội dung. Hãy xem một số ví dụ.

Trong ví dụ này, chúng tôi đã gán một biến chuỗi cho một biến khác. Một chuỗi là một loại tham chiếu. Vì vậy, trong ví dụ sau, một biến chuỗi được gán cho một biến chuỗi khác, đề cập đến cùng một danh tính trong một đống và cả hai đều có cùng nội dung. Do đó, bạn nhận được đầu ra True cho các phương thức == Operator và Equals().

using System;
namespace ComparisionExample {
    class Program {
        static void Main(string[] args) {
            string name = "sandeep";
            string myName = name;
            Console.WriteLine("== operator result is {0}", name == myName);
            Console.WriteLine("Equals method result is {0}", name.Equals(myName));
            Console.ReadKey();
        }
    }
}

33. Sự khác nhau giữa toán tử Is và As trong C#

toán tử "là"

Trong ngôn ngữ C#, chúng ta sử dụng toán tử "is" để kiểm tra loại đối tượng. Nếu hai đối tượng cùng loại, nó trả về true; mặt khác, nó trả về false.

Hãy hiểu điều này trong mã C# của chúng tôi. Đầu tiên chúng ta khai báo 2 class là Speaker và Author.

class Speaker {
    public string Name {
        get;
        set;
    }
}
class Author {
    public string Name {
        get;
        set;
    }
}

Bây giờ, hãy tạo một đối tượng kiểu Loa:

var speaker = new Speaker { Name="Gaurav Kumar Arora"};

Bây giờ, hãy kiểm tra xem đối tượng có phải là Loa không:

var isTrue = speaker is Speaker;

Trong phần trước, chúng tôi đang kiểm tra loại khớp. Vì vậy, vâng, diễn giả của chúng tôi là một đối tượng của loại Diễn giả.

Console.WriteLine("speaker is of Speaker type:{0}", isTrue);

Vì vậy, kết quả là đúng.

Nhưng, ở đây chúng tôi nhận được sai:

var author = new Author { Name = "Gaurav Kumar Arora" };
var isTrue = speaker is Author;
Console.WriteLine("speaker is of Author type:{0}", isTrue);

Bởi vì diễn giả của chúng tôi không phải là một đối tượng của loại Tác giả.

toán tử "như"

Toán tử "as" hoạt động tương tự như toán tử "is". Sự khác biệt duy nhất là nó trả về đối tượng nếu cả hai đều tương thích với loại đó. Khác nó trả về một giá trị rỗng.

Hãy hiểu điều này trong mã C# của chúng tôi.

public static string GetAuthorName(dynamic obj)
{
    Author authorObj = obj as Author;
    return (authorObj != null) ? authorObj.Name : string.Empty;
}

Chúng tôi có một phương thức chấp nhận một đối tượng động và trả về thuộc tính tên đối tượng nếu đối tượng thuộc loại Tác giả. 

Ở đây, chúng tôi đã khai báo hai đối tượng:

var speaker = new Speaker { Name="Gaurav Kumar Arora"};
var author = new Author { Name = "Gaurav Kumar Arora" };

Sau đây trả về thuộc tính "Tên":

var authorName = GetAuthorName(author);
Console.WriteLine("Author name is:{0}", authorName);

Nó trả về một chuỗi rỗng:

authorName = GetAuthorName(speaker);
Console.WriteLine("Author name is:{0}", authorName);

34. Cách sử dụng các kiểu Nullable<> trong C#?

Loại nullable là loại dữ liệu chứa loại dữ liệu đã xác định hoặc giá trị null.

Khái niệm loại nullable này không tương thích với "var."

Bất kỳ kiểu dữ liệu nào cũng có thể được khai báo là kiểu nullable với sự trợ giúp của toán tử "?". 

Ví dụ: đoạn mã sau khai báo int 'i' là null.

int? i = null;

Như đã thảo luận trong phần trước, "var" không tương thích với các loại nullable. Vì vậy, nếu bạn khai báo như sau, bạn sẽ gặp lỗi.

var? i = null;

35. Các cách khác nhau mà một Phương thức có thể được Quá tải là gì?

Quá tải phương thức là một cách để đạt được tính đa hình thời gian biên dịch, nơi chúng ta có thể sử dụng một phương thức có cùng tên nhưng khác chữ ký. Ví dụ: ví dụ mã sau đây có một khối lượng phương thức với ba chữ ký khác nhau dựa trên số lượng và loại tham số cũng như giá trị trả về.

Ví dụ

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Hello_Word {
    class overloding {
        public static void Main() {
            Console.WriteLine(volume(10));
            Console.WriteLine(volume(2.5F, 8));
            Console.WriteLine(volume(100L, 75, 15));
            Console.ReadLine();
        }

        static int volume(int x) {
            return (x * x * x);
        }

        static double volume(float r, int h) {
            return (3.14 * r * r * h);
        }

        static long volume(long l, int b, int h) {
            return (l * b * h);
        }
    }
}

Ghi chú 

Giả sử chúng ta có một phương thức với hai loại đối tượng tham số và phương thức cùng tên với hai tham số nguyên khi chúng ta gọi phương thức đó với một giá trị int. Trong trường hợp đó, nó sẽ gọi phương thức đó với tham số nguyên thay vì phương thức tham số kiểu đối tượng.

36. Nhóm đối tượng trong .Net là gì?

Nhóm đối tượng trong .NET cho phép các đối tượng giữ trong nhóm bộ nhớ để các đối tượng có thể được sử dụng lại mà không cần tạo lại chúng. Bài viết này giải thích gộp đối tượng là gì trong .NET và cách triển khai gộp đối tượng trong C#.

Nó có nghĩa là gì?

Nhóm đối tượng là nơi chứa các đối tượng đã sẵn sàng để sử dụng. Bất cứ khi nào có yêu cầu cho một đối tượng mới, người quản lý nhóm sẽ nhận yêu cầu, yêu cầu này sẽ được phục vụ bằng cách phân bổ một đối tượng từ nhóm.

Làm thế nào nó hoạt động?

Chúng ta sẽ sử dụng Factory pattern cho mục đích này. Chúng ta sẽ có một phương thức xuất xưởng, phương thức này sẽ đảm nhận việc tạo các đối tượng. Bất cứ khi nào có yêu cầu cho một đối tượng mới, phương thức xuất xưởng sẽ xem xét nhóm đối tượng (chúng tôi sử dụng đối tượng Queue). Nếu có bất kỳ đối tượng nào có sẵn trong giới hạn cho phép, nó sẽ trả về đối tượng đó (đối tượng giá trị). Nếu không, một đối tượng mới sẽ được tạo và trả lại cho bạn.

37. Generics trong C# là gì?

Generics cho phép bạn trì hoãn việc xác định 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ó đượ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.

Bạn viết các đặc tả cho lớp hoặc phương thức, với các tham số thay thế cho các kiểu dữ liệu. Khi trình biên dịch gặp một hàm tạo cho lớp hoặc lệnh gọi hàm cho phương thức, nó sẽ tạo mã để xử lý kiểu dữ liệu cụ thể.

ASP.NET

Các lớp và phương thức chung kết hợp khả năng sử dụng lại, an toàn kiểu và hiệu quả theo cách mà các đối tác không chung chung của chúng không thể làm được. Generics được sử dụng thường xuyên nhất với các bộ sưu tập và các phương thức hoạt động trên chúng. Phiên bản 2.0 của thư viện lớp .NET Framework cung cấp một không gian tên mới, System.Collections.Generic chứa một số lớp bộ sưu tập dựa trên chung mới. Chúng tôi khuyên rằng tất cả các ứng dụng nhắm mục tiêu .NET Framework 2.0 trở lên nên sử dụng các lớp bộ sưu tập chung mới thay vì các đối tác không chung chung cũ hơn, chẳng hạn như ArrayList.

Đặc điểm của Generics

Generics là một kỹ thuật làm phong phú chương trình của bạn theo những cách sau:

  • Đầu tiên, nó giúp bạn tối đa hóa việc sử dụng lại mã, an toàn loại và hiệu suất.
  • Bạn có thể tạo các lớp bộ sưu tập chung. Thư viện lớp .NET Framework chứa một số lớp bộ sưu tập chung mới trong không gian tên System.Collections.Generic. Bạn có thể sử dụng các lớp tập hợp chung này thay vì các lớp tập hợp trong không gian tên System.Collections.
  • Bạn có thể tạo các giao diện, lớp, phương thức, sự kiện và đại biểu chung của riêng mình.
  • Bạn có thể tạo các lớp chung bị ràng buộc để cho phép truy cập vào các phương thức trên các kiểu dữ liệu cụ thể.
  • Bạn có thể nhận được thông tin về các loại được sử dụng trong một loại dữ liệu chung trong thời gian chạy bằng cách sử dụng sự phản chiếu.

38. Mô tả Accessibility Modifiers trong C

Công cụ sửa đổi truy cập là các từ khóa được sử dụng để chỉ định khả năng truy cập được khai báo của một thành viên hoặc một loại.

Công cụ sửa đổi truy cập là các từ khóa được sử dụng để chỉ định phạm vi khả năng truy cập của một thành viên của một loại hoặc chính loại đó. Ví dụ, một lớp công khai có thể truy cập được trên toàn thế giới, trong khi một lớp nội bộ chỉ có thể được truy cập bởi hội đồng. 

Tại sao nên sử dụng công cụ sửa đổi quyền truy cập?

Công cụ sửa đổi truy cập là một phần không thể thiếu trong lập trình hướng đối tượng. Công cụ sửa đổi truy cập được sử dụng để thực hiện đóng gói OOP. Ngoài ra, công cụ sửa đổi quyền truy cập cho phép bạn xác định ai có hoặc không có quyền truy cập vào một số tính năng nhất định.

Trong C#, có sáu loại Access Modifiers khác nhau:

bổ nghĩaSự miêu tả
công cộngKhông có hạn chế về việc truy cập các thành viên công khai.
riêng tưQuyền truy cập được giới hạn trong định nghĩa lớp. Đây là loại công cụ sửa đổi truy cập mặc định nếu không có loại nào được chỉ định chính thức
được bảo vệQuyền truy cập được giới hạn trong định nghĩa lớp và bất kỳ lớp nào kế thừa từ lớp
nội bộQuyền truy cập chỉ giới hạn ở các lớp được xác định trong cụm dự án hiện tại
nội bộ được bảo vệQuyền truy cập được giới hạn đối với hợp ngữ hiện tại và các loại bắt nguồn từ lớp chứa. Tất cả các thành viên trong dự án hiện tại và lớp dẫn xuất có thể truy cập các biến.
riêng tư được bảo vệQuyền truy cập được giới hạn đối với lớp chứa hoặc các kiểu bắt nguồn từ lớp chứa trong hợp ngữ hiện tại.

39. Phương thức ảo trong C# là gì?

Một phương thức ảo là một phương thức có thể được định nghĩa lại trong các lớp dẫn xuất. Một phương thức ảo có một triển khai trong một lớp cơ sở và một phương thức dẫn xuất từ ​​lớp đó. Nó được sử dụng khi chức năng cơ bản của một phương thức là giống nhau, nhưng đôi khi cần nhiều chức năng hơn trong lớp dẫn xuất. Một phương thức ảo được tạo trong lớp cơ sở có thể được ghi đè trong lớp dẫn xuất. Chúng tôi tạo một phương thức ảo trong lớp cơ sở bằng cách sử dụng từ khóa ảo và phương thức đó được ghi đè trong lớp dẫn xuất bằng cách sử dụng từ khóa ghi đè.

Khi một phương thức được khai báo là một phương thức ảo trong lớp cơ sở, nó có thể được định nghĩa trong lớp cơ sở và lớp dẫn xuất có thể ghi đè phương thức đó là tùy chọn. Phương thức ghi đè cũng cung cấp nhiều hơn một biểu mẫu cho một phương thức. Do đó, nó cũng là một ví dụ về tính đa hình.

Khi một phương thức được khai báo là một phương thức ảo trong lớp cơ sở và có cùng định nghĩa trong lớp dẫn xuất, thì không cần ghi đè lên nó trong lớp dẫn xuất. Nhưng khi một phương thức ảo có một định nghĩa khác trong lớp cơ sở và lớp dẫn xuất, thì cần phải ghi đè lên nó trong lớp dẫn xuất.

Khi một phương thức ảo được gọi, loại thời gian chạy của đối tượng được kiểm tra để tìm thành viên ghi đè. Đầu tiên, thành viên ghi đè trong lớp dẫn xuất nhất được gọi, có thể là thành viên ban đầu nếu không có lớp dẫn xuất nào ghi đè thành viên đó.

Phương pháp ảo

  1. Theo mặc định, các phương thức không ảo. Do đó, chúng tôi không thể ghi đè một phương thức không ảo.
  2. Chúng tôi không thể sử dụng công cụ sửa đổi ảo với các công cụ sửa đổi tĩnh, trừu tượng, riêng tư hoặc ghi đè.

40. Sự khác biệt giữa Array và ArrayList trong C# là gì?

Dưới đây là danh sách các khác biệt giữa hai:

Sửa chữa: Re: #40 -- ArrayList không sử dụng LinkedList -- nó sử dụng Array hỗ trợ thay đổi kích thước động. Xem ý kiến. 

41. Kiểu giá trị và kiểu tham chiếu trong C# là gì?

Trong C#, các kiểu dữ liệu có thể có hai loại, kiểu giá trị và kiểu tham chiếu. Các biến kiểu giá trị chứa trực tiếp đối tượng (hoặc dữ liệu) của chúng. Nếu chúng ta sao chép một biến kiểu giá trị sang một biến kiểu giá trị khác, chúng ta sẽ tạo một bản sao của biến đó cho biến thứ hai. Cả hai sẽ hoạt động độc lập trên các giá trị của chúng, các loại dữ liệu Loại giá trị được lưu trữ trên một ngăn xếp và các loại dữ liệu tham chiếu được lưu trữ trên một đống.

Trong C#, các kiểu dữ liệu cơ bản bao gồm int, char, bool và long, là các kiểu giá trị. Ngoài ra, các lớp và bộ sưu tập là các loại tham chiếu.

42. Tuần tự hóa trong C# là gì?

Tuần tự hóa trong C# chuyển đổi một đối tượng thành một luồng byte để lưu trữ đối tượng trong bộ nhớ, cơ sở dữ liệu hoặc tệp. Mục đích chính của nó là lưu trạng thái của một đối tượng để có thể tạo lại nó khi cần. Quá trình ngược lại được gọi là deserialization.

Có ba loại xê-ri hóa,

  1. Tuần tự hóa nhị phân (Lưu dữ liệu đối tượng của bạn thành định dạng nhị phân).
  2. 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 mạng).
  3. XmlSerialization (Lưu dữ liệu đối tượng của bạn vào tệp XML).

43. Bạn sử dụng câu lệnh “using” trong C# như thế nào?

Có hai cách để sử dụng từ khóa using trong C#. Một là như một chỉ thị, và một là như một tuyên bố. Hãy giải thích!

  1. sử dụng Chỉ thị

Nói chung, chúng tôi sử dụng từ khóa sử dụng để thêm các không gian tên trong các tệp mã phía sau và tệp lớp. Sau đó, nó cung cấp tất cả các lớp, giao diện và lớp trừu tượng cũng như các phương thức và thuộc tính của chúng trên trang hiện tại. Việc thêm một không gian tên có thể được thực hiện theo hai cách sau:

  1. Sử dụng Tuyên bố

Đây là một cách khác để sử dụng từ khóa using trong C#. Nó đóng một vai trò quan trọng trong việc cải thiện hiệu suất trong Bộ sưu tập rác.

44. Mảng lởm chởm trong C# là gì?

Mảng lởm chởm là mảng có các phần tử là mảng. Các phần tử của một mảng lởm chởm có thể có kích thước và kích thước khác nhau. Mảng lởm chởm đôi khi được gọi là "mảng của mảng".

Một kiểu mảng đặc biệt được giới thiệu trong C#. Mảng lởm chởm là một mảng của một mảng trong đó độ dài của mỗi chỉ số mảng có thể khác nhau.

Ví dụ

int[][] jagArray = new int[5][];

Trong khai báo trên, các hàng có kích thước cố định. Nhưng các cột không được chỉ định vì chúng có thể thay đổi.

Khai báo và khởi tạo mảng răng cưa.

int[][] jaggedArray = new int[5][];
jaggedArray[0] = new int[3];
jaggedArray[1] = new int[5];
jaggedArray[2] = new int[2];
jaggedArray[3] = new int[8];
jaggedArray[4] = new int[10];
jaggedArray[0] = new int[] { 3, 5, 7, };
jaggedArray[1] = new int[] { 1, 0, 2, 4, 6 };
jaggedArray[2] = new int[] { 1, 6 };
jaggedArray[3] = new int[] { 1, 0, 2, 4, 6, 45, 67, 78 };
jaggedArray[4] = new int[] { 1, 0, 2, 4, 6, 34, 54, 67, 87, 78 };

45. Đa luồng với .NET là gì?

Đa luồng cho phép một chương trình chạy đồng thời nhiều luồng. Bài viết này giải thích cách đa luồng hoạt động trong .NET. Bài viết này đề cập đến toàn bộ phạm vi của các khu vực luồng, từ tạo luồng, điều kiện chủng tộc, bế tắc, màn hình, mutexes, đồng bộ hóa, semaphores, v.v.

Việc sử dụng thực sự của một luồng không phải là về một luồng tuần tự đơn lẻ mà là sử dụng nhiều luồng trong một chương trình. Nhiều luồng chạy cùng lúc và thực hiện các tác vụ khác nhau được gọi là Đa luồng. Một luồng được coi là một quy trình nhẹ vì nó chạy trong ngữ cảnh của một chương trình và tận dụng các tài nguyên được phân bổ cho chương trình đó.

Một quy trình đơn luồng chỉ chứa một luồng, trong khi một quy trình đa luồng chứa nhiều hơn một luồng để thực thi.

46. ​​Kiểu ẩn danh trong C# là gì?

Các loại ẩn danh cho phép chúng tôi tạo các loại mới mà không cần xác định chúng. Đây là một cách xác định các thuộc tính chỉ đọc trong một đối tượng mà không cần phải xác định rõ ràng từng loại. Ở đây, Loại được tạo bởi trình biên dịch và chỉ có thể truy cập được đối với khối mã hiện tại. Loại thuộc tính cũng được trình biên dịch suy ra.

Chúng tôi có thể tạo các loại ẩn danh bằng cách sử dụng từ khóa “mới” và trình khởi tạo đối tượng. 

Ví dụ

var anonymousData = new
{
    ForeName = "Jignesh",
    SurName = "Trivedi"
};
Console.WriteLine("First Name : " + anonymousData.ForeName);

Các loại ẩn danh với ví dụ LINQ

Các loại ẩn danh cũng được sử dụng với mệnh đề "Chọn" của biểu thức truy vấn LINQ để trả về một tập hợp con các thuộc tính.

Ví dụ

Nếu bất kỳ bộ sưu tập đối tượng nào có các thuộc tính gọi FirstName, LastName, DOB, v.v... và bạn chỉ muốn FirstName và LastName sau khi Truy vấn dữ liệu, thì:

class MyData {
        public string FirstName {
            get;
            set;
        }
        public string LastName {
            get;
            set;
        }
        public DateTime DOB {
            get;
            set;
        }
        public string MiddleName {
            get;
            set;
        }
    }
    static void Main(string[] args) {
        // Create Dummy Data to fill Collection.
        List < MyData > data = new List < MyData > ();
        data.Add(new MyData {
            FirstName = "Jignesh", LastName = "Trivedi", MiddleName = "G", DOB = new DateTime(1990, 12, 30)
        });
        data.Add(new MyData {
            FirstName = "Tejas", LastName = "Trivedi", MiddleName = "G", DOB = new DateTime(1995, 11, 6)
        });
        data.Add(new MyData {
            FirstName = "Rakesh", LastName = "Trivedi", MiddleName = "G", DOB = new DateTime(1993, 10, 8)
        });
        data.Add(new MyData {
            FirstName = "Amit", LastName = "Vyas", MiddleName = "P", DOB = newDateTime(1983, 6, 15)
        });
        data.Add(new MyData {
            FirstName = "Yash", LastName = "Pandiya", MiddleName = "K", DOB = newDateTime(1988, 7, 20)
        });
    }
    var anonymousData = from pl in data
    select new {
        pl.FirstName, pl.LastName
    };
    foreach(var m in anonymousData) {
        Console.WriteLine("Name : " + m.FirstName + " " + m.LastName);
    }
}

47. Hashtable trong C# là gì?

Hashtable là một bộ sưu tập lưu trữ các cặp (Khóa, Giá trị). Ở đây, các Khóa được sử dụng để tìm vị trí lưu trữ, không thay đổi và không thể có các mục nhập trùng lặp trong Hashtable. .Net Framework đã cung cấp một lớp Bảng băm chứa tất cả các chức năng cần thiết để triển khai bảng băm mà không cần phát triển thêm. Bảng băm là một bộ sưu tập từ điển có mục đích chung. Mỗi mục trong bộ sưu tập là một đối tượng DictionaryEntry có hai thuộc tính: đối tượng khóa và đối tượng giá trị. Chúng được gọi là Khóa/Giá trị. Mã băm được tạo tự động khi các mục được thêm vào bảng băm. Mã này được ẩn từ nhà phát triển. Truy cập vào các giá trị của bảng đạt được bằng cách sử dụng đối tượng khóa để nhận dạng. Vì các mục trong bộ sưu tập được sắp xếp theo mã băm ẩn,

Bộ sưu tập Hashtable

Các thư viện Lớp cơ sở cung cấp Lớp Hashtable được xác định trong không gian tên System.Collections, vì vậy bạn không phải viết mã bảng băm của riêng mình. Thay vào đó, nó xử lý từng khóa của mã băm mà bạn thêm vào mỗi lần và sau đó sử dụng mã băm để tra cứu phần tử rất nhanh. Dung lượng của bảng băm là số phần tử mà bảng băm có thể chứa. Khi các phần tử được thêm vào bảng băm, dung lượng sẽ tự động tăng theo yêu cầu thông qua phân bổ lại. Nó là một loại .Net Framework cũ hơn.

Khai báo một Hashtable

Lớp Hashtable thường được tìm thấy trong không gian tên có tên System.Collections. Vì vậy, để thực hiện bất kỳ ví dụ nào, chúng ta phải thêm using System.Collections; đến mã nguồn. Tuyên bố cho Hashtable là:

Hashtable HT = new Hashtable ();

48. LINQ trong C# là gì?

LINQ là viết tắt của Truy vấn tích hợp ngôn ngữ. LINQ là một phương pháp truy vấn dữ liệu cung cấp khả năng cho các ngôn ngữ .NET với cú pháp tương tự như truy vấn SQL.

LINQ có sức mạnh tuyệt vời để truy vấ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 triển khai giao diện IEnumerable<T>.

Ưu điểm của LINQ 

  1. LINQ cung cấp một cách thức tích hợp ngôn ngữ, dựa trên đối tượng để truy vấn dữ liệu bất kể dữ liệu đó đến từ đâu. Vì vậy, thông qua LINQ, chúng ta có thể truy vấn cơ sở dữ liệu, XML và các bộ sưu tập. 
  2. Kiểm tra cú pháp thời gian biên dịch.

Nó cho phép bạn truy vấn các tập hợp như mảng, có thể liệt kê các lớp, v.v... bằng ngôn ngữ bản địa của ứng dụng của bạn, chẳng hạn như trong VB hoặc C#, giống như cách bạn truy vấn cơ sở dữ liệu bằng SQL.

ASP.NET

49. Xử lý tệp trong C#.Net là gì?

Không gian tên System.IO cung cấp bốn lớp cho phép bạn thao tác với các tệp riêng lẻ và tương tác với cấu trúc thư mục máy. Thư mục và Tệp mở rộng trực tiếp System.Object hỗ trợ tạo, sao chép, di chuyển và xóa tệp bằng nhiều phương thức tĩnh khác nhau. Tuy nhiên, chúng chỉ chứa các phương thức tĩnh và không bao giờ được khởi tạo. Các kiểu FileInfo và DirecotryInfo có nguồn gốc từ kiểu trừu tượng FileSystemInfo. Chúng thường được sử dụng để thu thập đầy đủ chi tiết của tệp hoặc thư mục vì các thành viên của chúng có xu hướng trả về các đối tượng được nhập mạnh. Chúng triển khai các phương thức công khai gần giống như Thư mục và Tệp, nhưng chúng có trạng thái và các thành viên của các lớp này không tĩnh.

ASP.NET

50. Phản chiếu trong C# là gì?

Phản ánh là quá trình khám phá loại thời gian chạy để kiểm tra siêu dữ liệu, mã CIL, ràng buộc muộn và mã tự tạo. Tại thời điểm chạy, bằng cách sử dụng phản chiếu, chúng ta có thể truy cập thông tin "loại" tương tự được hiển thị bởi tiện ích ildasm tại thời điểm thiết kế. Sự phản chiếu tương tự như kỹ thuật đảo ngược trong đó chúng ta có thể phá vỡ một tổ hợp .exe hoặc .dll hiện có để khám phá thông tin nội dung quan trọng đã xác định, bao gồm các phương thức, trường, sự kiện và thuộc tính.

Bạn có thể tự động khám phá tập hợp các giao diện được hỗ trợ bởi một loại nhất định bằng cách sử dụng không gian tên System.Reflection.

Sự phản chiếu thường được sử dụng để kết xuất danh sách các tập hợp đã tải, tham chiếu của chúng để kiểm tra các phương thức, thuộc tính, v.v. Phản chiếu cũng được sử dụng trong các công cụ phân tách bên ngoài như Reflector, Fxcop và NUnit vì các công cụ .NET không cần phân tích cú pháp mã nguồn, tương tự như C++. 

Điều tra siêu dữ liệu 

Chương trình sau đây mô tả quá trình phản ánh bằng cách tạo một ứng dụng dựa trên bảng điều khiển. Chương trình này sẽ hiển thị thông tin chi tiết về các trường, phương thức, thuộc tính và giao diện cho bất kỳ loại nào trong tập hợp mscorlib.dll. Trước khi tiếp tục, bắt buộc phải nhập "System.Reflection".

Ở đây, chúng tôi định nghĩa một số phương thức tĩnh trong lớp chương trình để liệt kê các trường, phương thức và giao diện theo kiểu đã chỉ định. Phương thức tĩnh nhận một tham số "System.Type" duy nhất và trả về khoảng trống.

static void FieldInvestigation(Type t) {
    Console.WriteLine("*********Fields*********");
    FieldInfo[] fld = t.GetFields();
    foreach(FieldInfo f in fld) {
        Console.WriteLine("-->{0}", f.Name);
    }
}

static void MethodInvestigation(Type t) {
    Console.WriteLine("*********Methods*********");
    MethodInfo[] mth = t.GetMethods();
    foreach(MethodInfo m in mth) {
        Console.WriteLine("-->{0}", m.Name);
    }

Bản tóm tắt

Tôi hy vọng 50 câu hỏi phỏng vấn C# này và câu trả lời của chúng sẽ giúp bạn vượt qua cuộc phỏng vấn C# và .NET tiếp theo. Dưới đây là một số câu hỏi phỏng vấn và câu trả lời.

Nguồn bài viết gốc tại: https://www.c-sharpcorner.com

#csharp 

What is GEEK

Buddha Community

50 câu hỏi và câu trả lời phỏng vấn C# phổ biến nhất
Phung Dang

Phung Dang

1678939676

50 câu hỏi và câu trả lời phỏng vấn C# phổ biến nhất

Trong bài viết C# này, chúng ta sẽ tìm hiểu về 50 câu hỏi và câu trả lời phỏng vấn C# phổ biến nhất. C# là một trong những ngôn ngữ lập trình phổ biến nhất và là ngôn ngữ goto để phát triển .NET. Vì vậy, nếu bạn là nhà phát triển .NET tham gia phỏng vấn .NET, bạn sẽ được hỏi các câu hỏi về lập trình C#. Dưới đây là 50 câu hỏi và câu trả lời phỏng vấn C# hàng đầu cho người mới bắt đầu và nhà phát triển C# chuyên nghiệp.

1. C# là gì? Và phiên bản mới nhất của C# là gì?

C# là một ngôn ngữ lập trình máy tính. Microsoft đã phát triển C# vào năm 2000 để cung cấp ngôn ngữ lập trình đa năng hiện đại có thể được sử dụng để phát triển tất cả các loại phần mềm nhắm mục tiêu đến các nền tảng khác nhau, bao gồm Windows, Web và Di động, chỉ sử dụng một ngôn ngữ lập trình. Ngày nay, C# là một trong những ngôn ngữ lập trình phổ biến nhất trên thế giới. Hàng triệu nhà phát triển phần mềm sử dụng C# để xây dựng mọi loại phần mềm. 

C# là ngôn ngữ chính để xây dựng các ứng dụng phần mềm Microsoft .NET. Các nhà phát triển có thể xây dựng hầu hết mọi loại phần mềm bằng C#, bao gồm ứng dụng Windows UI, ứng dụng bảng điều khiển, dịch vụ phụ trợ, API đám mây, dịch vụ Web, điều khiển và thư viện, ứng dụng serverless, ứng dụng Web, ứng dụng iOS và Android gốc, phần mềm AI và máy học, và các ứng dụng chuỗi khối.

C# cung cấp khả năng phát triển ứng dụng nhanh chóng với sự trợ giúp của Visual Studio IDE. C# là một ngôn ngữ lập trình hiện đại, hướng đối tượng, đơn giản, linh hoạt và hướng hiệu năng. C# được phát triển dựa trên các tính năng và trường hợp sử dụng tốt nhất của một số ngôn ngữ lập trình, bao gồm C++, Java, Pascal và SmallTalk. 

Cú pháp C# giống như C++. .NET và thư viện C# tương tự như Java. C# hỗ trợ các tính năng ngôn ngữ lập trình hướng đối tượng hiện đại, bao gồm Trừu tượng hóa, Đóng gói, Đa hình và Kế thừa. C# là một ngôn ngữ gõ mạnh. Hầu hết các kiểu trong .NET được kế thừa từ lớp Object.

C# hỗ trợ các khái niệm về lớp và đối tượng. Các lớp có các thành viên như trường, thuộc tính, sự kiện và phương thức. Đây là một bài viết chi tiết về C# và OOP. 

C# linh hoạt, hiện đại và hỗ trợ các nhu cầu lập trình hiện đại. Kể từ khi ra đời, ngôn ngữ C# đã trải qua nhiều lần nâng cấp. Phiên bản mới nhất của C# là C# 11.

2. Đối tượng trong C# là gì? 

Ngôn ngữ C# là ngôn ngữ lập trình hướng đối tượng. Các lớp là nền tảng của C#. Một lớp là một mẫu xác định cấu trúc dữ liệu và cách dữ liệu sẽ được lưu trữ, quản lý và truyền. Một lớp có các trường, thuộc tính, phương thức và các thành viên khác.

Trong khi các lớp là các khái niệm, các đối tượng là có thật. Các đối tượng được tạo bằng cách sử dụng các thể hiện của lớp. Một lớp định nghĩa kiểu của một đối tượng. Các đối tượng lưu trữ các giá trị thực trong bộ nhớ máy tính.

Bất kỳ thực thể nào trong thế giới thực có các đặc điểm nhất định hoặc có thể thực hiện một số công việc được gọi là Đối tượng. Đối tượng này còn được gọi là thể hiện, tức là bản sao của một thực thể trong ngôn ngữ lập trình. Các đối tượng là thể hiện của các lớp.

Ví dụ: chúng ta cần tạo một chương trình liên quan đến ô tô. Chúng ta cần tạo các thực thể cho ô tô. Hãy gọi nó là một lớp, Car. Một chiếc ô tô có bốn thuộc tính, tức là kiểu, loại, màu sắc và kích cỡ.

Để biểu diễn một chiếc ô tô trong lập trình, chúng ta có thể tạo một lớp Car với bốn thuộc tính Model, Type, Color và Size. Chúng được gọi là thành viên của một lớp. Một lớp có một số loại thành viên, hàm tạo, trường, thuộc tính, phương thức, đại biểu và sự kiện. Một thành viên lớp có thể là riêng tư, được bảo vệ hoặc công khai. Ngoài ra, vì các thuộc tính này có thể được truy cập bên ngoài lớp nên chúng có thể được công khai.

Một đối tượng là một thể hiện của một lớp. Một lớp có thể có nhiều thể hiện nếu cần. Ví dụ: Honda Civic là một thể hiện của Ô tô. Trong lập trình thực, Honda Civic là một đối tượng. Do đó, Honda Civic là một ví dụ của lớp Xe hơi. Các thuộc tính Model, Type, Color và Size của Honda Civic lần lượt là Civic, Honda, Red và 4. BMW 330, Toyota Carolla, Ford 350, Honda CR4, Honda Accord và Honda Pilot là một số ví dụ khác về các đối tượng của Car.

3. Mã được quản lý hoặc không được quản lý là gì? 

Mã được quản lý

“Mã được quản lý là mã được phát triển bằng .NET framework và các ngôn ngữ lập trình được hỗ trợ như C# hoặc VB.NET. Mã được quản lý được Common Language Runtime (CLR hoặc Runtime) trực tiếp thực thi và Runtime quản lý vòng đời của nó, bao gồm tạo đối tượng, cấp phát bộ nhớ và loại bỏ đối tượng. Bất kỳ ngôn ngữ nào được viết bằng .NET Framework đều là mã được quản lý".

Mã không được quản lý

Mã được phát triển bên ngoài .NET framework được gọi là 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à không được quản lý. Ví dụ: các ngôn ngữ như C hoặc C++ hoặc Visual Basic không được quản lý.

Các lập trình viên trực tiếp quản lý việc tạo đối tượng, thực thi và loại bỏ mã không được quản lý. Do đó, nếu các lập trình viên viết mã xấu, nó có thể dẫn đến rò rỉ bộ nhớ và phân bổ tài nguyên không mong muốn.”

.NET Framework cung cấp một cơ chế để mã không được quản lý được sử dụng trong mã được quản lý và ngược lại. Quá trình này được thực hiện với sự trợ giúp của các lớp bao bọc. 

4. Boxing và Unboxing trong C# là gì? 

Boxing và Unboxing đều được sử dụng để chuyển đổi loại.

Chuyển đổi từ loại giá trị sang loại tham chiếu được gọi là quyền anh. Boxing là một chuyển đổi ngầm. Đây là một ví dụ về quyền anh trong C#.

// Boxing
int anum = 123;
Object obj = anum;
Console.WriteLine(anum);
Console.WriteLine(obj);

Chuyển đổi từ loại tham chiếu sang loại giá trị được gọi là mở hộp. Đây là một ví dụ về unboxing trong C#.

// Unboxing
Object obj2 = 123;
int anum2 = (int)obj;
Console.WriteLine(anum2);
Console.WriteLine(obj);

5. Sự khác biệt giữa cấu trúc và lớp trong C# là gì? 

Lớp và cấu trúc đều là kiểu dữ liệu do người dùng định nghĩa nhưng có một số điểm khác biệt chính:

cấu trúc

  • Cấu trúc là một loại giá trị trong C# và kế thừa từ System.Value Type.
  • Cấu trúc thường được sử dụng cho lượng dữ liệu nhỏ hơn.
  • Cấu trúc không thể được kế thừa từ các loại khác.
  • Một cấu trúc không thể trừu tượng.
  • Không cần tạo đối tượng với từ khóa new.
  • Không có quyền tạo bất kỳ hàm tạo mặc định nào.

Lớp học

  • Lớp này là một kiểu tham chiếu trong C# và nó kế thừa từ Kiểu System.Object.
  • Các lớp thường được sử dụng cho một lượng lớn dữ liệu.
  • Các lớp có thể được kế thừa từ các lớp khác.
  • Một lớp có thể là một kiểu trừu tượng.
  • Chúng ta có thể tạo một hàm tạo mặc định.

Đọc các bài viết sau để tìm hiểu thêm về cấu trúc so với lớp,  Sự khác biệt về cấu trúc và lớp trong C#

6. Sự khác biệt giữa Giao diện và Lớp trừu tượng trong C# là gì? 

Dưới đây là một số khác biệt phổ biến giữa giao diện và lớp trừu tượng trong C#.

  • Một lớp có thể thực hiện bất kỳ số lượng giao diện nào, nhưng một lớp con nhiều nhất chỉ có thể sử dụng một lớp trừu tượng.
  • Một lớp trừu tượng có thể có các phương thức không trừu tượng (các phương thức cụ thể), trong khi trong trường hợp của giao diện, tất cả các phương thức phải là trừu tượng.
  • Một lớp trừu tượng có thể khai báo hoặc sử dụng bất kỳ biến nào, trong khi một giao diện không thể làm như vậy.
  • Trong một lớp trừu tượng, tất cả các thành viên dữ liệu hoặc chức năng là riêng tư theo mặc định, trong khi ở một giao diện, tất cả đều công khai; chúng tôi không thể thay đổi chúng theo cách thủ công.
  • Trong một lớp trừu tượng, chúng ta cần sử dụng các từ khóa trừu tượng để khai báo các phương thức trừu tượng; trong một giao diện, chúng ta không cần điều đó.
  • Một lớp trừu tượng không thể được sử dụng cho nhiều kế thừa, trong khi giao diện có thể được sử dụng cho nhiều kế thừa.
  • Một lớp trừu tượng sử dụng một hàm tạo, trong khi chúng ta không có bất kỳ hàm tạo nào trong một giao diện.

Để tìm hiểu thêm về sự khác biệt giữa lớp trừu tượng và giao diện, hãy truy cập  Lớp trừu tượng so với Giao diện .  

7. Một enum trong C# là gì? 

Một enum là một loại giá trị với một tập hợp các hằng số có tên liên quan, thường được gọi là danh sách liệt kê. 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 nguyên thủy do người dùng định nghĩa.

Kiểu enum có thể là số nguyên (float, int, byte, double, v.v.). Nhưng nếu bạn sử dụng nó bên cạnh int, thì nó phải được truyền.

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 là loại enum. Do đó, phải có một giá trị số cho mỗi loại enum.

Kiểu mặc định cơ bản của phần tử liệt kê là int. Theo mặc định, điều tra viên đầu tiên có giá trị 0 và giá trị của mỗi điều tra viên kế tiếp được tăng thêm 1. 

enum Dow {Sat, Sun, Mon, Tue, Wed, Thu, Fri};

Một số điểm về enum,

  • Enums là kiểu dữ liệu liệt kê trong C#.
  • Enums không dành cho người dùng cuối. Chúng dành cho các nhà phát triển.
  • Enums là hằng số được gõ mạnh. Chúng được gõ mạnh, nghĩa là, một enum của một loại có thể không được gán hoàn toàn cho một enum của loại khác mặc dù giá trị cơ bản của các thành viên của chúng là như nhau.
  • Bảng liệt kê (enums) 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 chuỗi và được xử lý dưới dạng số nguyên.
  • Loại mặc định là int và các loại được phê duyệt là byte, sbyte, short, ushort, uint, long và ulong.
  • Mỗi loại enum tự động xuất phát từ System.Enum, và do đó, chúng ta có thể sử dụng các phương thức System.Enum trên enum.
  • Enums là các loại giá trị được tạo trên ngăn xếp, không phải đống.

8. Sự khác biệt giữa câu lệnh “tiếp tục” và “ngắt” trong C# là gì? 

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

Ví dụ: Tuyên bố phá vỡ

using System;
using System.Collections;
using System.Linq;
using System.Text;
namespace break_example {
    Class brk_stmt {
        public static void main(String[] args) {
            for (int i = 0; i <= 5; i++) {
                if (i == 4) {
                    break;
                }
                Console.WriteLine("The number is " + i);
                Console.ReadLine();
            }
        }
    }
}

đầu ra 

Số là 0; 

Số là 1; 

Số là 2; 

Số là 3;

Ví dụ: Tuyên bố tiếp tục

using System;
using System.Collections;
using System.Linq;
using System.Text;
namespace continue_example {
Class cntnu_stmt {
public static void main(String[] {
        for (int i = 0; i <= 5; i++) {
            if (i == 4) {
                continue;
            }
            Console.WriteLine("The number is "+ i);
                Console.ReadLine();
            }
        }
    }
}

đầu ra

Số là 1;

Số là 2;

Số là 3;

Số là 5;

9. Sự khác biệt giữa hằng số và chỉ đọc trong C# là gì?

Const không là gì ngoài "hằng số", một biến có giá trị không đổi nhưng tại thời điểm biên dịch. Do đó, bắt buộc phải gán giá trị cho nó. Theo mặc định, const là tĩnh và chúng ta không thể thay đổi giá trị của biến const trong toàn bộ chương trình.

Readonly là từ khóa mà giá trị của nó chúng ta có thể thay đổi trong thời gian chạy hoặc gán nó trong thời gian chạy nhưng chỉ thông qua hàm tạo không tĩnh.

Ví dụ

Chúng tôi có một Lớp kiểm tra trong đó chúng tôi có hai biến, một là chỉ đọc và biến còn lại là hằng số.

class Test {
    readonly int read = 10;
    const int cons = 10;
    public Test() {
        read = 100;
        cons = 100;
    }
    public void Check() {
        Console.WriteLine("Read only : {0}", read);
        Console.WriteLine("const : {0}", cons);
    }
}

Ở đây, tôi đã cố gắng thay đổi giá trị của cả hai biến trong hàm tạo, nhưng khi tôi cố gắng thay đổi hằng số, nó báo lỗi thay đổi giá trị của chúng trong khối mà tôi phải gọi trong thời gian chạy.

ASP.NET

Cuối cùng, xóa dòng mã đó khỏi lớp và gọi hàm Check() này như trong đoạn mã sau:

class Program {
    static void Main(string[] args) {
        Test obj = new Test();
        obj.Check();
        Console.ReadLine();
    }
}
class Test {
    readonly int read = 10;
    const int cons = 10;
    public Test() {
        read = 100;
    }
    public void Check() {
        Console.WriteLine("Read only : {0}", read);
        Console.WriteLine("const : {0}", cons);
    }
}

đầu ra

ASP.NET 

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

Từ khóa ref chuyển các đối số theo tham chiếu. Do đó, bất kỳ thay đổi nào được thực hiện đối với đối số này trong phương thức sẽ được phản ánh trong biến đó khi điều khiển quay lại phương thức gọi.

Từ khóa out chuyển các đối số theo tham chiếu. Điều này rất giống với từ khóa ref.

ASP.NET

Để tìm hiểu thêm về từ khóa ref và out, hãy đọc bài viết sau:  Ref Vs. Ra từ khóa trong C#

11. Có thể sử dụng “this” trong một phương thức tĩnh không?

Chúng ta không thể sử dụng 'this' trong một phương thức tĩnh vì từ khóa 'this' trả về một tham chiếu đến thể hiện hiện tại của lớp chứa nó. Các phương thức tĩnh (hoặc bất kỳ thành viên tĩnh nào) không thuộc về một thể hiện cụ thể. Chúng tồn tại mà không cần tạo một thể hiện của lớp và được gọi với tên của một lớp chứ không phải theo thể hiện, 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 tĩnh. Tuy nhiên, trong trường hợp Phương thức mở rộng, chúng ta có thể sử dụng các tham số của phương thức.

Chúng ta hãy xem từ khóa “this”.

Từ khóa "this" trong C# là một loại biến tham chiếu đặc biệt được định nghĩa hoàn toàn bên trong mỗi hàm tạo và phương thức không tĩnh là tham số đầu tiên của lớp loại mà nó được định nghĩa.

12. Thuộc tính trong C# là gì?

Trong C#, thuộc tính là thành viên của lớp cung cấp cách đọc, ghi hoặc tính toán giá trị của trường riêng. Nó hiển thị một giao diện chung để truy cập và sửa đổi dữ liệu được lưu trữ trong một lớp đồng thời cho phép lớp duy trì quyền kiểm soát đối với cách dữ liệu đó được truy cập và thao tác.

Các thuộc tính được khai báo bằng cách sử dụng bộ truy cập get và set, xác định hành vi để nhận hoặc đặt giá trị thuộc tính. Bộ truy cập get truy xuất giá trị của thuộc tính, trong khi bộ truy cập set đặt giá trị của thuộc tính. Một thuộc tính có thể có một hoặc cả hai bộ truy cập, tùy thuộc vào việc nó là chỉ đọc, chỉ ghi hay đọc-ghi.

Ví dụ, hãy xem xét một lớp Người có tên trường riêng. Sau đó, một Tên thuộc tính có thể được tạo để cung cấp quyền truy cập vào trường này như thế này.

class Person
{
    private string name;

    public string Name
    {
        get { return name; }
        set { name = value; }
    }
}

Thuộc tính này cho phép trường tên được truy cập từ bên ngoài lớp, nhưng chỉ thông qua các phương thức thuộc tính. Điều này cung cấp một mức đóng gói và kiểm soát cách dữ liệu được truy cập và sửa đổi.

Các thuộc tính trong C# là một phần thiết yếu của lập trình hướng đối tượng và được sử dụng rộng rãi trong các ứng dụng để cung cấp một cách rõ ràng và an toàn để truy cập và sửa đổi dữ liệu lớp.

Tìm hiểu thêm tại đây: Thuộc tính trong C#

13. Phương thức mở rộng trong C# là gì?

Trong C#, một phương thức mở rộng là một phương thức tĩnh được sử dụng để mở rộng chức năng của một kiểu hiện có mà không sửa đổi kiểu ban đầu hoặc tạo một kiểu dẫn xuất mới. Các phương thức mở rộng cho phép các nhà phát triển thêm các phương thức vào các loại hiện có, chẳng hạn như các lớp, cấu trúc, giao diện, enum, v.v., không được xác định ban đầu trong các loại đó.

Các phương thức mở rộng được khai báo trong một lớp tĩnh và được định nghĩa là các phương thức tĩnh với tham số đầu tiên đặc biệt được gọi là tham số "this". Tham số "this" chỉ định loại được mở rộng và cho phép phương thức mở rộng được gọi như thể nó là một phương thức thể hiện của loại đó.

Ví dụ: hãy xem xét phương thức mở rộng sau để mở rộng kiểu chuỗi bằng cách cung cấp phương thức viết hoa chữ cái đầu tiên của chuỗi:

public static class StringExtensions
{
    public static string CapitalizeFirstLetter(this string str)
    {
        if (string.IsNullOrEmpty(str))
            return str;
        return char.ToUpper(str[0]) + str.Substring(1);
    }
}

Với phương thức mở rộng này, phương thức CapitalizeFirstLetter có thể được gọi trên bất kỳ đối tượng chuỗi nào như sau:

string s = "hello world";
string capitalized = s.CapitalizeFirstLetter(); // "Hello world"

Lưu ý rằng phương thức CapitalizeFirstLetter không được định nghĩa trong lớp chuỗi mà là một phương thức mở rộng được cung cấp bởi lớp StringExtensions.

Các phương thức mở rộng là một tính năng mạnh mẽ trong C# cho phép các nhà phát triển thêm chức năng mới vào các loại hiện có một cách dễ dàng và được sử dụng rộng rãi trong các ứng dụng để đơn giản hóa mã và cải thiện khả năng đọc mã.

Bạn có thể đọc các bài viết này,  Phương pháp mở rộng trong C# , để biết thêm chi tiết về các phương pháp mở rộng.

14. Sự khác biệt giữa Dispose và Finalize trong C# là gì?

Trong C#, cả hai phương thức Vứt bỏ và Hoàn thiện đều được sử dụng để giải phóng tài nguyên, nhưng chúng phục vụ các mục đích và hành vi khác nhau.

Phương pháp Vứt bỏ giải phóng các tài nguyên không được quản lý, chẳng hạn như xử lý tệp hoặc kết nối cơ sở dữ liệu, không được quản lý tự động bởi thời gian chạy .NET. Nó thường được triển khai trong một lớp triển khai giao diện IDis Dùng, định nghĩa phương thức Vứt bỏ.

Phương thức Vứt bỏ được mã máy khách gọi một cách rõ ràng để giải phóng tài nguyên khi chúng không còn cần thiết. Nó có thể được gọi hoàn toàn bằng cách sử dụng câu lệnh, đảm bảo rằng phương thức Vứt bỏ được gọi khi đối tượng vượt ra ngoài phạm vi.

Mặt khác, phương thức Finalize được sử dụng để thực hiện các thao tác dọn dẹp trên một đối tượng ngay trước khi nó được thu gom rác. Do đó, nó thường được triển khai trong một lớp ghi đè phương thức Object.Finalize.

Trình thu gom rác gọi phương thức Hoàn thiện, phương thức này sẽ tự động quản lý bộ nhớ của các đối tượng .NET, để giải phóng các tài nguyên không được quản lý chưa được giải phóng rõ ràng bằng phương thức Vứt bỏ.

Sự khác biệt chính giữa hai phương thức là phương thức Vứt bỏ là xác định và có thể được gọi một cách rõ ràng bằng mã máy khách. Ngược lại, phương thức Finalize không xác định và được gọi bởi trình thu gom rác vào thời điểm không xác định.

Điều quan trọng cần lưu ý là các đối tượng triển khai phương thức Vứt bỏ cũng nên triển khai phương thức Hoàn thiện như một cơ chế dự phòng trong trường hợp mã máy khách không gọi phương thức Vứt bỏ.

Tóm lại, phương pháp Vứt bỏ được sử dụng để giải phóng các tài nguyên không được quản lý một cách xác định. Ngược lại, phương thức Hoàn thiện được sử dụng như một cơ chế dự phòng để giải phóng các tài nguyên không được quản lý khi đối tượng được thu gom rác.

15. Đâu là sự khác biệt giữa String và StringBuilder trong C#?

StringBuilder và chuỗi được sử dụng cho các giá trị chuỗi, nhưng cả hai đều có nhiều điểm khác biệt trên cơ sở tạo cá thể và hiệu suất.

Sợi dây

Một chuỗi là một đối tượng bất biến. Bất biến là khi chúng ta tạo các đối tượng chuỗi trong mã để chúng ta không thể sửa đổi hoặc thay đổi đối tượng đó trong bất kỳ thao tác nào như chèn giá trị mới hoặc thay thế hoặc nối thêm bất kỳ giá trị nào với giá trị hiện có trong đối tượng chuỗi. Khi chúng ta phải thực hiện một số thao tác để thay đổi một chuỗi, đơn giản là nó sẽ loại bỏ giá trị cũ của đối tượng chuỗi và nó sẽ tạo một thể hiện mới trong bộ nhớ để giữ giá trị mới trong đối tượng chuỗi, ví dụ:

ASP.NET

Ghi chú

  • Đó là một đối tượng bất biến chứa giá trị chuỗi.
  • Về mặt hiệu suất, một chuỗi chậm vì nó tạo một phiên bản mới để ghi đè hoặc thay đổi giá trị trước đó.
  • Chuỗi thuộc về không gian tên Hệ thống.

StringBuilder

System.Text.StringBuilder là một đối tượng có thể thay đổi chứa giá trị chuỗi; có thể thay đổi có nghĩa là khi chúng ta tạo một đối tượng System.Text.Stringbuilder. Chúng ta có thể sử dụng đối tượng này cho bất kỳ hoạt động nào, chẳng hạn như chèn giá trị vào một chuỗi hiện có bằng các hàm chèn và thay thế hoặc nối thêm mà không cần tạo một phiên bản mới của System.Text.StringBuilder cho mọi lần, vì vậy, đối tượng này đang sử dụng đối tượng trước đó. Bằng cách đó, nó hoạt động nhanh hơn so với System.String. Hãy xem một ví dụ để hiểu System.Text.StringBuilder. 

ASP.NET

Ghi chú

  • StringBuilder là một đối tượng có thể thay đổi.
  • Xét về hiệu suất, StringBuilder rất nhanh vì nó sẽ sử dụng cùng một thể hiện của đối tượng StringBuilder để thực hiện bất kỳ thao tác nào, chẳng hạn như chèn một giá trị vào chuỗi hiện có.
  • StringBuilder thuộc về không gian tên System.Text.

16. Công dụng của delegate trong C# là gì?

Đại biểu là sự trừu tượng hóa của một hoặc nhiều con trỏ hàm (như đã tồn tại trong C++; giải thích về điều này nằm ngoài phạm vi của bài viết này). .NET đã triển khai khái niệm con trỏ hàm dưới dạng đại biểu. Với các đại biểu, bạn có thể coi một hàm là dữ liệu. Người đại diện cho phép các hàm được truyền dưới dạng tham số, được trả về từ hàm dưới dạng giá trị và được lưu trữ trong một mảng. Đại biểu có các đặc điểm sau:

  • Các đại biểu có nguồn gốc từ lớp System.MulticastDelegate.
  • Họ có một chữ ký và một loại trả lại. Chức năng được thêm vào người đại diện phải tương thích với chữ ký này.
  • Các đại biểu có thể trỏ đến các phương thức tĩnh hoặc cá thể.
  • Khi một đối tượng ủy nhiệm đã được tạo, nó có thể tự động gọi các phương thức mà nó trỏ tới khi chạy.
  • Các đại biểu có thể gọi các phương thức đồng bộ và không đồng bộ.

Đại biểu chứa một vài trường hữu ích. Cái đầu tiên chứa một tham chiếu đến một đối tượng và cái thứ hai chứa một con trỏ phương thức. Khi gọi đại biểu, phương thức thể hiện được gọi trên tham chiếu được chứa. Tuy nhiên, nếu tham chiếu đối tượng là null, thì bộ thực thi hiểu điều này có nghĩa là phương thức này là một phương thức tĩnh. Hơn nữa, gọi một đại biểu về mặt cú pháp cũng giống như gọi một hàm thông thường. Do đó, các đại biểu là hoàn hảo để thực hiện các cuộc gọi lại.

Tại sao chúng ta cần đại biểu?

Trước đây, API Windows thường xuyên sử dụng các con trỏ hàm kiểu C để tạo các hàm gọi lại. Sử dụng một cuộc gọi lại, các lập trình viên có thể định cấu hình một chức năng để báo cáo lại cho một chức năng khác trong ứng dụng. Vì vậy, mục tiêu của việc sử dụng gọi lại là để xử lý các hoạt động bấm nút, chọn menu và di chuyển chuột. Nhưng vấn đề với cách tiếp cận truyền thống này là các chức năng gọi lại không an toàn về kiểu. Trong .NET framework, vẫn có thể gọi lại bằng cách sử dụng các đại biểu với cách tiếp cận hiệu quả hơn. Tuy nhiên, các đại biểu duy trì ba phần thông tin quan trọng:

  • Các tham số của phương thức.
  • Địa chỉ của phương thức mà nó gọi.
  • Kiểu trả về của phương thức.

Một đại biểu là một giải pháp cho các tình huống mà bạn muốn chuyển các phương thức cho các phương thức khác. Bạn đã quá quen với việc truyền dữ liệu cho phương thức dưới dạng tham số nên ý tưởng truyền phương thức làm đối số thay vì dữ liệu nghe có vẻ lạ. Tuy nhiên, có những trường hợp bạn có một phương thức thực hiện một việc nào đó, chẳng hạn như gọi một số phương thức khác. Tại thời điểm biên dịch, bạn không biết phương thức thứ hai này là gì. Thông tin đó chỉ có sẵn trong thời gian chạy. Do đó, Đại biểu là thiết bị để khắc phục những phức tạp như vậy.

17. Các lớp niêm phong trong C# là gì?

Các lớp niêm phong được sử dụng để hạn chế tính năng kế thừa của lập trình hướng đối tượng. Khi một lớp được định nghĩa là lớp niêm phong, lớp đó không thể được kế thừa. 

Trong C#, công cụ sửa đổi niêm phong định nghĩa một lớp là niêm phong. Trong Visual Basic .NET, từ khóa Không kế thừa phục vụ mục đích của lớp niêm phong. Trình biên dịch sẽ đưa ra lỗi nếu một lớp được dẫn xuất từ ​​một lớp đã niêm phong. 

Nếu bạn đã từng nhận thấy, các cấu trúc được niêm phong. Bạn không thể lấy được một lớp từ một cấu trúc. 

Định nghĩa lớp sau định nghĩa một lớp kín trong C#:

// Sealed class
sealed class SealedClass
{
}

18. Lớp từng phần là gì?

Một phần lớp chỉ được sử dụng để phân chia định nghĩa của một lớp thành hai hoặc nhiều lớp trong cùng một tệp mã nguồn hoặc nhiều hơn một tệp nguồn. Bạn có thể tạo một định nghĩa lớp trong nhiều tệp, tệp này sẽ được biên dịch thành một lớp trong thời gian chạy. Ngoài ra, khi bạn tạo một thể hiện 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ả các tệp nguồn có cùng đối tượng.

Partial Classes có thể được tạo trong cùng một không gian tên. Tuy nhiên, không thể tạo một phần lớp trong một không gian tên khác. Vì vậy, hãy sử dụng từ khóa “partial” với tất cả các tên lớp mà bạn muốn liên kết với cùng tên của một lớp trong cùng một không gian tên. Hãy xem một ví dụ:

ASP.NET 

19. Sự khác biệt giữa boxing và unboxing trong C# là gì?

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

quyền anh

Quyền anh đang chuyển đổi loại dữ liệu loại giá trị thành đối tượng hoặc bất kỳ loại dữ liệu giao diện nào được triển khai bởi loại giá trị này. Ví dụ: khi các hộp CLR, một giá trị có nghĩa là khi CLR chuyển đổi một loại giá trị thành Loại đối tượng, nó sẽ 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. 

Ví dụ

ASP.NET

Mở hộp** **

Mở hộp cũng là một quá trình để trích xuất loại giá trị từ đối tượng hoặc bất kỳ loại giao diện đã triển khai nào. Quyền anh có thể được thực hiện ngầm, nhưng việc mở hộp phải rõ ràng bằng mã. 

Ví dụ:** **

 ASP.NET

Khái niệm boxing và unboxing làm cơ sở cho quan điểm thống nhất của C# về hệ thống kiểu trong đó một giá trị thuộc bất kỳ kiểu nào cũng có thể được coi là một đối tượng.

20. IEnumerable<> trong C# là gì?

IEnumerable là giao diện chính cho tất cả các bộ sưu tập không chung chung trong không gian tên System.Collections như ArrayList, HastTable, v.v. có thể được liệt kê. Phiên bản chung của giao diện này là IEnumerable<T>, một giao diện mẹ của tất cả các lớp bộ sưu tập chung trong không gian tên System.Collections.Generic như Danh sách<> và hơn thế nữa. 

Trong System.Collections.Generic.IEnumerable<T> chỉ có một phương thức duy nhất là GetEnumerator(), phương thức này trả về một IEnumerator. IEnumerator cung cấp khả năng lặp qua bộ sưu tập bằng cách hiển thị thuộc tính Hiện tại và các phương thức Di chuyển Tiếp theo và Đặt lại nếu chúng ta không có giao diện này với tư cách là cha mẹ, vì vậy chúng ta không thể sử dụng phép lặp bằng vòng lặp foreach hoặc không thể sử dụng đối tượng lớp đó trong truy vấn LINQ của chúng tôi.

ASP.NET 

21. Sự khác biệt giữa ràng buộc muộn và sớm trong C# là gì?

Khái niệm Early Binding và Late Binding thuộc tính đa hình trong C#. Tính đa hình là tính năng của lập trình hướng đối tượng cho phép một ngôn ngữ sử dụng cùng một tên ở các dạng khác nhau. Ví dụ: một phương thức có tên Add có thể cộng các số nguyên, số nhân đôi và số thập phân.

Đa hình chúng ta có hai loại khác nhau để đạt được: 

  • Thời gian biên dịch còn được gọi là Ràng buộc sớm hoặc Quá tải.
  • Thời gian chạy còn được gọi là ràng buộc muộn hoặc ghi đè.

Biên dịch đa hình thời gian hoặc ràng buộc sớm** **

Trong Compile time polymorphism hay Early Binding, chúng ta sẽ sử dụng nhiều phương thức có cùng tên nhưng khác loại tham số hoặc có thể là số lượng tham số. Do đó, chúng ta có thể thực hiện các tác vụ khác nhau với cùng một tên phương thức trong cùng một lớp, còn được gọi là Nạp chồng phương thức.

Xem cách chúng ta có thể làm điều đó trong ví dụ sau:

ASP.NET 

Đa hình thời gian chạy hoặc ràng buộc muộn

Đa hình thời gian chạy còn được gọi là ràng buộc muộn. Trong Run Time Polymorphism hoặc Late Binding, chúng ta có thể sử dụng cùng tên phương thức với cùng chữ ký, nghĩa là cùng loại hoặc số lượng tham số, nhưng không cùng lớp vì trình biên dịch không cho phép điều đó tại thời điểm biên dịch. Do đó, chúng ta có thể sử dụng liên kết đó trong thời gian chạy trong lớp dẫn xuất khi một đối tượng lớp con hoặc lớp dẫn xuất được khởi tạo. Đó là lý do tại sao chúng tôi gọi nó là Ràng buộc muộn. Chúng ta phải tạo các hàm lớp cha của tôi dưới dạng một phần và trong trình điều khiển hoặc lớp con dưới dạng các hàm ghi đè bằng từ khóa ghi đè. 

Ví dụ

ASP.NET 

22. Sự khác biệt giữa IEnumerable và IQueryable là gì?

Trước khi chúng ta đi vào sự khác biệt, hãy tìm hiểu IEnumerable và IQueryable là gì.

IEnumerable

Nó là giao diện chính cho tất cả các bộ sưu tập không chung chung trong không gian tên System.Collections như ArrayList, HastTable, v.v. có thể được liệt kê. Phiên bản chung của giao diện này là IEnumerable<T>, một giao diện mẹ của tất cả các lớp bộ sưu tập chung trong không gian tên System.Collections.Generic, như Danh sách<> và hơn thế nữa. 

Có thể truy vấn** **

Theo MSDN, giao diện IQueryable dành cho các nhà cung cấp truy vấn triển khai. Do đó, nó chỉ nên được triển khai bởi các nhà cung cấp cũng triển khai IQueryable<T>. Nếu nhà cung cấp cũng không triển khai IQueryable<T>, thì không thể sử dụng toán tử truy vấn tiêu chuẩn trên nguồn dữ liệu của nhà cung cấp.

Giao diện IQueryable kế thừa giao diện IEnumerable để nếu nó đại diện cho một truy vấn, thì kết quả của truy vấn đó có thể được liệt kê. Việc liệt kê làm cho cây biểu thức được liên kết với một đối tượng IQueryable được thực thi. Định nghĩa "thực thi cây biểu thức" dành riêng cho nhà cung cấp truy vấn. Ví dụ: nó có thể liên quan đến việc dịch cây biểu thức sang ngôn ngữ truy vấn thích hợp cho nguồn dữ liệu cơ bản. Các truy vấn không trả về vô số kết quả được thực thi khi phương thức Execute được gọi.

ASP.NET 

23. Điều gì xảy ra nếu các giao diện kế thừa có tên phương thức xung đột?

Chúng ta không cần định nghĩa tất cả nếu triển khai nhiều giao diện trong cùng một lớp với các tên phương thức xung đột. Nói cách khác, chúng ta có thể nói nếu chúng ta có các phương thức xung đột trong cùng một lớp, chúng ta không thể triển khai phần thân của chúng một cách độc lập trong cùng một lớp vì cùng tên và cùng chữ ký. Do đó, chúng ta phải sử dụng tên giao diện trước tên phương thức để loại bỏ việc tịch thu phương thức này. Hãy xem một ví dụ:

interface testInterface1 {
    void Show();
}
interface testInterface2 {
    void Show();
}
class Abc: testInterface1,
    testInterface2 {
        void testInterface1.Show() {
            Console.WriteLine("For testInterface1 !!");
        }
        void testInterface2.Show() {
            Console.WriteLine("For testInterface2 !!");
        }
    }

Bây giờ hãy xem cách sử dụng chúng trong một lớp học:

class Program {
    static void Main(string[] args) {
        testInterface1 obj1 = new Abc();
        testInterface1 obj2 = new Abc();
        obj1.Show();
        obj2.Show();
        Console.ReadLine();
    }
}

đầu ra

ASP.NET 

24. Mảng trong C# là gì?

Trong C#, chỉ số mảng bắt đầu từ số không. Điều đó có nghĩa là mục đầu tiên của một mảng bắt đầu ở vị trí thứ 0. Do đó, vị trí của mục cuối cùng trên một mảng sẽ có tổng số mục - 1. Vì vậy, nếu một mảng có mười mục thì mục thứ 10 trước đó nằm ở vị trí thứ 9. 

Trong C#, mảng có thể được khai báo là độ dài cố định hoặc động.

Một  mảng có độ dài cố định  có thể lưu trữ một số mục được xác định trước.

Một  mảng động  không có kích thước được xác định trước. Thay vào đó, kích thước của một  mảng động  tăng lên khi bạn thêm các mục mới vào mảng. Bạn có thể khai báo mảng có độ dài cố định hoặc động. Bạn thậm chí có thể thay đổi một mảng động thành tĩnh sau khi nó được xác định.

Chúng ta hãy xem các khai báo đơn giản của mảng trong C#. Đoạn mã sau định nghĩa mảng động đơn giản nhất gồm các kiểu số nguyên không có kích thước cố định.

int[] intArray;

Như bạn có thể thấy từ đoạn mã trên, phần khai báo của một mảng bắt đầu bằng một loại mảng theo sau là dấu ngoặc vuông ([]) và tên của mảng.

Đoạn mã sau khai báo một mảng chỉ có thể lưu trữ năm mục, bắt đầu từ chỉ mục 0 đến 4. 

int[] intArray;
intArray = new int[5];

 Đoạn mã sau khai báo một mảng có thể lưu trữ 100 mục từ chỉ số 0 đến 99. 

int[] intArray;
intArray = new int[100];

25. Constructor Chaining trong C# là gì? 

Constructor chaining là một cách để kết nối hai hoặc nhiều lớp trong một mối quan hệ dưới dạng Kế thừa. Trong Constructor Chaining, mọi hàm tạo của lớp con được ánh xạ ngầm tới một Trình tạo của lớp cha bởi từ khóa cơ sở, vì vậy khi bạn tạo một thể hiện của lớp con, nó sẽ gọi Trình tạo của lớp cha. Không có nó, việc kế thừa là không thể.

26. Sự khác biệt giữa Array.CopyTo() và Array.Clone() là gì?

Phương thức Array.Clone() tạo một bản sao nông của một mảng. Một bản sao nông của Mảng chỉ sao chép các phần tử của Mảng, cho dù là kiểu tham chiếu hay kiểu giá trị, nhưng nó không sao chép các đối tượng mà tham chiếu đề cập đến. Các tham chiếu trong Mảng mới trỏ đến cùng các đối tượng như trong Mảng ban đầu.

Phương thức tĩnh CopyTo() của lớp Array sao chép một phần của một mảng sang một mảng khác. Phương thức CopyTo sao chép tất cả các phần tử của một mảng sang một mảng một chiều khác. Ví dụ, mã được liệt kê trong Liệt kê chín sao chép nội dung của một mảng số nguyên sang các loại đối tượng khác nhau. 

27. Có thể thực thi Nhiều khối Catch trong C# không? 

Chúng ta có thể sử dụng nhiều khối catch với câu lệnh try. Điều này là do mỗi khối bắt có thể bắt một ngoại lệ khác nhau. Ví dụ mã sau đây cho thấy cách triển khai nhiều câu lệnh bắt với một câu lệnh thử.

using System;
class MyClient {
    public static void Main() {
        int x = 0;
        int div = 0;
        try {
            div = 100 / x;
            Console.WriteLine("Not executed line");
        } catch (DivideByZeroException de) {
            Console.WriteLine("DivideByZeroException");
        } catch (Exception ee) {
            Console.WriteLine("Exception");
        } finally {
            Console.WriteLine("Finally Block");
        }
        Console.WriteLine("Result is {0}", div);
    }
}

28. Mẫu thiết kế Singleton là gì và cách triển khai nó trong C#?

Mẫu thiết kế Singleton là một mẫu thiết kế sáng tạo đảm bảo rằng một lớp chỉ có một thể hiện và cung cấp một điểm truy cập toàn cầu cho thể hiện đó. Ngoài ra, mẫu này kiểm soát việc tạo đối tượng, giới hạn số lượng phiên bản có thể được tạo thành một phiên bản duy nhất, được chia sẻ trong toàn bộ ứng dụng.

Trong một triển khai Singleton điển hình, lớp Singleton có một hàm tạo riêng để ngăn việc khởi tạo trực tiếp và một phương thức tĩnh trả về một thể hiện duy nhất của lớp. Lần đầu tiên phương thức tĩnh được gọi, nó tạo một thể hiện mới của lớp và lưu trữ nó trong một biến tĩnh riêng. Các cuộc gọi tiếp theo đến phương thức tĩnh trả về cùng một thể hiện.

Ví dụ, hãy xem xét Kết nối cơ sở dữ liệu lớp Singleton được sử dụng để quản lý kết nối cơ sở dữ liệu. Lớp học có thể được thực hiện như thế này:

public class DatabaseConnection
{
    private static DatabaseConnection instance;
    private DatabaseConnection() { }

    public static DatabaseConnection GetInstance()
    {
        if (instance == null)
            instance = new DatabaseConnection();
        return instance;
    }

    // Database connection methods
    public void Connect() { /* ... */ }
    public void Disconnect() { /* ... */ }
}

Trong triển khai này, phương thức GetInstance được sử dụng để tạo hoặc truy xuất một thể hiện duy nhất của lớp. Hàm tạo là riêng tư, vì vậy lớp không thể được khởi tạo trực tiếp từ bên ngoài lớp.

Singletons được sử dụng rộng rãi trong các ứng dụng để quản lý tài nguyên tốn kém để tạo hoặc có tính khả dụng hạn chế, chẳng hạn như kết nối cơ sở dữ liệu, ổ cắm mạng, hệ thống ghi nhật ký, v.v.

Điều quan trọng cần lưu ý là các lớp Singleton có thể đưa ra các vấn đề tiềm ẩn như trạng thái toàn cầu và khó khăn khi kiểm tra đơn vị, vì vậy chúng nên được sử dụng cẩn thận và chỉ khi cần thiết.

29. Sự khác biệt giữa Throw Exception và Throw khoản 

Sự khác biệt cơ bản là ngoại lệ Ném sẽ ghi đè lên dấu vết ngăn xếp. Thật khó để tìm ra số dòng mã ban đầu đã đưa ra ngoại lệ.

Ném về cơ bản giữ lại thông tin ngăn xếp và thêm vào thông tin ngăn xếp trong trường hợp ngoại lệ mà nó được ném.

Hãy xem ý nghĩa của nó để hiểu rõ hơn về sự khác biệt. Tôi đang sử dụng một ứng dụng bảng điều khiển để dễ dàng kiểm tra và xem cách sử dụng của hai ứng dụng này khác nhau như thế nào về chức năng của chúng.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace TestingThrowExceptions {
    class Program {
        public void ExceptionMethod() {
            throw new Exception("Original Exception occurred in ExceptionMethod");
        }
        static void Main(string[] args) {
            Program p = new Program();
            try {
                p.ExceptionMethod();
            } catch (Exception ex) {
                throw ex;
            }
        }
    }

Bây giờ hãy chạy mã bằng cách nhấn phím F5 và xem điều gì sẽ xảy ra. Nó trả về một ngoại lệ và xem dấu vết ngăn xếp.

30. Bộ chỉ mục trong C# là gì?

C# giới thiệu một khái niệm mới gọi là Bộ chỉ mục, được sử dụng để coi một đối tượng là một mảng. Các bộ chỉ mục thường được gọi là mảng thông minh trong C#. Tuy nhiên, chúng không phải là một phần thiết yếu của lập trình hướng đối tượng.

Định nghĩa một bộ chỉ mục cho phép bạn tạo các lớp hoạt động như các mảng ảo. Sau đó, các thể hiện của lớp đó có thể được truy cập bằng cách sử dụng toán tử truy cập mảng [].

Tạo một bộ lập chỉ mục

< modifier > <
return type > this[argument list] {
    get {
        // your get block code
    }
    set {
        // your set block code
    }
}

Trong đoạn mã trên,

<công cụ sửa đổi>

Nó có thể là riêng tư, công khai, được bảo vệ hoặc nội bộ.

<kiểu trả về>

Nó có thể là bất kỳ loại C# hợp lệ nào.

31. Đại biểu multicast trong C# là gì?

Đại biểu là một trong những loại cơ sở trong .NET. Đại biểu là một lớp được sử dụng để tạo và gọi các đại biểu trong thời gian chạy.

Một đại biểu trong C# cho phép các nhà phát triển coi các phương thức như các đối tượng và gọi chúng từ mã của họ.

Thực hiện ví dụ về đại biểu Multicast:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
delegate void MDelegate();
class DM {
    static public void Display() {
        Console.WriteLine("Meerut");
    }
    static public void print() {
        Console.WriteLine("Roorkee");
    }
}
class MTest {
    public static void Main() {
        MDelegate m1 = new MDelegate(DM.Display);
        MDelegate m2 = new MDelegate(DM.print);
        MDelegate m3 = m1 + m2;
        MDelegate m4 = m2 + m1;
        MDelegate m5 = m3 - m2;
        m3();
        m4();
        m5();
    }
}

32. Sự khác biệt giữa Toán tử đẳng thức (==) và Phương thức Equals() trong C

Toán tử == và phương thức Equals() so sánh hai mục dữ liệu loại giá trị hoặc mục dữ liệu loại tham chiếu. Toán tử đẳng thức (==) là toán tử so sánh và phương thức Equals() so sánh nội dung của một chuỗi. Toán tử == so sánh danh tính tham chiếu trong khi phương thức Equals() chỉ so sánh nội dung. Hãy xem một số ví dụ.

Trong ví dụ này, chúng tôi đã gán một biến chuỗi cho một biến khác. Một chuỗi là một loại tham chiếu. Vì vậy, trong ví dụ sau, một biến chuỗi được gán cho một biến chuỗi khác, đề cập đến cùng một danh tính trong một đống và cả hai đều có cùng nội dung. Do đó, bạn nhận được đầu ra True cho các phương thức == Operator và Equals().

using System;
namespace ComparisionExample {
    class Program {
        static void Main(string[] args) {
            string name = "sandeep";
            string myName = name;
            Console.WriteLine("== operator result is {0}", name == myName);
            Console.WriteLine("Equals method result is {0}", name.Equals(myName));
            Console.ReadKey();
        }
    }
}

33. Sự khác nhau giữa toán tử Is và As trong C#

toán tử "là"

Trong ngôn ngữ C#, chúng ta sử dụng toán tử "is" để kiểm tra loại đối tượng. Nếu hai đối tượng cùng loại, nó trả về true; mặt khác, nó trả về false.

Hãy hiểu điều này trong mã C# của chúng tôi. Đầu tiên chúng ta khai báo 2 class là Speaker và Author.

class Speaker {
    public string Name {
        get;
        set;
    }
}
class Author {
    public string Name {
        get;
        set;
    }
}

Bây giờ, hãy tạo một đối tượng kiểu Loa:

var speaker = new Speaker { Name="Gaurav Kumar Arora"};

Bây giờ, hãy kiểm tra xem đối tượng có phải là Loa không:

var isTrue = speaker is Speaker;

Trong phần trước, chúng tôi đang kiểm tra loại khớp. Vì vậy, vâng, diễn giả của chúng tôi là một đối tượng của loại Diễn giả.

Console.WriteLine("speaker is of Speaker type:{0}", isTrue);

Vì vậy, kết quả là đúng.

Nhưng, ở đây chúng tôi nhận được sai:

var author = new Author { Name = "Gaurav Kumar Arora" };
var isTrue = speaker is Author;
Console.WriteLine("speaker is of Author type:{0}", isTrue);

Bởi vì diễn giả của chúng tôi không phải là một đối tượng của loại Tác giả.

toán tử "như"

Toán tử "as" hoạt động tương tự như toán tử "is". Sự khác biệt duy nhất là nó trả về đối tượng nếu cả hai đều tương thích với loại đó. Khác nó trả về một giá trị rỗng.

Hãy hiểu điều này trong mã C# của chúng tôi.

public static string GetAuthorName(dynamic obj)
{
    Author authorObj = obj as Author;
    return (authorObj != null) ? authorObj.Name : string.Empty;
}

Chúng tôi có một phương thức chấp nhận một đối tượng động và trả về thuộc tính tên đối tượng nếu đối tượng thuộc loại Tác giả. 

Ở đây, chúng tôi đã khai báo hai đối tượng:

var speaker = new Speaker { Name="Gaurav Kumar Arora"};
var author = new Author { Name = "Gaurav Kumar Arora" };

Sau đây trả về thuộc tính "Tên":

var authorName = GetAuthorName(author);
Console.WriteLine("Author name is:{0}", authorName);

Nó trả về một chuỗi rỗng:

authorName = GetAuthorName(speaker);
Console.WriteLine("Author name is:{0}", authorName);

34. Cách sử dụng các kiểu Nullable<> trong C#?

Loại nullable là loại dữ liệu chứa loại dữ liệu đã xác định hoặc giá trị null.

Khái niệm loại nullable này không tương thích với "var."

Bất kỳ kiểu dữ liệu nào cũng có thể được khai báo là kiểu nullable với sự trợ giúp của toán tử "?". 

Ví dụ: đoạn mã sau khai báo int 'i' là null.

int? i = null;

Như đã thảo luận trong phần trước, "var" không tương thích với các loại nullable. Vì vậy, nếu bạn khai báo như sau, bạn sẽ gặp lỗi.

var? i = null;

35. Các cách khác nhau mà một Phương thức có thể được Quá tải là gì?

Quá tải phương thức là một cách để đạt được tính đa hình thời gian biên dịch, nơi chúng ta có thể sử dụng một phương thức có cùng tên nhưng khác chữ ký. Ví dụ: ví dụ mã sau đây có một khối lượng phương thức với ba chữ ký khác nhau dựa trên số lượng và loại tham số cũng như giá trị trả về.

Ví dụ

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Hello_Word {
    class overloding {
        public static void Main() {
            Console.WriteLine(volume(10));
            Console.WriteLine(volume(2.5F, 8));
            Console.WriteLine(volume(100L, 75, 15));
            Console.ReadLine();
        }

        static int volume(int x) {
            return (x * x * x);
        }

        static double volume(float r, int h) {
            return (3.14 * r * r * h);
        }

        static long volume(long l, int b, int h) {
            return (l * b * h);
        }
    }
}

Ghi chú 

Giả sử chúng ta có một phương thức với hai loại đối tượng tham số và phương thức cùng tên với hai tham số nguyên khi chúng ta gọi phương thức đó với một giá trị int. Trong trường hợp đó, nó sẽ gọi phương thức đó với tham số nguyên thay vì phương thức tham số kiểu đối tượng.

36. Nhóm đối tượng trong .Net là gì?

Nhóm đối tượng trong .NET cho phép các đối tượng giữ trong nhóm bộ nhớ để các đối tượng có thể được sử dụng lại mà không cần tạo lại chúng. Bài viết này giải thích gộp đối tượng là gì trong .NET và cách triển khai gộp đối tượng trong C#.

Nó có nghĩa là gì?

Nhóm đối tượng là nơi chứa các đối tượng đã sẵn sàng để sử dụng. Bất cứ khi nào có yêu cầu cho một đối tượng mới, người quản lý nhóm sẽ nhận yêu cầu, yêu cầu này sẽ được phục vụ bằng cách phân bổ một đối tượng từ nhóm.

Làm thế nào nó hoạt động?

Chúng ta sẽ sử dụng Factory pattern cho mục đích này. Chúng ta sẽ có một phương thức xuất xưởng, phương thức này sẽ đảm nhận việc tạo các đối tượng. Bất cứ khi nào có yêu cầu cho một đối tượng mới, phương thức xuất xưởng sẽ xem xét nhóm đối tượng (chúng tôi sử dụng đối tượng Queue). Nếu có bất kỳ đối tượng nào có sẵn trong giới hạn cho phép, nó sẽ trả về đối tượng đó (đối tượng giá trị). Nếu không, một đối tượng mới sẽ được tạo và trả lại cho bạn.

37. Generics trong C# là gì?

Generics cho phép bạn trì hoãn việc xác định 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ó đượ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.

Bạn viết các đặc tả cho lớp hoặc phương thức, với các tham số thay thế cho các kiểu dữ liệu. Khi trình biên dịch gặp một hàm tạo cho lớp hoặc lệnh gọi hàm cho phương thức, nó sẽ tạo mã để xử lý kiểu dữ liệu cụ thể.

ASP.NET

Các lớp và phương thức chung kết hợp khả năng sử dụng lại, an toàn kiểu và hiệu quả theo cách mà các đối tác không chung chung của chúng không thể làm được. Generics được sử dụng thường xuyên nhất với các bộ sưu tập và các phương thức hoạt động trên chúng. Phiên bản 2.0 của thư viện lớp .NET Framework cung cấp một không gian tên mới, System.Collections.Generic chứa một số lớp bộ sưu tập dựa trên chung mới. Chúng tôi khuyên rằng tất cả các ứng dụng nhắm mục tiêu .NET Framework 2.0 trở lên nên sử dụng các lớp bộ sưu tập chung mới thay vì các đối tác không chung chung cũ hơn, chẳng hạn như ArrayList.

Đặc điểm của Generics

Generics là một kỹ thuật làm phong phú chương trình của bạn theo những cách sau:

  • Đầu tiên, nó giúp bạn tối đa hóa việc sử dụng lại mã, an toàn loại và hiệu suất.
  • Bạn có thể tạo các lớp bộ sưu tập chung. Thư viện lớp .NET Framework chứa một số lớp bộ sưu tập chung mới trong không gian tên System.Collections.Generic. Bạn có thể sử dụng các lớp tập hợp chung này thay vì các lớp tập hợp trong không gian tên System.Collections.
  • Bạn có thể tạo các giao diện, lớp, phương thức, sự kiện và đại biểu chung của riêng mình.
  • Bạn có thể tạo các lớp chung bị ràng buộc để cho phép truy cập vào các phương thức trên các kiểu dữ liệu cụ thể.
  • Bạn có thể nhận được thông tin về các loại được sử dụng trong một loại dữ liệu chung trong thời gian chạy bằng cách sử dụng sự phản chiếu.

38. Mô tả Accessibility Modifiers trong C

Công cụ sửa đổi truy cập là các từ khóa được sử dụng để chỉ định khả năng truy cập được khai báo của một thành viên hoặc một loại.

Công cụ sửa đổi truy cập là các từ khóa được sử dụng để chỉ định phạm vi khả năng truy cập của một thành viên của một loại hoặc chính loại đó. Ví dụ, một lớp công khai có thể truy cập được trên toàn thế giới, trong khi một lớp nội bộ chỉ có thể được truy cập bởi hội đồng. 

Tại sao nên sử dụng công cụ sửa đổi quyền truy cập?

Công cụ sửa đổi truy cập là một phần không thể thiếu trong lập trình hướng đối tượng. Công cụ sửa đổi truy cập được sử dụng để thực hiện đóng gói OOP. Ngoài ra, công cụ sửa đổi quyền truy cập cho phép bạn xác định ai có hoặc không có quyền truy cập vào một số tính năng nhất định.

Trong C#, có sáu loại Access Modifiers khác nhau:

bổ nghĩaSự miêu tả
công cộngKhông có hạn chế về việc truy cập các thành viên công khai.
riêng tưQuyền truy cập được giới hạn trong định nghĩa lớp. Đây là loại công cụ sửa đổi truy cập mặc định nếu không có loại nào được chỉ định chính thức
được bảo vệQuyền truy cập được giới hạn trong định nghĩa lớp và bất kỳ lớp nào kế thừa từ lớp
nội bộQuyền truy cập chỉ giới hạn ở các lớp được xác định trong cụm dự án hiện tại
nội bộ được bảo vệQuyền truy cập được giới hạn đối với hợp ngữ hiện tại và các loại bắt nguồn từ lớp chứa. Tất cả các thành viên trong dự án hiện tại và lớp dẫn xuất có thể truy cập các biến.
riêng tư được bảo vệQuyền truy cập được giới hạn đối với lớp chứa hoặc các kiểu bắt nguồn từ lớp chứa trong hợp ngữ hiện tại.

39. Phương thức ảo trong C# là gì?

Một phương thức ảo là một phương thức có thể được định nghĩa lại trong các lớp dẫn xuất. Một phương thức ảo có một triển khai trong một lớp cơ sở và một phương thức dẫn xuất từ ​​lớp đó. Nó được sử dụng khi chức năng cơ bản của một phương thức là giống nhau, nhưng đôi khi cần nhiều chức năng hơn trong lớp dẫn xuất. Một phương thức ảo được tạo trong lớp cơ sở có thể được ghi đè trong lớp dẫn xuất. Chúng tôi tạo một phương thức ảo trong lớp cơ sở bằng cách sử dụng từ khóa ảo và phương thức đó được ghi đè trong lớp dẫn xuất bằng cách sử dụng từ khóa ghi đè.

Khi một phương thức được khai báo là một phương thức ảo trong lớp cơ sở, nó có thể được định nghĩa trong lớp cơ sở và lớp dẫn xuất có thể ghi đè phương thức đó là tùy chọn. Phương thức ghi đè cũng cung cấp nhiều hơn một biểu mẫu cho một phương thức. Do đó, nó cũng là một ví dụ về tính đa hình.

Khi một phương thức được khai báo là một phương thức ảo trong lớp cơ sở và có cùng định nghĩa trong lớp dẫn xuất, thì không cần ghi đè lên nó trong lớp dẫn xuất. Nhưng khi một phương thức ảo có một định nghĩa khác trong lớp cơ sở và lớp dẫn xuất, thì cần phải ghi đè lên nó trong lớp dẫn xuất.

Khi một phương thức ảo được gọi, loại thời gian chạy của đối tượng được kiểm tra để tìm thành viên ghi đè. Đầu tiên, thành viên ghi đè trong lớp dẫn xuất nhất được gọi, có thể là thành viên ban đầu nếu không có lớp dẫn xuất nào ghi đè thành viên đó.

Phương pháp ảo

  1. Theo mặc định, các phương thức không ảo. Do đó, chúng tôi không thể ghi đè một phương thức không ảo.
  2. Chúng tôi không thể sử dụng công cụ sửa đổi ảo với các công cụ sửa đổi tĩnh, trừu tượng, riêng tư hoặc ghi đè.

40. Sự khác biệt giữa Array và ArrayList trong C# là gì?

Dưới đây là danh sách các khác biệt giữa hai:

Sửa chữa: Re: #40 -- ArrayList không sử dụng LinkedList -- nó sử dụng Array hỗ trợ thay đổi kích thước động. Xem ý kiến. 

41. Kiểu giá trị và kiểu tham chiếu trong C# là gì?

Trong C#, các kiểu dữ liệu có thể có hai loại, kiểu giá trị và kiểu tham chiếu. Các biến kiểu giá trị chứa trực tiếp đối tượng (hoặc dữ liệu) của chúng. Nếu chúng ta sao chép một biến kiểu giá trị sang một biến kiểu giá trị khác, chúng ta sẽ tạo một bản sao của biến đó cho biến thứ hai. Cả hai sẽ hoạt động độc lập trên các giá trị của chúng, các loại dữ liệu Loại giá trị được lưu trữ trên một ngăn xếp và các loại dữ liệu tham chiếu được lưu trữ trên một đống.

Trong C#, các kiểu dữ liệu cơ bản bao gồm int, char, bool và long, là các kiểu giá trị. Ngoài ra, các lớp và bộ sưu tập là các loại tham chiếu.

42. Tuần tự hóa trong C# là gì?

Tuần tự hóa trong C# chuyển đổi một đối tượng thành một luồng byte để lưu trữ đối tượng trong bộ nhớ, cơ sở dữ liệu hoặc tệp. Mục đích chính của nó là lưu trạng thái của một đối tượng để có thể tạo lại nó khi cần. Quá trình ngược lại được gọi là deserialization.

Có ba loại xê-ri hóa,

  1. Tuần tự hóa nhị phân (Lưu dữ liệu đối tượng của bạn thành định dạng nhị phân).
  2. 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 mạng).
  3. XmlSerialization (Lưu dữ liệu đối tượng của bạn vào tệp XML).

43. Bạn sử dụng câu lệnh “using” trong C# như thế nào?

Có hai cách để sử dụng từ khóa using trong C#. Một là như một chỉ thị, và một là như một tuyên bố. Hãy giải thích!

  1. sử dụng Chỉ thị

Nói chung, chúng tôi sử dụng từ khóa sử dụng để thêm các không gian tên trong các tệp mã phía sau và tệp lớp. Sau đó, nó cung cấp tất cả các lớp, giao diện và lớp trừu tượng cũng như các phương thức và thuộc tính của chúng trên trang hiện tại. Việc thêm một không gian tên có thể được thực hiện theo hai cách sau:

  1. Sử dụng Tuyên bố

Đây là một cách khác để sử dụng từ khóa using trong C#. Nó đóng một vai trò quan trọng trong việc cải thiện hiệu suất trong Bộ sưu tập rác.

44. Mảng lởm chởm trong C# là gì?

Mảng lởm chởm là mảng có các phần tử là mảng. Các phần tử của một mảng lởm chởm có thể có kích thước và kích thước khác nhau. Mảng lởm chởm đôi khi được gọi là "mảng của mảng".

Một kiểu mảng đặc biệt được giới thiệu trong C#. Mảng lởm chởm là một mảng của một mảng trong đó độ dài của mỗi chỉ số mảng có thể khác nhau.

Ví dụ

int[][] jagArray = new int[5][];

Trong khai báo trên, các hàng có kích thước cố định. Nhưng các cột không được chỉ định vì chúng có thể thay đổi.

Khai báo và khởi tạo mảng răng cưa.

int[][] jaggedArray = new int[5][];
jaggedArray[0] = new int[3];
jaggedArray[1] = new int[5];
jaggedArray[2] = new int[2];
jaggedArray[3] = new int[8];
jaggedArray[4] = new int[10];
jaggedArray[0] = new int[] { 3, 5, 7, };
jaggedArray[1] = new int[] { 1, 0, 2, 4, 6 };
jaggedArray[2] = new int[] { 1, 6 };
jaggedArray[3] = new int[] { 1, 0, 2, 4, 6, 45, 67, 78 };
jaggedArray[4] = new int[] { 1, 0, 2, 4, 6, 34, 54, 67, 87, 78 };

45. Đa luồng với .NET là gì?

Đa luồng cho phép một chương trình chạy đồng thời nhiều luồng. Bài viết này giải thích cách đa luồng hoạt động trong .NET. Bài viết này đề cập đến toàn bộ phạm vi của các khu vực luồng, từ tạo luồng, điều kiện chủng tộc, bế tắc, màn hình, mutexes, đồng bộ hóa, semaphores, v.v.

Việc sử dụng thực sự của một luồng không phải là về một luồng tuần tự đơn lẻ mà là sử dụng nhiều luồng trong một chương trình. Nhiều luồng chạy cùng lúc và thực hiện các tác vụ khác nhau được gọi là Đa luồng. Một luồng được coi là một quy trình nhẹ vì nó chạy trong ngữ cảnh của một chương trình và tận dụng các tài nguyên được phân bổ cho chương trình đó.

Một quy trình đơn luồng chỉ chứa một luồng, trong khi một quy trình đa luồng chứa nhiều hơn một luồng để thực thi.

46. ​​Kiểu ẩn danh trong C# là gì?

Các loại ẩn danh cho phép chúng tôi tạo các loại mới mà không cần xác định chúng. Đây là một cách xác định các thuộc tính chỉ đọc trong một đối tượng mà không cần phải xác định rõ ràng từng loại. Ở đây, Loại được tạo bởi trình biên dịch và chỉ có thể truy cập được đối với khối mã hiện tại. Loại thuộc tính cũng được trình biên dịch suy ra.

Chúng tôi có thể tạo các loại ẩn danh bằng cách sử dụng từ khóa “mới” và trình khởi tạo đối tượng. 

Ví dụ

var anonymousData = new
{
    ForeName = "Jignesh",
    SurName = "Trivedi"
};
Console.WriteLine("First Name : " + anonymousData.ForeName);

Các loại ẩn danh với ví dụ LINQ

Các loại ẩn danh cũng được sử dụng với mệnh đề "Chọn" của biểu thức truy vấn LINQ để trả về một tập hợp con các thuộc tính.

Ví dụ

Nếu bất kỳ bộ sưu tập đối tượng nào có các thuộc tính gọi FirstName, LastName, DOB, v.v... và bạn chỉ muốn FirstName và LastName sau khi Truy vấn dữ liệu, thì:

class MyData {
        public string FirstName {
            get;
            set;
        }
        public string LastName {
            get;
            set;
        }
        public DateTime DOB {
            get;
            set;
        }
        public string MiddleName {
            get;
            set;
        }
    }
    static void Main(string[] args) {
        // Create Dummy Data to fill Collection.
        List < MyData > data = new List < MyData > ();
        data.Add(new MyData {
            FirstName = "Jignesh", LastName = "Trivedi", MiddleName = "G", DOB = new DateTime(1990, 12, 30)
        });
        data.Add(new MyData {
            FirstName = "Tejas", LastName = "Trivedi", MiddleName = "G", DOB = new DateTime(1995, 11, 6)
        });
        data.Add(new MyData {
            FirstName = "Rakesh", LastName = "Trivedi", MiddleName = "G", DOB = new DateTime(1993, 10, 8)
        });
        data.Add(new MyData {
            FirstName = "Amit", LastName = "Vyas", MiddleName = "P", DOB = newDateTime(1983, 6, 15)
        });
        data.Add(new MyData {
            FirstName = "Yash", LastName = "Pandiya", MiddleName = "K", DOB = newDateTime(1988, 7, 20)
        });
    }
    var anonymousData = from pl in data
    select new {
        pl.FirstName, pl.LastName
    };
    foreach(var m in anonymousData) {
        Console.WriteLine("Name : " + m.FirstName + " " + m.LastName);
    }
}

47. Hashtable trong C# là gì?

Hashtable là một bộ sưu tập lưu trữ các cặp (Khóa, Giá trị). Ở đây, các Khóa được sử dụng để tìm vị trí lưu trữ, không thay đổi và không thể có các mục nhập trùng lặp trong Hashtable. .Net Framework đã cung cấp một lớp Bảng băm chứa tất cả các chức năng cần thiết để triển khai bảng băm mà không cần phát triển thêm. Bảng băm là một bộ sưu tập từ điển có mục đích chung. Mỗi mục trong bộ sưu tập là một đối tượng DictionaryEntry có hai thuộc tính: đối tượng khóa và đối tượng giá trị. Chúng được gọi là Khóa/Giá trị. Mã băm được tạo tự động khi các mục được thêm vào bảng băm. Mã này được ẩn từ nhà phát triển. Truy cập vào các giá trị của bảng đạt được bằng cách sử dụng đối tượng khóa để nhận dạng. Vì các mục trong bộ sưu tập được sắp xếp theo mã băm ẩn,

Bộ sưu tập Hashtable

Các thư viện Lớp cơ sở cung cấp Lớp Hashtable được xác định trong không gian tên System.Collections, vì vậy bạn không phải viết mã bảng băm của riêng mình. Thay vào đó, nó xử lý từng khóa của mã băm mà bạn thêm vào mỗi lần và sau đó sử dụng mã băm để tra cứu phần tử rất nhanh. Dung lượng của bảng băm là số phần tử mà bảng băm có thể chứa. Khi các phần tử được thêm vào bảng băm, dung lượng sẽ tự động tăng theo yêu cầu thông qua phân bổ lại. Nó là một loại .Net Framework cũ hơn.

Khai báo một Hashtable

Lớp Hashtable thường được tìm thấy trong không gian tên có tên System.Collections. Vì vậy, để thực hiện bất kỳ ví dụ nào, chúng ta phải thêm using System.Collections; đến mã nguồn. Tuyên bố cho Hashtable là:

Hashtable HT = new Hashtable ();

48. LINQ trong C# là gì?

LINQ là viết tắt của Truy vấn tích hợp ngôn ngữ. LINQ là một phương pháp truy vấn dữ liệu cung cấp khả năng cho các ngôn ngữ .NET với cú pháp tương tự như truy vấn SQL.

LINQ có sức mạnh tuyệt vời để truy vấ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 triển khai giao diện IEnumerable<T>.

Ưu điểm của LINQ 

  1. LINQ cung cấp một cách thức tích hợp ngôn ngữ, dựa trên đối tượng để truy vấn dữ liệu bất kể dữ liệu đó đến từ đâu. Vì vậy, thông qua LINQ, chúng ta có thể truy vấn cơ sở dữ liệu, XML và các bộ sưu tập. 
  2. Kiểm tra cú pháp thời gian biên dịch.

Nó cho phép bạn truy vấn các tập hợp như mảng, có thể liệt kê các lớp, v.v... bằng ngôn ngữ bản địa của ứng dụng của bạn, chẳng hạn như trong VB hoặc C#, giống như cách bạn truy vấn cơ sở dữ liệu bằng SQL.

ASP.NET

49. Xử lý tệp trong C#.Net là gì?

Không gian tên System.IO cung cấp bốn lớp cho phép bạn thao tác với các tệp riêng lẻ và tương tác với cấu trúc thư mục máy. Thư mục và Tệp mở rộng trực tiếp System.Object hỗ trợ tạo, sao chép, di chuyển và xóa tệp bằng nhiều phương thức tĩnh khác nhau. Tuy nhiên, chúng chỉ chứa các phương thức tĩnh và không bao giờ được khởi tạo. Các kiểu FileInfo và DirecotryInfo có nguồn gốc từ kiểu trừu tượng FileSystemInfo. Chúng thường được sử dụng để thu thập đầy đủ chi tiết của tệp hoặc thư mục vì các thành viên của chúng có xu hướng trả về các đối tượng được nhập mạnh. Chúng triển khai các phương thức công khai gần giống như Thư mục và Tệp, nhưng chúng có trạng thái và các thành viên của các lớp này không tĩnh.

ASP.NET

50. Phản chiếu trong C# là gì?

Phản ánh là quá trình khám phá loại thời gian chạy để kiểm tra siêu dữ liệu, mã CIL, ràng buộc muộn và mã tự tạo. Tại thời điểm chạy, bằng cách sử dụng phản chiếu, chúng ta có thể truy cập thông tin "loại" tương tự được hiển thị bởi tiện ích ildasm tại thời điểm thiết kế. Sự phản chiếu tương tự như kỹ thuật đảo ngược trong đó chúng ta có thể phá vỡ một tổ hợp .exe hoặc .dll hiện có để khám phá thông tin nội dung quan trọng đã xác định, bao gồm các phương thức, trường, sự kiện và thuộc tính.

Bạn có thể tự động khám phá tập hợp các giao diện được hỗ trợ bởi một loại nhất định bằng cách sử dụng không gian tên System.Reflection.

Sự phản chiếu thường được sử dụng để kết xuất danh sách các tập hợp đã tải, tham chiếu của chúng để kiểm tra các phương thức, thuộc tính, v.v. Phản chiếu cũng được sử dụng trong các công cụ phân tách bên ngoài như Reflector, Fxcop và NUnit vì các công cụ .NET không cần phân tích cú pháp mã nguồn, tương tự như C++. 

Điều tra siêu dữ liệu 

Chương trình sau đây mô tả quá trình phản ánh bằng cách tạo một ứng dụng dựa trên bảng điều khiển. Chương trình này sẽ hiển thị thông tin chi tiết về các trường, phương thức, thuộc tính và giao diện cho bất kỳ loại nào trong tập hợp mscorlib.dll. Trước khi tiếp tục, bắt buộc phải nhập "System.Reflection".

Ở đây, chúng tôi định nghĩa một số phương thức tĩnh trong lớp chương trình để liệt kê các trường, phương thức và giao diện theo kiểu đã chỉ định. Phương thức tĩnh nhận một tham số "System.Type" duy nhất và trả về khoảng trống.

static void FieldInvestigation(Type t) {
    Console.WriteLine("*********Fields*********");
    FieldInfo[] fld = t.GetFields();
    foreach(FieldInfo f in fld) {
        Console.WriteLine("-->{0}", f.Name);
    }
}

static void MethodInvestigation(Type t) {
    Console.WriteLine("*********Methods*********");
    MethodInfo[] mth = t.GetMethods();
    foreach(MethodInfo m in mth) {
        Console.WriteLine("-->{0}", m.Name);
    }

Bản tóm tắt

Tôi hy vọng 50 câu hỏi phỏng vấn C# này và câu trả lời của chúng sẽ giúp bạn vượt qua cuộc phỏng vấn C# và .NET tiếp theo. Dưới đây là một số câu hỏi phỏng vấn và câu trả lời.

Nguồn bài viết gốc tại: https://www.c-sharpcorner.com

#csharp 

Tamale  Moses

Tamale Moses

1624240146

How to Run C/C++ in Sublime Text?

C and C++ are the most powerful programming language in the world. Most of the super fast and complex libraries and algorithms are written in C or C++. Most powerful Kernel programs are also written in C. So, there is no way to skip it.

In programming competitions, most programmers prefer to write code in C or C++. Tourist is considered the worlds top programming contestant of all ages who write code in C++.

During programming competitions, programmers prefer to use a lightweight editor to focus on coding and algorithm designing. VimSublime Text, and Notepad++ are the most common editors for us. Apart from the competition, many software developers and professionals love to use Sublime Text just because of its flexibility.

I have discussed the steps we need to complete in this blog post before running a C/C++ code in Sublime Text. We will take the inputs from an input file and print outputs to an output file without using freopen file related functions in C/C++.

#cpp #c #c-programming #sublimetext #c++ #c/c++

Dicey Issues in C/C++

If you are familiar with C/C++then you must have come across some unusual things and if you haven’t, then you are about to. The below codes are checked twice before adding, so feel free to share this article with your friends. The following displays some of the issues:

  1. Using multiple variables in the print function
  2. Comparing Signed integer with unsigned integer
  3. Putting a semicolon at the end of the loop statement
  4. C preprocessor doesn’t need a semicolon
  5. Size of the string matters
  6. Macros and equations aren’t good friends
  7. Never compare Floating data type with double data type
  8. Arrays have a boundary
  9. Character constants are different from string literals
  10. Difference between single(=) and double(==) equal signs.

The below code generates no error since a print function can take any number of inputs but creates a mismatch with the variables. The print function is used to display characters, strings, integers, float, octal, and hexadecimal values onto the output screen. The format specifier is used to display the value of a variable.

  1. %d indicates Integer Format Specifier
  2. %f indicates Float Format Specifier
  3. %c indicates Character Format Specifier
  4. %s indicates String Format Specifier
  5. %u indicates Unsigned Integer Format Specifier
  6. %ld indicates Long Int Format Specifier

Image for post


A signed integer is a 32-bit datum that encodes an integer in the range [-2147483648 to 2147483647]. An unsigned integer is a 32-bit datum that encodes a non-negative integer in the range [0 to 4294967295]. The signed integer is represented in twos-complement notation. In the below code the signed integer will be converted to the maximum unsigned integer then compared with the unsigned integer.

Image for post

#problems-with-c #dicey-issues-in-c #c-programming #c++ #c #cplusplus

Ari  Bogisich

Ari Bogisich

1590587580

Loops in C++ | For, While, and Do While Loops in C++

In this Video We are going to see how to use Loops in C++. We will see How to use For, While, and Do While Loops in C++.
C++ is general purpose, compiled, object-oriented programming language and its concepts served as the basis for several other languages such as Java, Python, Ruby, Perl etc.

#c #c# #c++ #programming-c

Ari  Bogisich

Ari Bogisich

1589816580

Using isdigit() in C/C++

In this article, we’ll take a look at using the isdigit() function in C/C++. This is a very simple way to check if any value is a digit or not. Let’s look at how to use this function, using some simple examples.

#c programming #c++ #c #c#