C# は、モバイル開発におけるXamarinおよび.NET MAUIプラットフォームの基盤となる、マイクロソフトによる最新のオブジェクト指向プログラミング言語です。統一された.NETエコシステムにより、開発者は共有のC#およびXAMLコードを使用して、iOSおよびAndroid向けのモバイルアプリケーションを作成できます。TIOBEインデックス(2026年)によると、C#は全プログラミング言語の中で人気度4位にランクされています。詳細については、Microsoft C#ドキュメントをご覧ください。
重要ポイント
C#(「シーシャープ」と発音)は、安全な型システムを備えたオブジェクト指向プログラミング言語で、2000年にアンダース・ヘルツバーグの指導の下でマイクロソフトによって開発されました。名前は音楽記法(シャープ — 音程を上げる)に着想を得ています。C#は.NETプラットフォーム上で動作し、Common Language Runtime(CLR)と広範なクラスライブラリ(BCL — Base Class Library)を含みます。
モバイル開発では、C#は2つのテクノロジーを通じて使用されます:Xamarin(2011年~2024年)とその後継の.NET MAUI(2022年以降)。Xamarinは、プラットフォーム固有のプロジェクトを分離しながら、共有C#コードを使用してネイティブのAndroidおよびiOSアプリケーションを作成することを可能にしました。.NET MAUIは、共有XAMLマークアップとプラットフォームインターフェースを介したネイティブAPIへのアクセスにより、すべてのプラットフォームを単一のプロジェクトに統合します。
C#の主な特徴は、dynamicによる動的ディスパッチ、varキーワード(型推論)、強力なジェネリクスシステムを備えた厳格な静的型付けです。C#は完全にマネージドな言語です:メモリはガベージコレクター(GC)によって管理され、配列の境界はチェックされ、初期化されていない変数は禁止されています。これにより、AOTコンパイルによる同等のパフォーマンスで、C#はC++よりも安全です。
C# 1.0(2000年)— 基本的なOOP言語。C# 3.0(2007年)— LINQ、ラムダ式、拡張メソッド。C# 6.0(2015年)— 文字列補間、null条件演算子。C# 8.0(2019年)— null許容参照型(null安全の有効化)、非同期ストリーム、デフォルトインターフェースメソッド。C# 10(2021年)— global usings、ファイルスコープ名前空間、record struct。C# 12(2023年)— primary constructors、collection expressions、interceptors。各バージョンはモバイル開発に関連する改善をもたらします。
| C#バージョン | 年 | 主要機能 | モバイル開発における重要性 |
|---|---|---|---|
| 3.0 | 2007 | LINQ、ラムダ | コレクションとデータベースの簡素化された操作 |
| 6.0 | 2015 | ?.(null条件)、文字列補間 | 安全なプロパティアクセス、読みやすい文字列 |
| 8.0 | 2019 | null許容参照型、非同期ストリーム | null安全、非同期データストリーム |
| 10 | 2021 | Record struct、global usings | 値型、ボイラープレートの削減 |
| 12 | 2023 | Primary constructors、collection expressions | クラスとコレクションの簡潔な記法 |
C#の構文はC言語に似ており、厳密に型付けされています。プリミティブ(int、double、bool — これらはValueTypeを継承する構造体)を含め、すべてがオブジェクトです。C#は型を値型(int、double、bool、struct、enum — スタックに格納)と参照型(string、class、interface、delegate、array、record — ヒープに格納)に分類します。null許容型(int?)は値型にnullを許可します。
C#は、クラス(class)、構造体(struct)、レコード(record)、インターフェース(interface)、列挙型(enum)、デリゲート(delegate)をサポートします。recordは、値ベースの等価性を持つ不変の参照型です(2つのレコードは、すべてのフィールドが等しい場合に等しい)。record structはC# 10で導入されたrecordの値版です。primary constructors(C# 12)は、宣言と初期化を1行に結合します。
// C#の基本型とクラス
using System;
using System.Collections.Generic;
// primary constructorを持つレコード(C# 12)
public record User(int Id, string Name, string Email);
// null許容プロパティを持つクラス
public class AppConfig
{
public string AppName { get; init; }
public string? ApiUrl { get; set; } // nullable reference type
public int Version { get; init; }
// 式本体を持つメソッド
public string GetDisplayName() => $"{AppName} v{Version}";
}
// 拡張メソッド
public static class StringExtensions
{
public static bool IsValidEmail(this string email) =>
email.Contains("@") && email.Contains(".");
}
// 使用法
var user = new User(1, "Alice", "alice@example.com");
bool validEmail = user.Email.IsValidEmail();primary constructorを持つレコードUserは、equals、hashCode、ToString、Deconstruct、withコピーを自動生成します。init-onlyセッター(AppName)は、初期化子でのみ値を設定できます。式本体(=>)は、シンプルなメソッドの簡潔な記法です。拡張メソッドIsValidEmailは、継承なしでstringにメソッドを追加します。
LINQは、コレクション、データベース、XMLのための組み込みクエリ言語です。LINQ to Objects — IEnumerableコレクションへのクエリ。LINQ to SQL — データベースへのクエリ。LINQ to XML — XMLへのクエリ。構文はクエリ構文(from u in users where u.Age > 18 select u)とメソッド構文(users.Where(u => u.Age > 18).Select(u => u))があります。遅延読み込み(遅延実行):クエリは宣言時ではなく、反復時に実行されます。
// コレクションへのLINQクエリ
using System.Linq;
var users = new List<User>
{
new User(1, "Alice", "alice@example.com"),
new User(2, "Bob", "bob@test.com"),
new User(3, "Charlie", "charlie@example.com"),
};
// クエリ構文
var filteredUsers = from u in users
where u.Email.Contains("example")
orderby u.Name
select u;
// 複数操作を含むメソッド構文
var result = users
.Where(u => u.Email.Contains("example"))
.OrderBy(u => u.Name)
.Select(u => new { u.Name, u.Email })
.ToList();
// GroupByと集計
var emailsByDomain = users
.GroupBy(u => u.Email.Split('@')[1])
.Select(g => new { Domain = g.Key, Count = g.Count() });
// 非同期ストリームを使用したLINQ(IAsyncEnumerable)
await foreach (var user in GetUsersAsync())
{
Console.WriteLine(user.Name);
}
async IAsyncEnumerable<User> GetUsersAsync()
{
yield return new User(1, "Alice", "alice@example.com");
await Task.Delay(100);
yield return new User(2, "Bob", "bob@test.com");
}LINQクエリfilteredUsersは、メールドメインでユーザーをフィルタリングし、名前で並べ替えます。メソッド構文.Where().OrderBy().Select()は、クエリ構文と同等のメソッドチェーンです。GroupByはメールドメインでグループ化します。IAsyncEnumerable(C# 8)はIEnumerableの非同期バージョンで、モバイルアプリケーションでのストリーミングデータ読み込みに便利です。
Xamarin(2011年~2024年)は、C#でのクロスプラットフォームモバイル開発のためのマイクロソフト初のプラットフォームでした。Xamarin.Android(Linuxカーネル上のMonoランタイム)とXamarin.iOS(iOSでのJIT禁止のためARM64へのAOTコンパイル)で構成されていました。Xamarin.Formsは、XAMLマークアップを使用した共有UIレイヤーで、要素をネイティブ(Android View / iOS UIView)に変換していました。
.NET MAUI(.NET Multi-platform App UI)はXamarinの後継で、2022年にリリースされました。単一の.csprojプロジェクト、1つのXAMLマークアップ、1つのエントリポイント。5つのプラットフォームをサポート:iOS、Android、Windows(WinUI 3)、macOS(Mac Catalyst)、Tizen。.NET MAUIはRendererの代わりに新しいHandlerアーキテクチャを使用します:各XAML要素はプラットフォームハンドラーを介してネイティブコンポーネントにマッピングされます。
<!-- MainPage.xaml — .NET MAUIの宣言型UI -->
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="MyApp.MainPage">
<ScrollView>
<VerticalStackLayout Padding="30" Spacing="25">
<Label Text="Welcome to .NET MAUI!"
FontSize="32"
HorizontalOptions="Center"/>
<Entry x:Name="NameEntry"
Placeholder="Enter your name"/>
<Button Text="Submit"
Clicked="OnSubmitClicked"
BackgroundColor="#512BD4"
TextColor="White"
CornerRadius="8"/>
<CollectionView x:Name="ItemsView"
SelectionMode="Single">
<CollectionView.ItemTemplate>
<DataTemplate>
<Grid Padding="10">
<Label Text="{Binding Name}"
FontSize="18"/>
</Grid>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
</VerticalStackLayout>
</ScrollView>
</ContentPage>.NET MAUIのXAMLマークアップはUIを宣言的に記述します。ScrollView — スクロール、VerticalStackLayout — 垂直配置。Label、Entry(テキスト入力)、Button — 基本要素。CollectionView — アイテム表示用のDataTemplateを持つ仮想化リスト。Clickedイベントは、MainPage.xaml.csのコードビハインドでOnSubmitClickedメソッドにバインドされます。
// MainPage.xaml.cs — C#ロジックを含むコードビハインド
namespace MyApp;
public partial class MainPage : ContentPage
{
private readonly List<User> _users = new();
public MainPage()
{
InitializeComponent();
LoadUsers();
}
private async void OnSubmitClicked(object? sender, EventArgs e)
{
var name = NameEntry.Text?.Trim();
if (string.IsNullOrEmpty(name))
{
await DisplayAlert("Error", "Name is required", "OK");
return;
}
_users.Add(new User(_users.Count + 1, name, $"{name}@example.com"));
ItemsView.ItemsSource = null;
ItemsView.ItemsSource = _users;
NameEntry.Text = string.Empty;
}
private async void LoadUsers()
{
var apiService = new ApiService();
var users = await apiService.GetUsersAsync();
_users.AddRange(users);
ItemsView.ItemsSource = _users;
}
}コードビハインドMainPageはContentPageを継承します。InitializeComponent()がXAMLマークアップをロードします。NameEntry.Text?.Trim() — 安全なアクセスのためのnull条件演算子(?.)。DisplayAlert — ネイティブダイアログ。ItemsView.ItemsSource — コレクションへのバインディング。非同期読み込みのためのasync/await。複雑なプロジェクトではMVVM(Model-View-ViewModel)パターンが推奨されます。
C#モバイル開発は、3つのアプローチを提供します:.NET MAUI(クロスプラットフォームUI)、Xamarin(レガシー)、Unity(ゲーム)。新しいプロジェクトには.NET MAUIが推奨されるパスです。C#アプリケーションはIntermediate Language(IL)にコンパイルされ、NativeAOT(.NET MAUI)またはMono(Xamarin)がネイティブARMコードに変換します。iOSではAOTコンパイルが必要です — JITはAppleのポリシーで禁止されています。
.NET MAUIは、インターフェースを介してプラットフォーム機能を操作するための統合APIを提供します:IAccelerometer、IBarometer、IBattery、IConnectivity、IDeviceInfo、IFilePicker、IGeolocation、IMediaPicker、IPermissions、ISpeechRecognizer、IVibration。プラットフォーム固有のコードには、条件付きコンパイル(#if ANDROID、#if IOS)または部分クラスが使用されます。
// DIを使用した.NET MAUIでの位置情報取得
public class LocationService
{
private readonly IGeolocation _geolocation;
public LocationService(IGeolocation geolocation)
{
_geolocation = geolocation;
}
public async Task<Location?> GetCurrentLocation()
{
try
{
var permission = await CheckAndRequestPermission();
if (permission != PermissionStatus.Granted)
return null;
var location = await _geolocation.GetLastKnownLocationAsync();
if (location == null)
{
location = await _geolocation.GetLocationAsync(new GeolocationRequest
{
DesiredAccuracy = GeolocationAccuracy.Medium,
Timeout = TimeSpan.FromSeconds(10)
});
}
return location;
}
catch (Exception ex)
{
Debug.WriteLine($"位置エラー:{ex.Message}");
return null;
}
}
private async Task<PermissionStatus> CheckAndRequestPermission()
{
var status = await Permissions.CheckStatusAsync<Permissions.LocationWhenInUse>();
if (status != PermissionStatus.Granted)
{
status = await Permissions.RequestAsync<Permissions.LocationWhenInUse>();
}
return status;
}
}LocationServiceはDI(IGeolocationの依存性注入)を使用します。CheckAndRequestPermissionは位置情報の許可を確認して要求します。GetLastKnownLocationAsync — 高速(ただし常に正確とは限らない)応答、GetLocationAsync — 精度とタイムアウトパラメータによる要求。null許容参照型によるnullチェック(location == null)。try-catchでプラットフォーム例外を処理します。
C#はモバイルデバイスにおいて、Android上のJava/KotlinやiOS上のSwiftに匹敵するパフォーマンスを示します。NativeAOT(.NET 8以降)は、IL中間段階なしでC#を直接ネイティブコードにコンパイルします — これにより起動時間が50%短縮され、メモリ消費が削減されます。.NET MAUIのGCは、短い一時停止(Workstation GC)でモバイルプラットフォーム向けに最適化されています。APKサイズは約20~30MB(NativeAOT使用時)です。
| パラメータ | Xamarin | .NET MAUI |
|---|---|---|
| アーキテクチャ | Xamarin.Android + Xamarin.iOS | 単一.csprojプロジェクト |
| UIレンダリング | Renderer(Xamarin.Forms) | Handler(.NET MAUI) |
| コンパイル | Mono JIT(Android)、AOT(iOS) | NativeAOT(全プラットフォーム) |
| ステータス | メンテナンスモード | 活発な開発 |
| プラットフォーム | Android、iOS、Windows | Android、iOS、Windows、macOS、Tizen |
.NETプラットフォームは、マネージドコードを実行するためのエコシステムであり、CLR(Common Language Runtime)、BCL(Base Class Library)、サーバー開発向けのASP.NET Core、モバイルアプリケーション向けの.NET MAUIを含みます。.NET 8以降は、すべてのタイプのアプリケーション(モバイル、デスクトップ、Web、クラウド、IoT、ゲーム(Unity))のための統合プラットフォームです。
CLRはCIL(Common Intermediate Language)コードを実行する仮想マシンです。C#、VB.NET、F#はCILにコンパイルされます。CLRのJITコンパイラは、最初のメソッド呼び出し時にCILをマシンコードに変換します。NativeAOT(事前コンパイル)はビルド時にCILをネイティブコードにコンパイルします — JITが制限される可能性があるモバイルプラットフォーム(iOS)に最適です。
.NETのガベージコレクターGCは世代別(世代0、1、2)で、未使用のオブジェクトを自動的に解放します。モバイルアプリケーションには、最小限の一時停止でWorkstation GCが推奨されます。GCはUIスレッドをブロックせずに別のスレッドで実行されます。Background GCは、インタラクティブアプリケーションの一時停止を最小限に抑えるバックグラウンドコレクターです。
C#開発者ツールには、Visual Studio、.NET SDK、dotnet CLI、NuGet、JetBrains Riderが含まれます。Visual Studio 2022は、XAMLデザイナー、マネージドコードおよびネイティブコードデバッガー、CPU/メモリプロファイラーを備えた主要なIDEです。.NET SDKにはcscコンパイラ、dotnet CLI(dotnet new、dotnet build、dotnet publish、dotnet test)が含まれます。
NuGetは.NETのパッケージマネージャーで、JSのnpmに似ています。300,000以上のパッケージがあり、CommunityToolkit.Maui(UIコンポーネント)、SQLite-net(データベース)、Firebase Cloud Messaging、ZXing.Net.Maui(QRコード)などが含まれます。.NET MAUI Community Toolkitは、開発を加速するためのビヘイビア、コンバーター、アニメーションのセットです。RestSharpとRefitはHTTPクライアントです。PrismとMVVM Community Toolkitはアーキテクチャフレームワークです。
<!-- .csproj — .NET MAUIプロジェクト構成 -->
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net8.0-android;net8.0-ios;net8.0-maccatalyst</TargetFrameworks>
<OutputType>Exe</OutputType>
<UseMaui>true</UseMaui>
<ApplicationTitle>MyMAUIApp</ApplicationTitle>
<ApplicationId>com.example.mymauiapp</ApplicationId>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="CommunityToolkit.Maui" Version="9.0.0" />
<PackageReference Include="sqlite-net-pcl" Version="1.9.172" />
<PackageReference Include="Refit" Version="7.0.0" />
</ItemGroup>
</Project>.csprojファイルは.NET MAUIプロジェクトの構成です。TargetFrameworksはターゲットプラットフォームを列挙します。UseMauiはMAUI SDKを有効にします。PackageReferenceはNuGetからの依存関係を指定します。CommunityToolkit.MauiはUIコンポーネント(トースト、スナックバー、ポップアップ)を提供します。sqlite-net-pclはローカルデータベースです。Refitはインターフェースベースの型付きHTTPクライアントです。dotnet build/publishはすべてのプラットフォーム向けにアプリケーションをビルドします。
よくある質問
C#はマイクロソフト(2000年)のオブジェクト指向プログラミング言語で、.NETプラットフォーム(CLR)上で動作します。Xamarinおよび.NET MAUIを通じてモバイル開発に使用されます。厳格な静的型付け、自動メモリ管理(GC)、LINQ、async/await、ジェネリクスを組み合わせています。TIOBEインデックス(2026年)で4位にランクされています。アンダース・ヘルツバーグによって開発されました。
Xamarinは先代(2011年~2024年)で、プロジェクトをXamarin.AndroidとXamarin.iOSに分けていました。.NET MAUI(2022年以降)は、共有XAMLマークアップ、Rendererの代わりにHandlerアーキテクチャ、5つのプラットフォーム(iOS、Android、Windows、macOS、Tizen)のサポートを備えた単一の.csprojプロジェクトです。Xamarinはメンテナンスモードに移行し、新しいプロジェクトは.NET MAUIで作成されます。NativeAOTは.NET MAUIでのみ利用可能です。
C#はCIL(Common Intermediate Language)にコンパイルされ、NativeAOT(.NET MAUI)またはMono(Xamarin)がネイティブARMコードに変換します。AndroidはILを実行するためにMonoランタイム(Xamarin)またはNativeAOT(.NET MAUI)を使用します。iOSはAOTコンパイルが必要です — JITはAppleによって禁止されています。.NET MAUIは、インターフェースを介したプラットフォーム実装により、カメラ、GPS、センサー向けの統合APIを提供します。
C#は型を値型(int、double、bool、char、struct、enum — スタック)と参照型(string、class、interface、array、delegate、record — ヒープ)に分類します。null許容型(int?)は値型にnullを許可します。record(C# 9)は値ベースの等価性を持つ不変の参照型です。record struct(C# 10)は値版です。dynamic — 動的型付け。var — コンパイラの型推論。
Visual Studio 2022(Windows)およびVisual Studio for Macが、XAMLデザイナー、デバッガー、プロファイラーを備えた主要なIDEです。.NET SDK — cscコンパイラ、dotnet CLI、MSBuild。NuGet — パッケージマネージャー(300,000以上)。CommunityToolkit.Maui — UIコンポーネント。JetBrains Rider — 代替IDE。テスト:xUnit、NUnit、Moq。CI/CD:Azure DevOps、GitHub Actions。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。