C#テンプレート完全ガイド|初心者向けに使い方・作成方法・実践例をわかりやすく解説

はじめに

C#テンプレートとは、毎回同じように作成するコードやプロジェクト構成を、ひな形として再利用するための仕組みです。

C#開発では、クラス、インターフェース、Web API、テストコード、Repositoryクラス、DTO、設定ファイルなど、似た構造のコードを何度も作る場面があります。そのたびに手作業で書いていると、時間がかかるだけでなく、命名ミスや記述漏れも起こりやすくなります。

そこで役立つのがC#テンプレートです。Visual Studioの標準テンプレートを使えば、プロジェクトやクラスをすぐに作成できます。さらに、自分でカスタムテンプレートを作れば、業務やチームのルールに合わせたコードを自動生成できます。

この記事では、「c# テンプレート」と検索している初心者に向けて、C#テンプレートの基本、Visual Studioでの使い方、項目テンプレートの作成方法、dotnet newテンプレート、ジェネリック、T4テンプレート、実践例、よくあるエラーまでわかりやすく解説します。

1. C#テンプレートとは?初心者がまず理解すべき基本

C#テンプレートとは、C#で使うコードやプロジェクトのひな形のことです。

たとえば、Visual Studioで「コンソールアプリ」を選んで新しいプロジェクトを作成すると、Program.csや.csprojファイルが自動で用意されます。これもプロジェクトテンプレートの一種です。

また、「クラス」を追加すると、次のようなコードが自動生成されます。

C#
namespace SampleApp;

public class User
{
}

このように、よく使う構造を自動で作ってくれる仕組みがC#テンプレートです。

1-1. C#で「テンプレート」と呼ばれるものの種類

C#でテンプレートと呼ばれるものには、主に次の種類があります。

・Visual Studioのプロジェクトテンプレート
・Visual Studioの項目テンプレート
・クラスやインターフェースのテンプレート
・.NET CLIのdotnet newテンプレート
・T4テキストテンプレート
・ジェネリッククラス、ジェネリックメソッド
・コードスニペット

初心者が最初に覚えるべきなのは、Visual Studioのプロジェクトテンプレートと項目テンプレートです。次に、コードの重複を減らすためにジェネリックを理解すると、C#らしい書き方ができるようになります。

1-2. Visual Studioのテンプレートと.NET CLIテンプレートの違い

Visual Studioのテンプレートは、画面操作でプロジェクトやファイルを作成するためのテンプレートです。

一方、.NET CLIテンプレートは、コマンドラインで使うテンプレートです。

Bash
dotnet new console
dotnet new webapi
dotnet new classlib

たとえば、上記のように入力すると、コンソールアプリ、Web API、クラスライブラリなどを作成できます。

Visual StudioテンプレートはGUI中心、.NET CLIテンプレートはコマンド中心と考えるとわかりやすいです。チーム開発や自動化では、dotnet newテンプレートのほうが共有しやすい場合があります。

1-3. C++のtemplateとC#のジェネリックの違い

C#の「テンプレート」という言葉で混乱しやすいのが、C++のtemplateとの違いです。

C++には、次のようなtemplate構文があります。

C++
template <typename T>
T Add(T a, T b)
{
return a + b;
}

一方、C#ではC++のtemplateに近い役割を、ジェネリックが担います。

C#
public class Box<T>
{
public T Value { get; set; }
}

C#にはC++と同じtemplate構文はありません。C#で型を汎用化したい場合は、ジェネリッククラスやジェネリックメソッドを使います。

1-4. テンプレートを使うメリット・デメリット

C#テンプレートを使うメリットは、開発効率を上げられることです。

同じようなコードを毎回書かなくてよくなり、命名規則やフォルダ構成も統一しやすくなります。チーム全体で同じテンプレートを使えば、コードレビューもしやすくなります。

一方で、テンプレートを増やしすぎると管理が難しくなります。古い設計のテンプレートが残っていると、間違ったコードが量産されることもあります。

テンプレートは便利ですが、作った後の保守も重要です。

2. C#テンプレートの主な種類と使い分け

