はじめに
担当: 松井(入社3年目🐱)
この記事は
- C#を独学している方
- これから実務に入る方
向けに書いています。
C#を独学で勉強していると、
「実務ってどんな感じなんだろう?」
「自分の書いてるコードって現場でも通用するのかな?」
と思うことってあると思います。
自分も最初はそうでした...
書籍や学習サイトで文法や基本的なコードは学べますが、実際の開発に入ると 思っていたのと少し違うところで戸惑う ことがあります。
この記事では、C#を独学している方に向けて 実務に入ると最初に戸惑いやすいポイント を5つ紹介します。
なぜC#を使っているのか💭
多くの企業では C# / .NET を使って業務システムやWebアプリケーションを開発しています。
C#はWebアプリケーションから業務システム、API開発まで幅広く使える言語です。
長く運用するシステムでも安定して開発しやすく、チーム開発とも相性が良いです👍
また、ASP.NET CoreなどのフレームワークやVisual Studioなどの開発ツールが充実しているのも大きな理由だと思います。
自分たちの開発でもC#を中心に使っています。代表がもともとC#で開発していたこともあり、その流れで今もC#がメインになっています。
1. C#は「言語」だけではなく「.NET」とセット
C#を学び始めたばかりの頃は、コンソールアプリケーションから始めることが多いと思います。
こんなコードです。
public static void Main()
{
Console.WriteLine("Hello World");
}
これはC#の基本を理解するにはとても良い方法です。
ただ実務では ASP.NET Coreなどのフレームワークの上で動くアプリケーション を作ることがほとんどです。
Webアプリケーションでは、こんなコードをよく見かけます。
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
builder.Services.AddScoped<IProductService, ProductService>();
var app = builder.Build();
app.MapControllers();
app.Run();
最初にこれを見たとき、自分は正直
- builderって何?
- Servicesって何?
という感じでした。
実務では C#の文法だけでなく.NETの仕組みも一緒に理解する とコードがかなり分かりやすくなります。
2. 実務ではコードの「構造」を意識する
独学だと、1つのクラスに処理をまとめて書くことも多いと思います。
最初はこんなコードを書いてました。
public class ProductController
{
public string CreateProduct(string name)
{
var product = new Product { Name = name };
_dbContext.Products.Add(product);
await _dbContext.SaveChangesAsync();
return "OK";
}
}
学習用としては問題ありませんが、実務では 役割ごとにコードを分ける構造 にすることが多いです。
だいたいこんな構成になります。
public class ProductController : ControllerBase
{
private readonly IProductService _productService;
public ProductController(IProductService productService)
{
_productService = productService;
}
[HttpPost]
public async Task<IActionResult> Create(string name)
{
await _productService.CreateAsync(name);
return Ok();
}
}
public interface IProductService
{
Task CreateAsync(string name);
}
public class ProductService : IProductService
{
private readonly IProductRepository _repository;
public ProductService(IProductRepository repository)
{
_repository = repository;
}
public async Task CreateAsync(string name)
{
// ビジネスロジック
await _repository.InsertAsync(name);
}
}
public interface IProductRepository
{
Task InsertAsync(string name);
}
public class ProductRepository : IProductRepository
{
private readonly IApplicationDbContext _dbContext;
public ProductRepository(IApplicationDbContext dbContext)
{
_dbContext = dbContext;
}
public async Task InsertAsync(string name)
{
var product = new Product { Name = name };
_dbContext.Products.Add(product);
await _dbContext.SaveChangesAsync();
}
}
最初は少し面倒に感じるかもしれませんが、役割ごとに構造を分けておくことで次のようなメリットがあります。
- リクエスト処理・ビジネスロジック・データアクセスを分けることで、コードの役割が分かりやすくなる
- 変更が入ったときに、修正する場所を絞りやすくなる
- 処理ごとの責務がはっきりするため、コードの見通しが良くなる
- テストやデバッグがしやすくなる
- チーム開発での分担やレビューがしやすくなる
実務では機能追加や仕様変更が繰り返し発生するため、このように構造を分けておくと保守しやすいコードになります。
逆に1つのクラスに処理をまとめてしまうと、後からの修正や機能追加が難しくなりやすいです。
3. DI(依存性注入)はよく出てくる
独学だと次のようにインスタンスを作ることが多いと思います。
var productService = new ProductService();
でもASP.NET Coreでは DI(Dependency Injection) を使うのが一般的です。
DIは、クラスが必要なオブジェクトを自分で new するのではなく 外から渡してもらう仕組み です。
こんな感じで登録します。
builder.Services.AddScoped<IProductService, ProductService>();
するとControllerではこう書くだけで使えます。
public ProductController(IProductService productService)
{
_productService = productService;
}
DIを使うことで、実務ではたくさんメリットがあります!
- テストがしやすくなる
- 実装の差し替えがしやすい
- クラス同士の依存関係がシンプルになる
- 役割ごとにコードを分けやすくなる
最初は少し戸惑うかもしれませんが、DIを理解しておくとコードがかなり保守運用しやすくなります。
4. データベースの知識も大事
C#のアプリケーションでは、データベースと連携することがほとんどです。
Entity Framework Coreなどを使うとSQLを書かずにデータ操作ができますが、実務ではSQLの知識もやっぱり必要になります。
例えば
- インデックスがないと処理が遅くなる
- クエリの書き方でパフォーマンスが変わる
- トランザクションを考えないとデータ不整合が起きる
など、データベースの理解が必要な場面はかなり多いです。
実務では プログラムとデータベースをセットで考える ことが多いので、このあたりの知識も少しずつ身につけていくと理解が深まります。
5. 例外処理とログはかなり大事
エラーが発生すること自体は珍しいことではありません。
大事なのは 「原因を追えること」 です。
こんなコードだと、後から原因が分からなくなります。
catch
{
}
実務ではログを残すことが多いです。
catch (Exception ex)
{
logger.LogError(ex, "エラーが発生しました");
}
ログが残っていると、後から調査するのがかなり楽になります。
これは実務に入ってから かなり重要だと感じたポイントの一つ です。
まとめ
C#独学から実務に入ると、最初は戸惑うことも多いと思います。
特に次の5つはよく出てくるポイントです。
- C#は言語だけでなく.NETの仕組みとセットで理解する
- コードの構造(Controller / Service / Repository)
- DI(依存性注入)
- データベースの基本知識
- 例外処理とログ
全部を最初から理解する必要はありませんが、少し意識しておくだけでも 実務のコードがだいぶ分かりやすくなる と思います。
おわりに
C#は学びやすく、実務でも広く使われている言語です。
独学の段階でも今回紹介した視点を少し意識しておくと、実務のコードが理解しやすくなると思います。
これからC#を学ぶ方の参考になればうれしいです!
