Skip to content

JA CSharp Keyword managed function pointer calling convention

Codex edited this page Oct 11, 2026 · 2 revisions

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#: managed — 関数ポインター呼び出し規約

ディレクトリ C# · 実践的な指導

delegate* タイプでの管理は、管理された通話協定を指定します。これはデフォルトのオプションでもあります。アドレスは、静的メソッドから & 演算子によって取得されます。ポインターの宣言と呼び出しは安全でないコンテキストで実行されます。プロジェクトでは安全でないブロックを許可する必要があります。関数ポインターはデリゲート オブジェクトではありません。

簡単な例 (Example.cs)

この例を Example.cs として別に保存し、このページの他の例とは独立して実行してください。

Example.cs:

// PROJECT-EXAMPLE
unsafe
{
    delegate* managed<int, int> twice = &Twice;
    System.Console.WriteLine(twice(4));
}
static int Twice(int value) => value * 2;

プロジェクトで <AllowUnsafeBlocks>true</AllowUnsafeBlocks> を有効にしてください。ポインターは示されたスコープ内でのみ有効です。

結果:

8

構文

delegate* managed<int, int> operation = &Transform;

二乗を計算するための静的メソッドのアドレス

ファイルExample.csproj:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net10.0</TargetFramework>
    <LangVersion>14.0</LangVersion>
    <Nullable>enable</Nullable>
    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
  </PropertyGroup>

</Project>

ファイルProgram.cs:

using System;

internal static unsafe class Program
{
    public static void Main()
    {
        delegate* managed<int, int> square = &Square;
        Console.WriteLine(square(7));
    }
    private static int Square(int value) => value * value;
}

結果:

49

選択した操作を別のメソッドに渡す

ファイルExample.csproj:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net10.0</TargetFramework>
    <LangVersion>14.0</LangVersion>
    <Nullable>enable</Nullable>
    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
  </PropertyGroup>

</Project>

ファイルProgram.cs:

using System;

internal static unsafe class Program
{
    public static void Main()
    {
        delegate* managed<int, int, int> combine = &Add;
        Console.WriteLine(Apply(combine, 8, 3));
        combine = &Subtract;
        Console.WriteLine(Apply(combine, 8, 3));
    }
    private static int Apply(delegate* managed<int, int, int> operation, int left, int right)
        => operation(left, right);
    private static int Add(int left, int right) => left + right;
    private static int Subtract(int left, int right) => left - right;
}

結果:

11
5

公式ソース: Microsoft Learn。

Clone this wiki locally