C#テンプレートには複数の種類があります。目的に応じて使い分けることが大切です。

2-1. プロジェクトテンプレート

プロジェクトテンプレートは、アプリケーションやライブラリ全体のひな形です。

例として、次のようなものがあります。

・コンソールアプリ
・クラスライブラリ
・ASP.NET Core Web API
・Blazorアプリ
・Windows Formsアプリ
・WPFアプリ
・xUnitテストプロジェクト

新しい開発を始めるときは、まずプロジェクトテンプレートを選びます。

2-2. 項目テンプレート

項目テンプレートは、プロジェクト内に追加するファイルのひな形です。

たとえば、次のような項目があります。

・クラス
・インターフェース
・列挙型
・レコード
・コントローラー
・Razorページ
・設定ファイル

Visual Studioで「追加」→「新しい項目」を選ぶと、項目テンプレートを使ってファイルを追加できます。

2-3. クラステンプレート

クラステンプレートは、クラスファイルのひな形です。

標準のクラスだけでなく、次のような独自テンプレートを作ることもできます。

C#
namespace $rootnamespace$;

public class $safeitemrootname$
{
public Guid Id { get; set; } = Guid.NewGuid();
public DateTime CreatedAt { get; set; } = DateTime.UtcNow;
public DateTime UpdatedAt { get; set; } = DateTime.UtcNow;
}

共通プロパティを持つEntityクラスなどを作るときに便利です。

2-4. T4テキストテンプレート

T4テキストテンプレートは、テキストやコードを自動生成するためのテンプレートです。

拡張子は「.tt」です。C#のコードをテンプレート内に埋め込み、ループや条件分岐を使ってファイルを生成できます。

DTO、設定ファイル、SQL、HTML、C#コードなどを生成したい場合に使われます。

2-5. ジェネリッククラス・ジェネリックメソッド

ジェネリックは、型を後から指定できる仕組みです。

C#
public class Repository<T>
{
private readonly List<T> _items = new();

public void Add(T item)
{
_items.Add(item);
}

public IEnumerable<T> GetAll()
{
return _items;
}
}

User用、Product用、Order用に似たRepositoryを何度も作るのではなく、Repository<T>として共通化できます。

3. Visual StudioでC#テンプレートを使う方法

Visual Studioを使うと、C#テンプレートを画面操作だけで簡単に利用できます。

3-1. 新しいプロジェクト作成時にテンプレートを選ぶ手順

Visual Studioでプロジェクトテンプレートを使う手順は次のとおりです。

1. Visual Studioを起動する
2. 「新しいプロジェクトの作成」をクリックする
3. 言語で「C#」を選ぶ
4. 種類から「コンソール」「Web」「デスクトップ」などを選ぶ
5. 使いたいテンプレートを選択する
6. プロジェクト名と保存場所を入力する
7. .NETのバージョンを選ぶ
8. 「作成」をクリックする

初心者は、まず「コンソールアプリ」テンプレートから始めるのがおすすめです。

3-2. クラスやインターフェースなどの項目テンプレートを追加する手順

既存プロジェクトにクラスを追加する場合は、次の手順で行います。

1. ソリューションエクスプローラーで対象プロジェクトを右クリックする
2. 「追加」→「新しい項目」を選ぶ
3. 「クラス」「インターフェース」「列挙型」などを選ぶ
4. ファイル名を入力する
5. 「追加」をクリックする

これで、名前空間やクラス名が入ったC#ファイルが自動生成されます。

3-3. テンプレートが表示されないときの確認ポイント

テンプレートが表示されない場合は、次の点を確認してください。

・C#のワークロードがインストールされているか
・対象の.NET SDKがインストールされているか
・Visual Studioのフィルター条件が絞り込まれすぎていないか
・テンプレートの配置場所が正しいか
・Visual Studioを再起動したか
・テンプレートキャッシュが古くなっていないか

特に、ASP.NET Coreやデスクトップアプリのテンプレートが出ない場合は、Visual Studio Installerで必要なワークロードを追加する必要があります。

3-4. 初心者におすすめの標準テンプレート

初心者におすすめのC#テンプレートは次のとおりです。

