この記事は、.NET の専門知識を証明したい人にとって最適です。
.NET開発者の皆さん、こんにちは。
この記事では、すべての開発者が知っておくべきさまざまな C# の概念について説明します。自分の知識をテストすることは常に良いアイデアであり、この記事では説明とコード例とともにいくつかの例をまとめました。
コード例を知って理解していれば、.NET でかなりうまくやっている可能性が高いです。
C#でロジックを記述する際、開発者は IEnumerable<T> と ICollection<T> に頻繁に遭遇します。これらは非常によく似ていますが、ソフトウェア開発では異なる目的を果たします。
データ操作が許可されていないため、より安全な軽量コレクションを使用することをお勧めします。データ操作を防ぎたい場合は、コレクションにIEnumerable<T>を使用することをお勧めします。
IEnumerable<int> numbers = new List<int> { 1, 2, 3 }; foreach (var number in numbers) { Console.WriteLine(number); // Outputs: 1 2 3 }
ICollection<T> はIEnumerable<T> を拡張し、変更メソッドを使用して変更を可能にします。このインターフェイスは、コレクション内のカウントを追加、削除、およびチェックするメソッドで構成されています。
ICollection<int> data = new List<int> { 12,43,556}; numbers.Add(4); Console.WriteLine(data.Count); // Outputs: 4
コレクションに変更メソッドが必要な場合は ICollection<T> を、単純な読み取りアクションの場合は IEnumerable<T> を使用することをお勧めします。
疎結合でテスト可能なコードを記述する場合は、DI 設計パターンを使用することをお勧めします。DI を使用すると、開発者はクラス間の依存関係を簡単に管理できます。
.NET Core には DI のサポートが組み込まれているため、簡単に実装できます。
開発者が C# で DI を実装する方法
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); } }
開発者がサービスの作成を分離すると、コードの保守とテストが容易になります。
C# では、ref と out は参照によってパラメータを渡すために使用されますが、それぞれ異なる特性を持っています。
public void UpdateValue(ref int number) { number += 10; } int myNumber = 5; UpdateValue(ref myNumber); Console.WriteLine(myNumber); // Outputs: 15
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 はメソッドが複数の値を返す必要がある場合や、呼び出し元によって提供されなかった値を初期化する必要がある場合に使用されます。
.NET では、負荷がかかってもパフォーマンスが良好な効率的なアプリケーションを作成するには、非同期プログラミングが不可欠です。async キーワードと await キーワードにより、非同期操作の操作が簡単になります。
public async Task<string> FetchDataAsync() { await Task.Delay(1000); // Simulates an asynchronous operation return "Data fetched"; }
public async Task ShowDataAsync() { string data = await FetchDataAsync(); Console.WriteLine(data); }
アプリケーションのパフォーマンスを向上させたい場合は、async と await を効果的に使用し、同時にアプリケーション UI の応答性を維持します。
例外を適切に処理することは、堅牢でユーザーフレンドリーなアプリケーションを維持するために不可欠です。.NET Core は、例外処理のためのさまざまなメカニズムを提供します。
try { int result = 10 / 0; // This will throw a DivideByZeroException } catch (DivideByZeroException ex) { Console.WriteLine("An error occurred: " + ex.Message); }
public void Configure(IApplicationBuilder app) { app.UseExceptionHandler("/Home/Error"); }
グローバル例外処理ミドルウェアは、すべてのアプリケーション エラーと例外を処理するための共通の場所を提供します。これにより、アプリケーションが一貫して応答を処理できるようになります。
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 ファイルを使用すると、構成設定を簡単に取得でき、効率的に処理できます。
Task と Thread はどちらも C# での並行プログラミングに使用されますが、目的は異なります。
Thread thread = new Thread(() => { Console.WriteLine("Running on a new thread"); }); thread.Start();
Task.Run(() => { Console.WriteLine("Running asynchronously"); });
タスクは非同期操作の管理を簡素化し、多くの場合、最新の C# 開発で推奨される選択肢となります。
C# .Net インタビュー シリーズの全編をご覧ください
自信を持って概念を理解し、コード例を理解できる場合は、.NET に精通している可能性が高いです。
会話を続けて、お互いに .NET プロフェッショナルとして成長できるように協力しましょう。
楽しいコーディングを!