JA CSharp Keyword unmanaged generic type constraint - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki

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

C#: unmanaged — タイプパラメータ制限

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

where T : アンマネージ制約では、構成内にマネージド参照を含まない値型のみが許可されます。これにより、許可された安全でないコンテキストで sizeof(T) と T* を使用できるようになります。これは型の制約であり、関数呼び出し規則ではありません。別の構造体や new() とは結合されません。

簡単な例 (Example.cs)

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

Example.cs:

// PROJECT-EXAMPLE
int Size<T>() where T : unmanaged
{
    unsafe { return sizeof(T); }
}
System.Console.WriteLine(Size<int>());

結果:

4

構文

static int ByteSize<T>() where T : unmanaged;
static void Swap<T>(T* left, T* right) where T : unmanaged;

参照のない単純な型と構造体のサイズ

ファイル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;

public struct GridPoint { public int X; public int Y; }
internal static unsafe class Program
{
    public static void Main()
    {
        Console.WriteLine(ByteSize<int>());
        Console.WriteLine(ByteSize<GridPoint>());
    }
    private static int ByteSize<T>() where T : unmanaged => sizeof(T);
}

結果:

4
8

ポインタを介した一般化された値の交換

ファイル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()
    {
        int left = 10;
        int right = 25;
        Swap(&left, &right);
        Console.WriteLine($"{left},{right}");
    }
    private static void Swap<T>(T* left, T* right) where T : unmanaged
    {
        T temporary = *left;
        *left = *right;
        *right = temporary;
    }
}

結果:

25,10

公式ソース: Microsoft Learn。

⚠️ **GitHub.com Fallback** ⚠️