・コンソールアプリ
・クラスライブラリ
・ASP.NET Core Web API
・xUnitテストプロジェクト
・Windows Formsアプリ

最初はコンソールアプリでC#の基本文法を学び、次にクラスライブラリやWeb APIに進むと理解しやすいです。

4. C#の項目テンプレートを作成・編集する方法

Visual Studioでは、自分で項目テンプレートを作成できます。よく使うクラスの形が決まっている場合は、テンプレート化すると便利です。

4-1. 既存クラスをテンプレート化する流れ

既存クラスをテンプレート化する基本的な流れは次のとおりです。

1. テンプレートにしたいC#ファイルを作る
2. クラス名や名前空間をテンプレート変数に置き換える
3. .vstemplateファイルを作成する
4. 必要なファイルをzipにまとめる
5. Visual Studioのテンプレートフォルダに配置する
6. Visual Studioから新しい項目として追加する

たとえば、BaseEntityクラスのテンプレートを作れば、毎回同じプロパティを持つクラスを簡単に作成できます。

4-2. .vstemplateファイルの基本構造

Visual Studioのテンプレートでは、.vstemplateファイルにテンプレート情報を記述します。

例は次のとおりです。

XML
<VSTemplate Version="3.0.0" Type="Item"
xmlns="http://schemas.microsoft.com/developer/vstemplate/2005">
<TemplateData>
<Name>Base Entity Class</Name>
<Description>共通プロパティを持つEntityクラス</Description>
<ProjectType>CSharp</ProjectType>
<DefaultName>Entity.cs</DefaultName>
</TemplateData>
<TemplateContent>
<ProjectItem ReplaceParameters="true">Entity.cs</ProjectItem>
</TemplateContent>
</VSTemplate>

重要なのは、ProjectItemのReplaceParametersをtrueにすることです。これにより、テンプレート変数が実際の名前に置換されます。

4-3. $safeitemrootname$などのテンプレート変数の使い方

Visual Studioの項目テンプレートでは、特殊な変数を使えます。

よく使う変数は次のとおりです。

$safeitemrootname$  ファイル名から安全なクラス名を生成
$rootnamespace$ プロジェクトのルート名前空間
$guid1$ GUIDを生成
$time$ 現在時刻
$userdomain$ ユーザーのドメイン名
$username$ ユーザー名

たとえば、クラス名に$safeitemrootname$を使うと、ファイル名に応じたクラス名を自動で入れられます。

C#
namespace $rootnamespace$;

public class $safeitemrootname$
{
}

「Customer.cs」という名前で追加すると、次のようになります。

C#
namespace SampleApp;

public class Customer
{
}

4-4. 名前空間・アクセス修飾子・usingを自動生成する方法

名前空間やusingもテンプレート内にあらかじめ書いておけば、自動生成できます。

C#
using System;

namespace $rootnamespace$;

public class $safeitemrootname$
{
public Guid Id { get; set; } = Guid.NewGuid();

public DateTime CreatedAt { get; set; } = DateTime.UtcNow;
}

業務で共通のルールがある場合は、public、internal、abstractなどのアクセス修飾子もテンプレートに含めておくと便利です。

C#
namespace $rootnamespace$;

public abstract class $safeitemrootname$
{
public Guid Id { get; protected set; } = Guid.NewGuid();
}

4-5. 作成したテンプレートをVisual Studioに追加する方法

作成した項目テンプレートは、通常zip形式で保存し、Visual Studioのテンプレートフォルダに配置します。

一般的な配置先は次のような場所です。

ドキュメント\Visual Studio 20xx\Templates\ItemTemplates

配置後、Visual Studioを再起動すると、「新しい項目の追加」画面に表示されます。

表示されない場合は、zipの中に.vstemplateファイルが正しく入っているか、TemplateDataのProjectTypeがCSharpになっているか確認してください。

5. dotnet newでC#プロジェクトテンプレートを作成する方法

Visual Studioだけでなく、.NET CLIでもC#テンプレートを作成できます。

5-1. .NET CLIテンプレートとは

.NET CLIテンプレートとは、dotnet newコマンドで使えるテンプレートです。

