ホームページ  >  記事  >  バックエンド開発  >  C# の一般的な制約についての詳細なグラフィックとテキストの紹介

C# の一般的な制約についての詳細なグラフィックとテキストの紹介

黄舟
黄舟オリジナル
2017-03-07 10:59:151532ブラウズ

この記事では、C# ジェネリックの制約、つまり参照値の型の制約、コンストラクターの変換の型の制約、および組み合わせの制約について詳しく紹介します。非常に優れた参照値を持っています。以下のエディターで見てみましょう

1. 参照型の制約

struct RefSample8742468051c85b06f0a0af9e3e506b5c ここで、参照型は制約を表すために Class を使用します。 、およびその他の参照 Type は具体的な制約です。 は、制約がクラス (参照型) である必要があり、値型 (int、char、datatime、struct) であることはできません。区別するためにインターフェイス

にすることができます。配列は参照型であることを意味します。配列の場合は、新しいオブジェクトを作成する必要があります。

RefSample8742468051c85b06f0a0af9e3e506b5c として定義されていますが、渡されるのは参照型である必要がありますが、RefSample は依然として値型です

2. 値型の制約

class ValSample8742468051c85b06f0a0af9e3e506b5c ここで、T:struct

は参照型です。int、char およびその他の型はすべて struct

ValSamplebd43222e33876353aff11e13a7dc75f6

3. コンストラクターの型制約

public T CreateInstance<T>() where T:new()
{
  return new T();
}

指定された型 T は次のとおりです。持っていますコンストラクター、CreateInstancebd43222e33876353aff11e13a7dc75f6 と CreateInstance273238ce9338fbb04bee6997e5552b95 は両方とも有効です。ただし、CreateInstance8ac337f12ac35ec97e8dd89560472ecc にはコンストラクターがありません。

4. 変換型の制約

制約を使用すると、別の型を指定できます。型引数は、一貫性、参照、またはボックス化変換を通じてその型に暗黙的に変換可能である必要があります。型引数が別の型引数に変換可能である必要があることを指定することもできます。これは型パラメーター制約と呼ばれます。

理解した意味: 交換可能、つまり、ボックス化または強制型を通じてターゲットの型に変換できる任意の型を使用して型パラメーターを渡すことができます。

class Sample8742468051c85b06f0a0af9e3e506b5c ここで T:Stream

Valid: Sample7deb1b66c2439bfe6895a394cbb2197a これ自体は制約 Invalid:Samplef7e83be87db5cd2d9a8a0b8117b38cd4 に準拠します。 boxing と unboxing 、

struct Sample8742468051c85b06f0a0af9e3e506b5c ここで、T:IDisposable

は、T が IDisposable 型の参照型でなければならないと規定しています 有効: Sampleee3398fcc71686d89f0818db05b7a88f 無効: Sample

分析 : SqlConnection はできるのに StringBuilder はできないのはなぜですか?これらはすべて参照型です

1。SqlConnection は IDisposable インターフェイスを実装するため、共変にすることができます

2。StringBuilder は ISerializable インターフェイスのみを実装し、変換できません。 I使い捨てチャネルを通じて

class Sample8742468051c85b06f0a0af9e3e506b5c ここで、T:IComparable8742468051c85b06f0a0af9e3e506b5c

IComparable8742468051c85b06f0a0af9e3e506b5c の型はType.IsValueType によって分析および判定され、 true は値型、 false は参照型

typeof(IComparablec557f981802890daaae2ecc5781424a2 (ボックス化変換) 無効: Sampled0869186ef29f1614dd65eb5411320d5

複数の制約を指定することもできます:

T: stream、IEnumerable98c455a79ddfebb79781bff588e7b37e、IComparablebd43222e33876353aff11e13a7dc75f6

class Samplea62d1d8805a91a8900e4e7c7c3ba59db where T :U

有効: Sample8ef407ed57caac12483dcecdcac4eb46

無効: Sample6f72722a2a297c03396b6f57d1a9f381

概要: 受信クラスパラメータが変換することができ、指定されたパラメータと受信クラス パラメータが実装されているかどうかを確認します。同じインターフェイスが実装されている場合は OK、そうでない場合は失敗します。

は、System.Object、System.Enum、System.ValueType、System.Delegate、構造体またはシールされたクラス (String)

5. 型パラメーターの組み合わせ制約 です。注: 値型と参照型は同時に存在することはできません。参照型と値型の両方である必要はありません。

すべての値型にはコンストラクターのない関数があるため、それ以降はコンストラクター制約はありません

有効:

class Sample8742468051c85b06f0a0af9e3e506b5c ここで T: class, IDisposable, new()
class Samplea62d1d8805a91a8900e4e7c7c3ba59db where T: Stream where U: IDispsable

Invalid:

class Sample8742468051c85b06f0a0af9e3e506b5c where T: class, struct (即時参照型はなく、値型であるため無効です)

class Sample8742468051c85b06f0a0af9e3e506b5c where T:ストリーム、クラス (参照型制約は先頭に配置される最初の制約である必要があるため、無効です) ストリームは、受信パラメーターを特定の型の Stream に制約するだけであり、クラス制約は参照型です。最初、
class Sample8742468051c85b06f0a0af9e3e506b5c where T:new(),Stream (new() は最後に置く必要があります)

class Sample8742468051c85b06f0a0af9e3e506b5c where T:IDisposable, Stream ( class はインターフェイスの前に配置する必要があるため、無効です)

class Sample8742468051c85b06f0a0af9e3e506b5c where T: struct where U: Class, T (型パラメータ "T" には "struct" 制約があるため、" T" は "U" の制約として使用できないので無効です)

class Sampleabbd655bd3f9f929be0207abcc18a2ef where T: Stream, U: IDisposable 構文エラー

このバージョンも であることがわかりました インターネット上で有効

理解できません: class サンプル8742468051c85b06f0a0af9e3e506b5c ここで、T: struct, IDisapsable IDisapsable は値型ですか?

class Samplea62d1d8805a91a8900e4e7c7c3ba59db where T:class where U:struct ,T T は、なぜ U を値の型と一緒に制約するのでしょうか。

修正していただければ幸いです

上記は、C# の汎用制約を図で詳しく説明したものです。関連コンテンツの詳細については、PHP 中国語 Web サイト (www.php.cn) に注目してください。 )!


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。