この記事は、.NET の専門知識を証明したい人にとって最適です。 .NET開発者の皆さん、こんにちは。 この記事では、すべての開発者が知っておくべきさまざまな C# の概念について説明します。自分の知識をテストすることは常に良いアイデアであり、この記事では説明とコード例とともにいくつかの例をまとめました。 コード例を知って理解していれば、.NET でかなりうまくやっている可能性が高いです。 1. IEnumerable<T> と ICollection<T> の違い でロジックを記述する際、開発者は IEnumerable<T> と ICollection<T> に頻繁に遭遇します。これらは非常によく似ていますが、ソフトウェア開発では異なる目的を果たします。 C# 非ジェネリック コレクションの基本インターフェイスとして機能します。定義された型のコレクションを反復処理するのに役立ちます。 IEnumerable<T> は、 データ操作が許可されていないため、より安全な軽量コレクションを使用することをお勧めします。データ操作を防ぎたい場合は、コレクションに を使用することをお勧めします。 IEnumerable<T> IEnumerable<int> numbers = new List<int> { 1, 2, 3 }; foreach (var number in numbers) { Console.WriteLine(number); // Outputs: 1 2 3 } IEnumerable<T> を拡張し、変更メソッドを使用して変更を可能にします。このインターフェイスは、コレクション内のカウントを追加、削除、およびチェックするメソッドで構成されています。 ICollection<T> は ICollection<int> data = new List<int> { 12,43,556}; numbers.Add(4); Console.WriteLine(data.Count); // Outputs: 4 コレクションに変更メソッドが必要な場合は ICollection<T> を、単純な読み取りアクションの場合は IEnumerable<T> を使用することをお勧めします。 2. .NET Core における依存性注入の役割 疎結合でテスト可能なコードを記述する場合は、DI 設計パターンを使用することをお勧めします。DI を使用すると、開発者はクラス間の依存関係を簡単に管理できます。 .NET Core には DI のサポートが組み込まれているため、簡単に実装できます。 開発者が C# で DI を実装する方法 Startup.cs ファイルの ConfigureServices メソッドで 。ここで、挿入できるサービスを定義します。 サービスを登録します public void ConfigureServices(IServiceCollection services) { // Register a transient service services.AddTransient<IMyService, MyService>(); } コンストラクター インジェクションを通じてクラスに 。これにより、クラスは依存関係を直接作成しなくても、依存関係を受け取ることができます。 サービスを注入します public class MyController : Controller { private readonly IMyService _myService; public MyController(IMyService myService) { _myService = myService; } public IActionResult Index() { var data = _myService.GetData(); return View(data); } } 開発者がサービスの作成を分離すると、コードの保守とテストが容易になります。 3. ref パラメータと out パラメータの違い C# では、ref と out は参照によってパラメータを渡すために使用されますが、それぞれ異なる特性を持っています。 パラメータでは、変数をメソッドに渡す前に初期化する必要があります。その後、メソッドは変数の値を変更できます。 ref public void UpdateValue(ref int number) { number += 10; } int myNumber = 5; UpdateValue(ref myNumber); Console.WriteLine(myNumber); // Outputs: 15 パラメータは、渡される前に初期化する必要はありません。メソッドは、戻る前に out パラメータに値を割り当てる必要があります。 out public void GetValues(out int value1, out int value2) { value1 = 10; value2 = 20; } GetValues(out int a, out int b); Console.WriteLine(a); // Outputs: 10 Console.WriteLine(b); // Outputs: 20 ref は通常、メソッドが既存の変数を変更する必要がある場合に使用され、out はメソッドが複数の値を返す必要がある場合や、呼び出し元によって提供されなかった値を初期化する必要がある場合に使用されます。 4. Async と Await: アプリケーションのパフォーマンスの向上 .NET では、負荷がかかってもパフォーマンスが良好な効率的なアプリケーションを作成するには、非同期プログラミングが不可欠です。async キーワードと await キーワードにより、非同期操作の操作が簡単になります。 非同期メソッドを使用すると、タスクを非同期に実行できます。メソッド内で await を使用できるようにするには、メソッドに キーワードをマークします。 async public async Task<string> FetchDataAsync() { await Task.Delay(1000); // Simulates an asynchronous operation return "Data fetched"; } メインスレッドをブロックしないことでアプリケーション UI を支援します。 await は public async Task ShowDataAsync() { string data = await FetchDataAsync(); Console.WriteLine(data); } アプリケーションのパフォーマンスを向上させたい場合は、async と await を効果的に使用し、同時にアプリケーション UI の応答性を維持します。 5. .NET Core アプリケーションにおける例外処理 例外を適切に処理することは、堅牢でユーザーフレンドリーなアプリケーションを維持するために不可欠です。.NET Core は、例外処理のためのさまざまなメカニズムを提供します。 try-catch ブロックを使用して例外をキャッチして処理します。 ローカル例外処理: try { int result = 10 / 0; // This will throw a DivideByZeroException } catch (DivideByZeroException ex) { Console.WriteLine("An error occurred: " + ex.Message); } Core の は、ミドルウェアを使用して管理できます。共通の場所ですべての種類の例外をキャッチすることで、開発者はユーザーにとって使いやすい一般的なエラー メッセージを管理しやすくなります。 ASP.NET グローバル例外処理 public void Configure(IApplicationBuilder app) { app.UseExceptionHandler("/Home/Error"); } グローバル例外処理ミドルウェアは、すべてのアプリケーション エラーと例外を処理するための共通の場所を提供します。これにより、アプリケーションが一貫して応答を処理できるようになります。 6. appsettings.json Core の役割 ASP.NET appsettings.jsonファイルは、構成文字列やその他のアプリケーション固有のキーなどのアプリケーション資格情報を管理するために使用されます。構成設定は環境ごとに分割することもできます。 appsettings.json ファイルの例: { "ConnectionStrings": { "DefaultConnection": "Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;" }, "Logging": { "LogLevel": { "Default": "Warning" } } } 組み込みの構成システムを使用すると、アプリケーション内の 。 構成値に簡単にアクセスできます public class MyService { private readonly string _connectionString; public MyService(IConfiguration configuration) { _connectionString = configuration.GetConnectionString("DefaultConnection"); } } appsettings.json ファイルを使用すると、構成設定を簡単に取得でき、効率的に処理できます。 7. C# におけるタスクとスレッドの違いを理解する Task と Thread はどちらも C# での並行プログラミングに使用されますが、目的は異なります。 単一の実行パスを表し、低レベルの構造です。実行をより細かく制御できますが、手動での管理が必要です。 スレッドは Thread thread = new Thread(() => { Console.WriteLine("Running on a new thread"); }); thread.Start(); 非同期操作を実装するための抽象機能を提供し、async/await とともに使用されます。 Task は、 Task.Run(() => { Console.WriteLine("Running asynchronously"); }); タスクは非同期操作の管理を簡素化し、多くの場合、最新の C# 開発で推奨される選択肢となります。 全編をご覧ください C# .Net インタビュー シリーズの それで、どうでしたか? 自信を持って概念を理解し、コード例を理解できる場合は、.NET に精通している可能性が高いです。 会話を続けて、お互いに .NET プロフェッショナルとして成長できるように協力しましょう。 楽しいコーディングを!