たとえば、次のコマンドでコンソールアプリを作成できます。

Bash
dotnet new console -n SampleApp

カスタムテンプレートを作れば、チーム独自のWeb API構成やクラスライブラリ構成を、コマンド一つで生成できます。

5-2. .template.configとtemplate.jsonの役割

.NET CLIテンプレートでは、テンプレートのルートフォルダに「.template.config」フォルダを作り、その中にtemplate.jsonを配置します。

構成例は次のとおりです。

MyWebApiTemplate/
├─ .template.config/
│ └─ template.json
├─ Controllers/
├─ Services/
├─ Program.cs
└─ MyWebApiTemplate.csproj

template.jsonには、テンプレート名、短縮名、言語、プロジェクトタイプなどを記述します。

JSON
{
"$schema": "http://json.schemastore.org/template",
"author": "Your Team",
"classifications": [ "Web", "API" ],
"identity": "Company.Templates.WebApi",
"name": "Company Web API Template",
"shortName": "company-webapi",
"sourceName": "Company.WebApi",
"preferNameDirectory": true
}

sourceNameに指定した文字列は、dotnet new実行時のプロジェクト名に置換されます。

5-3. カスタムテンプレートの基本的な作成手順

.NET CLIテンプレートを作る手順は次のとおりです。

1. 元になるC#プロジェクトを作成する
2. 不要なbin、objフォルダを削除する
3. 汎用化したい名前をsourceNameに合わせる
4. .template.configフォルダを作る
5. template.jsonを作成する
6. dotnet new installでテンプレートをインストールする
7. dotnet newで生成できるか確認する

実行例は次のとおりです。

Bash
dotnet new install ./MyWebApiTemplate
dotnet new company-webapi -n Sales.Api

これでSales.Apiという名前のプロジェクトが作成されます。

5-4. テンプレートをインストール・実行・削除するコマンド

よく使うdotnet newテンプレートのコマンドは次のとおりです。

Bash
dotnet new list

インストール済みテンプレートを確認します。

Bash
dotnet new install ./MyTemplate

ローカルフォルダのテンプレートをインストールします。

Bash
dotnet new company-webapi -n Sample.Api

テンプレートからプロジェクトを作成します。

Bash
dotnet new uninstall ./MyTemplate

テンプレートを削除します。

テンプレートが見つからない場合は、shortNameが正しいか、インストール先が正しいか確認しましょう。

5-5. チーム開発でテンプレートを共有する方法

チームでC#テンプレートを共有する方法には、次のようなものがあります。

・Gitリポジトリで管理する
・NuGetパッケージ化して配布する
・社内テンプレート用リポジトリを作る
・READMEにインストール手順を書く
・CIでテンプレートのビルド確認を行う

おすすめは、テンプレート自体をGitで管理し、バージョンを付ける方法です。テンプレートを変更した履歴が残るため、トラブルが起きたときに原因を追いやすくなります。

6. C#ジェネリックをテンプレート的に使う方法

C#にはC++のtemplate構文はありませんが、ジェネリックを使うことで、型に依存しない汎用的なコードを書けます。

6-1. ジェネリックとは何か

ジェネリックとは、クラスやメソッドで扱う型を後から指定できる仕組みです。

たとえば、List<T>は代表的なジェネリックです。

C#
List<string> names = new();
List<int> numbers = new();

同じListでも、string用、int用のように型を変えて使えます。

6-2. ジェネリッククラスの書き方

ジェネリッククラスは、クラス名の後ろに<T>を付けて定義します。

C#
public class Box<T>
{
public T Value { get; set; }

public Box(T value)
{
Value = value;
}
}

使う側では、具体的な型を指定します。

C#
var stringBox = new Box<string>("Hello");
var intBox = new Box<int>(100);

Tは型パラメーターです。Tの代わりにTEntity、TKey、TValueなど、意味のある名前を使うこともあります。

6-3. ジェネリックメソッドの書き方

メソッドだけをジェネリックにすることもできます。

C#
public static T FirstOrDefaultValue<T>(IEnumerable<T> items)
{
foreach (var item in items)
{
return item;
}

return default!;
}

呼び出し例は次のとおりです。

C#
var names = new List<string> { "Alice", "Bob" };
string firstName = FirstOrDefaultValue(names);

型推論が働くため、多くの場合は<T>を明示しなくても使えます。

6-4. where制約の使い方

where制約を使うと、ジェネリックで指定できる型に条件を付けられます。

C#
public class Repository<T> where T : class
{
private readonly List<T> _items = new();

public void Add(T item)
{
_items.Add(item);
}
}

よく使うwhere制約は次のとおりです。

C#
where T : class
where T : struct
where T : new()
where T : BaseEntity
where T : IEntity

たとえば、new()制約を付けると、Tのインスタンスを生成できます。

C#
public T Create<T>() where T : new()
{
return new T();
}

6-5. 型ごとの重複コードを減らす実践例

UserRepository、ProductRepository、OrderRepositoryがほとんど同じ処理を持っている場合、ジェネリックで共通化できます。

C#
public interface IEntity
{
Guid Id { get; set; }
}

public class Repository<T> where T : IEntity
{
private readonly List<T> _items = new();

public void Add(T item)
{
_items.Add(item);
}

public T? FindById(Guid id)
{
return _items.FirstOrDefault(x => x.Id == id);
}

public IEnumerable<T> GetAll()
{
return _items;
}
}

使い方は次のとおりです。

C#
public class User : IEntity
{
public Guid Id { get; set; }
public string Name { get; set; } = "";
}

var repository = new Repository<User>();
repository.Add(new User { Id = Guid.NewGuid(), Name = "Alice" });

このように、型ごとに似たコードを書かずに済むのがジェネリックの大きなメリットです。

7. T4テキストテンプレートでコードを自動生成する方法

T4テキストテンプレートを使うと、C#コードや設定ファイルを自動生成できます。

7-1. T4テンプレートとは

T4は、Text Template Transformation Toolkitの略です。

Visual Studioで使えるコード生成の仕組みで、.ttファイルからテキストファイルを生成します。生成する内容はC#コードでも、HTMLでも、JSONでも構いません。

大量の似たコードを作る場合や、モデル定義からコードを生成したい場合に役立ちます。

7-2. .ttファイルの基本構文

基本的なT4テンプレートは次のように書きます。

C#
<#@ template language="C#" #>
<#@ output extension=".cs" #>
namespace Generated;

public class Sample
{
public string Name { get; set; } = "";
}

この.ttファイルを保存すると、指定した拡張子のファイルが生成されます。

7-3. 変数・if文・ループを使った生成例

T4では、C#のコードブロックを使えます。

C#
<#@ template language="C#" #>
<#@ output extension=".cs" #>
<#
var className = "UserDto";
var properties = new[]
{
new { Type = "Guid", Name = "Id" },
new { Type = "string", Name = "Name" },
new { Type = "DateTime", Name = "CreatedAt" }
};
#>
namespace Generated;

public class <#= className #>
{
<# foreach (var property in properties) { #>
public <#= property.Type #> <#= property.Name #> { get; set; }
<# } #>
}

生成されるコードは次のようになります。

C#
namespace Generated;

public class UserDto
{
public Guid Id { get; set; }
public string Name { get; set; }
public DateTime CreatedAt { get; set; }
}

7-4. DTOや設定ファイルを自動生成する実践例

たとえば、複数のDTOをまとめて生成したい場合は、T4が便利です。

C#
<#@ template language="C#" #>
<#@ output extension=".cs" #>
<#
var entities = new[] { "User", "Product", "Order" };
#>
namespace GeneratedDtos;

<# foreach (var entity in entities) { #>
public class <#= entity #>Dto
{
public Guid Id { get; set; }
public string Name { get; set; } = "";
}

<# } #>

手作業でUserDto、ProductDto、OrderDtoを書くよりも、修正漏れを防ぎやすくなります。

7-5. T4テンプレートを使うときの注意点

T4テンプレートは強力ですが、使いすぎには注意が必要です。

生成元のテンプレートが複雑になりすぎると、かえって保守が難しくなります。また、生成されたコードを直接編集すると、再生成時に上書きされる可能性があります。

T4を使う場合は、次のルールを決めておくと安全です。

・生成コードは手動編集しない
・編集するのは.ttファイルだけにする
・生成コードには自動生成であることをコメントで書く
・複雑なロジックをテンプレートに詰め込みすぎない
・テンプレート変更後は必ずビルド確認する

8. C#テンプレートの実践例

ここからは、実際に使えるC#テンプレートの例を紹介します。

8-1. 共通プロパティを持つクラスを自動生成する例

EntityクラスにId、CreatedAt、UpdatedAtを持たせたい場合のテンプレート例です。

C#
namespace $rootnamespace$;

public class $safeitemrootname$
{
public Guid Id { get; set; } = Guid.NewGuid();

public DateTime CreatedAt { get; set; } = DateTime.UtcNow;

public DateTime UpdatedAt { get; set; } = DateTime.UtcNow;
}

Customer.csとして追加すると、Customerクラスが自動生成されます。

C#
namespace SampleApp;

public class Customer
{
public Guid Id { get; set; } = Guid.NewGuid();

public DateTime CreatedAt { get; set; } = DateTime.UtcNow;

public DateTime UpdatedAt { get; set; } = DateTime.UtcNow;
}

8-2. Repositoryクラスのひな形を作る例

Repositoryクラスのテンプレート例です。

C#
namespace $rootnamespace$;

public class $safeitemrootname$<T> where T : class
{
private readonly List<T> _items = new();

public void Add(T item)
{
_items.Add(item);
}

public IEnumerable<T> GetAll()
{
return _items;
}

public void Remove(T item)
{
_items.Remove(item);
}
}

実際の業務では、Entity Framework CoreのDbContextを受け取る形にしてもよいでしょう。

C#
namespace $rootnamespace$;

public class $safeitemrootname$<T> where T : class
{
private readonly AppDbContext _context;

public $safeitemrootname$(AppDbContext context)
{
_context = context;
}

public IQueryable<T> Query()
{
return _context.Set<T>();
}

public void Add(T entity)
{
_context.Set<T>().Add(entity);
}
}

8-3. Web APIプロジェクトのテンプレートを作る例

Web APIプロジェクトでは、次のような構成をテンプレート化すると便利です。

Controllers/
Services/
Repositories/
Dtos/
Models/
Program.cs
appsettings.json

template.jsonの例です。

JSON
{
"$schema": "http://json.schemastore.org/template",
"author": "Company",
"classifications": [ "Web", "API", "C#" ],
"identity": "Company.WebApi.Template",
"name": "Company Web API Template",
"shortName": "company-webapi",
"sourceName": "Company.WebApi",
"preferNameDirectory": true
}

作成コマンドは次のとおりです。

Bash
dotnet new install ./Company.WebApi.Template
dotnet new company-webapi -n Inventory.Api

これにより、社内標準の構成を持つWeb APIプロジェクトをすぐに作成できます。

8-4. Unity用C#スクリプトテンプレートを作る例

Unity開発でもC#スクリプトのテンプレートを整えると便利です。

C#
using UnityEngine;

public class #SCRIPTNAME# : MonoBehaviour
{
private void Awake()
{
}

private void Start()
{
}

private void Update()
{
}
}

Unityではスクリプト名とクラス名が一致している必要があります。テンプレートを編集する場合は、クラス名の置換ルールを壊さないように注意しましょう。

8-5. テストコードのテンプレートを作る例

xUnitのテストクラスをテンプレート化する例です。

C#
using Xunit;

namespace $rootnamespace$;

public class $safeitemrootname$
{
[Fact]
public void TestName_Should_ExpectedResult()
{
// Arrange

// Act

// Assert
}
}

Arrange、Act、Assertの形を最初から入れておくと、チーム内でテストコードの書き方を統一できます。

9. C#テンプレート作成でよくあるエラーと解決方法

C#テンプレートを作成していると、表示されない、置換されない、生成後にコンパイルエラーになるといった問題が起こることがあります。

9-1. テンプレートがVisual Studioに表示されない

Visual Studioにテンプレートが表示されない場合は、次を確認してください。

・zipファイルの直下に.vstemplateがあるか
・TemplateDataのProjectTypeがCSharpになっているか
・ItemTemplatesフォルダに配置しているか
・Visual Studioを再起動したか
・対象のプロジェクト種類に対応しているか

zipの中にフォルダが一段余分に入っていると、Visual Studioがテンプレートを認識できないことがあります。

9-2. 名前空間やクラス名が正しく置換されない

テンプレート変数がそのまま出力される場合は、.vstemplateのProjectItemにReplaceParameters="true"が指定されているか確認します。

XML
<ProjectItem ReplaceParameters="true">Class1.cs</ProjectItem>

また、$safeitemrootname$のスペルミスにも注意してください。

誤りの例です。

C#
public class $safeitemrootName$
{
}

正しくは次のように書きます。

C#
public class $safeitemrootname$
{
}

9-3. dotnet newでテンプレートが見つからない

dotnet newでテンプレートが見つからない場合は、次を確認します。

Bash
dotnet new list

一覧に表示されない場合は、インストールに失敗している可能性があります。

Bash
dotnet new install ./MyTemplate

template.jsonのshortNameを間違えている場合もあります。

JSON
"shortName": "company-webapi"

この場合、実行コマンドは次のようになります。

Bash
dotnet new company-webapi -n Sample.Api

9-4. template.jsonの設定ミス

template.jsonでよくあるミスは次のとおりです。

・JSONのカンマ漏れ
・shortNameの重複
・sourceNameの指定ミス
・identityが他テンプレートと重複
・.template.configの場所が違う

最小構成から始めて、少しずつ設定を追加するのがおすすめです。

JSON
{
"$schema": "http://json.schemastore.org/template",
"author": "Your Name",
"classifications": [ "Console" ],
"identity": "Sample.Console.Template",
"name": "Sample Console Template",
"shortName": "sample-console",
"sourceName": "Sample.Console"
}

9-5. 生成されたコードがコンパイルエラーになる

テンプレートから生成されたコードがコンパイルエラーになる場合は、テンプレート自体を通常のC#プロジェクトとしてビルドできる状態にしておくことが重要です。

確認ポイントは次のとおりです。

・usingが不足していないか
・名前空間が正しいか
・クラス名とファイル名がずれていないか
・必要なNuGetパッケージが含まれているか
・置換後の名前がC#の識別子として有効か

テンプレートは「生成して終わり」ではなく、「生成後にビルドできること」まで確認しましょう。

10. C#テンプレートを使うときのベストプラクティス

C#テンプレートを効果的に使うには、作り方だけでなく運用ルールも重要です。

10-1. テンプレート化すべきコード・すべきでないコード

テンプレート化すべきコードは、繰り返し使う定型的なコードです。

・Entityクラス
・DTO
・Repository
・Service
・Controller
・テストクラス
・プロジェクト初期構成

一方、業務ロジックのように毎回内容が大きく変わるコードは、無理にテンプレート化しないほうがよいです。

テンプレート化に向いているのは、「構造は同じで名前や一部の値だけが違うコード」です。

10-2. 保守しやすいテンプレート設計のコツ

保守しやすいテンプレートにするには、シンプルに作ることが大切です。

・最初から複雑にしすぎない
・不要なコードを入れない
・コメントで意図を残す
・生成後にすぐビルドできる状態にする
・テンプレートの責務を分ける

テンプレートに何でも詰め込むと、使わないコードが増えます。最小限のひな形にして、必要な部分だけ追加できる形が理想です。

10-3. 命名規則とフォルダ構成を統一する方法

テンプレートを使う大きなメリットは、命名規則とフォルダ構成を統一できることです。

たとえば、Web APIで次のような構成を標準化できます。

Controllers/
Application/Services/
Domain/Entities/
Infrastructure/Repositories/
Contracts/Requests/
Contracts/Responses/
Tests/

命名規則もテンプレートに含めておくと便利です。

UserController
UserService
UserRepository
UserRequest
UserResponse
UserTests

チーム開発では、テンプレートを使うことで「人によってフォルダ構成が違う」という問題を減らせます。

10-4. チームでテンプレートを運用するポイント

チームでテンプレートを運用する場合は、次のルールを決めておきましょう。

・テンプレートの管理場所
・変更時のレビュー方法
・バージョン管理の方法
・古いテンプレートの廃止ルール
・READMEの整備
・利用コマンドの統一

テンプレートも通常のコードと同じく、レビュー対象にするべきです。テンプレートの品質が低いと、品質の低いコードが大量に生成されてしまいます。

10-5. テンプレートとスニペットの使い分け

テンプレートと似たものにコードスニペットがあります。

スニペットは、コードの一部を素早く挿入するためのものです。

C#
prop

Visual Studioでpropと入力してTabキーを押すと、プロパティのひな形を挿入できます。

一方、テンプレートはファイルやプロジェクト全体を生成するためのものです。

スニペット:メソッド、プロパティ、if文などの小さなコード
テンプレート:クラス、DTO、Repository、プロジェクトなどの大きな単位

小さな定型コードはスニペット、ファイル単位やプロジェクト単位はテンプレートと考えると使い分けやすいです。

11. C#テンプレートに関するよくある質問

最後に、C#テンプレートに関するよくある質問に答えます。

11-1. C#にC++のようなtemplateはある?

C#にはC++と同じtemplate構文はありません。

C#で型に依存しないコードを書きたい場合は、ジェネリックを使います。

C#
public class Box<T>
{
public T Value { get; set; }
}

C++のtemplateとC#のジェネリックは似た目的で使われることがありますが、仕組みは異なります。

11-2. C#テンプレートとジェネリックは同じ?

同じではありません。

C#テンプレートは、コードやプロジェクトを生成するひな形を指すことが多いです。

一方、ジェネリックは、型をパラメーター化して再利用可能なコードを書くためのC#の言語機能です。

C#テンプレート:コードやファイルを生成する仕組み
ジェネリック:型を汎用化する言語機能

ただし、初心者向けには「ジェネリックはC#でテンプレート的に使える仕組み」と説明されることもあります。

11-3. Visual Studioなしでもテンプレートは作れる?

作れます。

.NET CLIのdotnet newテンプレートを使えば、Visual StudioなしでもC#テンプレートを作成できます。

Bash
dotnet new install ./MyTemplate
dotnet new mytemplate -n SampleApp

Visual Studio Codeやコマンドライン中心の開発でも利用できます。

11-4. 初心者はどのテンプレートから覚えるべき?

初心者は、次の順番で覚えるのがおすすめです。

1. Visual Studioのプロジェクトテンプレート
2. Visual Studioの項目テンプレート
3. クラステンプレート
4. ジェネリック
5. dotnet newテンプレート
6. T4テンプレート

最初からT4やカスタムテンプレートに進むより、まずは標準テンプレートを使いこなすことが大切です。

11-5. 業務開発でC#テンプレートは使うべき?

同じ構成のコードを何度も作るなら、C#テンプレートは積極的に使うべきです。

特に、Web API、Repository、Service、DTO、テストコードなどはテンプレート化の効果が高いです。

ただし、テンプレートを作ること自体が目的にならないように注意しましょう。頻繁に使うもの、チームで統一したいもの、ミスを減らしたいものからテンプレート化するのがおすすめです。

まとめ

C#テンプレートは、C#開発を効率化するための強力な仕組みです。

Visual Studioのプロジェクトテンプレートや項目テンプレートを使えば、初心者でも簡単にプロジェクトやクラスを作成できます。さらに、.vstemplateを使った項目テンプレート、dotnet newによるプロジェクトテンプレート、T4テキストテンプレートを活用すれば、業務やチームに合わせたコード生成も可能です。

また、C#にはC++のtemplate構文はありませんが、ジェネリックを使うことで型に依存しない再利用可能なコードを書けます。

C#テンプレートを使いこなすポイントは、繰り返し使う定型コードを見極め、シンプルで保守しやすい形にすることです。テンプレートを適切に活用すれば、開発スピードを上げながら、コード品質やチーム内の統一感も高められます。