ホームページ バックエンド開発 C#.Net チュートリアル C#の匿名オブジェクト、var、動的型dynamicの詳細説明

C#の匿名オブジェクト、var、動的型dynamicの詳細説明

Sep 06, 2017 pm 01:53 PM
.net タイプ

C# の開発により、言語の内容は充実し続け、開発はより便利かつ高速になり、C# の鋭さは間違いなく明らかになります。 C# 言語は誕生以来、型指定が強い言語であり、その性質は現在も変わっていませんし、今後も変わらないと思います。厳密に型指定された言語であるため、作成されるプログラムは次の基本条件を満たす必要があります:

1. 変数宣言はその型を示す必要があります

2. 変数の型が明確になった後は、実行時にその型を変更することはできません

コードは次のとおりです:

    public  class Student
    {        
    public string Name { get; set; }        
    public int Age { get; set; }        
    public string Like { get; set; }
    }
ログイン後にコピー
static void Main(string[] args)
{    int a = 10;    string s = "abc";
    Student student = new Student();    //下面出现编译错误,变量类型在声明后无法再变更
    s = a;
    student = s;
    a = 10.1f;
}
ログイン後にコピー

しかし、実際の開発では、次のような一般的な問題に直面することがよくあります:

1. より大きなプログラムでは、特定のまたは他の場所では必要なくなった特定のタイプ (上記の Student など)。 Student タイプを個別に宣言すると、必要なコードの量がこのタイプを使用するときのコードの量を超える可能性があり、投資対生産の比率は費用対効果が高くありません。

2. プログラムでは、特定の種類のオブジェクトの一部の属性またはメソッドのみが操作に参加する必要があります。この場合、このタイプのオブジェクトを、プログラムに必要なプロパティとメソッドの一部を備えたオブジェクトに一時的に変換すると、プログラムをより合理化できます。

3. その他の状況... まだ気づいていません... 追加を歓迎します...

C# の実際の開発、JavaScript 開発における上記の一般的な問題には、次のようなより良い解決策があります:

//在此处js中需要模拟一个学生对象
student = {"name":"张三","age":20,"like":"LOL"};
//在此处js中需要模拟一个老师对象
teacher = {"name":"李老师","like":"没收学生手机,自己LOL"};
//此处需要将学生student转换成只有name和age的对象
person = {"name":student.name,"age":student.age};
ログイン後にコピー

上記の js 構文に慣れていない場合は、Baidu にアクセスして「json 構文」を検索してください。それは非常に簡単 (そして非常に重要) であることがわかります。

匿名オブジェクト (匿名型)

そのため、C# はバージョン 3.0 で JavaScript スクリプト言語の文法上の利点を吸収し、この文法形式をサポートするためにそれに応じて C# をアップグレードしました (C# は依然として強く型付けされた言語 )。サンプル コードは次のとおりです。

static void Main(string[] args)
{     new {Name="张三",Age=20,Like="LOL"};
}
ログイン後にコピー

上記の C# コードでは、 new キーワードを使用して、オブジェクトに 3 つの属性 (Name、Age、Like) があり、その後に = と対応する属性の値が続きます。 。このようにして、 「オブジェクトを作成するには、まずオブジェクト タイプの制約が必要である」という事態を避けることができます。 したがって、開発プロセス中にあまり使用されないタイプに対して別のクラスを作成する必要がなくなり、上記の問題 1 は解決されます

今作成したオブジェクトは特定の型を指定していないため、匿名オブジェクトと呼ばれます。

Var はこちらです

匿名オブジェクトを使用するには、変数を使用してそれを参照する必要があります。オブジェクトの作成時にオブジェクトの型を指定しませんが、コンパイラは、コンパイル プロセス中に関連するプロパティとメソッドを備えた型の作成を支援します。このときコンパイルされる型名はランダムに生成されるため、変数の型を決定することはできません。例は次のとおりです:

static void Main(string[] args)
{    //XXX为类型声明    //x为引用变量 
     XXX x = new {Name="张三",Age=20,Like="LOL"};
}
ログイン後にコピー

コンパイラーによって生成された型名はわかりませんが、コンパイラーにコンパイル結果に基づいて変数の型を推測させることができます。 このとき、var キーワードが登場します:

static void Main(string[] args)
{     var x = new {Name="张三",Age=20,Like="LOL"};
}
ログイン後にコピー

var キーワードは、

var の使用上の注意:

1 の型がメソッド内でのみローカル変数を宣言できることを説明します

2 var で宣言された変数の型は代入後に決定され、それ以降のプログラムでは他の型を代入することはできません

3 の値は意味がありません。このようなコードは記述しないでください。 .....

匿名オブジェクトと var が追加されました。推論型のサポートにより、上記の問題 2 に対処できます。サンプルコードは次のとおりです:

        static void Main(string[] args)
        {            
        var x = new { Name = "张三", Age = 20, Like = "LOL" };            
        var s = new { Name = x.Name, Age = x.Age };  
        }
ログイン後にコピー

上記は単なる例です。Linq または Entity Framework に精通している場合は、質問 2 に対応する使用方法が圧倒的になるでしょう...

動的型の Dynamic が表示されます

匿名型 の使用は通常、メソッドのローカル部分に限定されます。これは

: として理解でき、使用するときに定義され、使用後に消えます。 次のような場合はどうすればよいですか?

        static void Main(string[] args)
        {            
        var x = GetObject(); 
        }        
        private static XXX GetObject()
        {            
        return new { Name = "张三", Age = 20, Like = "LOL" };
        }
ログイン後にコピー
GetObjectメソッドで匿名オブジェクトが返されるため、メソッドの戻り値の型名が特定できないため、ここでは一時的にXXXに置き換えます。この場合、戻り値の型は未定義であり、dynamic を使用して指定できます。以下の通り:

          Main( x =    { Name = , Age = , Like =
ログイン後にコピー

現時点ではメソッドに構文エラーはなく、プログラムは正常にコンパイルおよび実行できます。では、上記のプログラムを正常にコンパイルするには、dynamic は正確に何をするのでしょうか?

動的の役割:

1. 動的は動的型を表します。動的型の意味は、実行時に、関連するオブジェクトのプロパティまたはメソッドが決定されることです。反射機構。したがって、書き込みフェーズでは構文チェックは実行されません。

2. Dynamic は、フィールド、属性、メソッドのパラメーター、およびメソッドの戻り値を宣言するために使用できます

3. Dynamic は、コードを作成するときに分からないため、スマート プロンプトをサポートしません (リフレクション)

動的に宣言された変数は、オブジェクト型変数として理解できます。したがって、動的変数に任意のタイプの値を代入することは正しいことですが、変数を使用してプロパティ値を取得したり、メソッドを呼び出したりする場合 (この時点でプログラムはランタイム状態である必要があります)、CLR は (リフレクション) 呼び出されたプロパティまたはメソッドが存在するかどうかに関係なく、実行時例外は報告されません。

dynamic は Asp.net Mvc Web 開発のいたるところで使用されますが、本質は上記のとおりです。

説明:

varとdynamicは似たような機能があるように見えますが、異なります:

var dynamic
宣言フィールド ×
ローカル変数
メソッドパラメータの型 ×
メソッドの戻り値の型

以上がC#の匿名オブジェクト、var、動的型dynamicの詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Windows 11でネットワークの種類をプライベートまたはパブリックに変更する方法 Windows 11でネットワークの種類をプライベートまたはパブリックに変更する方法 Aug 24, 2023 pm 12:37 PM

ワイヤレス ネットワークのセットアップは一般的ですが、ネットワークの種類の選択または変更は、特に結果が分からない場合には混乱する可能性があります。 Windows 11 でネットワークの種類をパブリックからプライベートに、またはその逆に変更する方法についてのアドバイスをお探しの場合は、役立つ情報をお読みください。 Windows 11 のさまざまなネットワーク プロファイルとは何ですか? Windows 11 には、多数のネットワーク プロファイルが付属しています。これらのプロファイルは、基本的に、さまざまなネットワーク接続を構成するために使用できる設定のセットです。これは、自宅やオフィスに複数の接続がある場合に便利で、新しいネットワークに接続するたびにすべてを設定する必要がありません。プライベート ネットワーク プロファイルとパブリック ネットワーク プロファイルは Windows 11 の 2 つの一般的なタイプですが、一般的には

いくつかの .NET オープンソース AI および LLM 関連プロジェクト フレームワークを共有する いくつかの .NET オープンソース AI および LLM 関連プロジェクト フレームワークを共有する May 06, 2024 pm 04:43 PM

現在、人工知能(AI)技術の開発は本格化しており、さまざまな分野で大きな可能性と影響力を発揮しています。本日、Dayao は、参考にしていただけるよう、4 つの .NET オープン ソース AI モデル LLM 関連プロジェクト フレームワークを共有します。 https://github.com/YSGStudyHards/DotNetGuide/blob/main/docs/DotNet/DotNetProjectPicks.mdSemanticKernelSemanticKernel は、OpenAI、Azure などの大規模言語モデル (LLM) を統合するように設計されたオープン ソース ソフトウェア開発キット (SDK) です。

C# の雇用の見通しはどのようなものですか? C# の雇用の見通しはどのようなものですか? Oct 19, 2023 am 11:02 AM

初心者でも経験豊富なプロフェッショナルでも、C# をマスターすることでキャリアへの道が開かれます。

ビデオ マトリックス アカウントを作成するにはどうすればよいですか?どのようなタイプのマトリックスアカウントがありますか? ビデオ マトリックス アカウントを作成するにはどうすればよいですか?どのようなタイプのマトリックスアカウントがありますか? Mar 21, 2024 pm 04:57 PM

ショートビデオプラットフォームの人気に伴い、ビデオマトリックスアカウントマーケティングが新たなマーケティング手法となっています。企業や個人は、さまざまなプラットフォームで複数のアカウントを作成および管理することで、ブランドのプロモーション、ファンの増加、製品の販売などの目標を達成できます。この記事では、ビデオ マトリックス アカウントの効果的な使用方法について説明し、さまざまな種類のビデオ マトリックス アカウントを紹介します。 1. ビデオ マトリックス アカウントを作成するにはどうすればよいですか?優れたビデオ マトリックス アカウントを作成するには、次の手順に従う必要があります。 まず、ブランド コミュニケーション、ファンの増加、製品の販売など、ビデオ マトリックス アカウントの目標を明確にする必要があります。明確な目標を持つことは、それに応じた戦略を立てるのに役立ちます。 2. プラットフォームの選択: 対象視聴者に基づいて、適切なショートビデオ プラットフォームを選択します。現在主流のショートビデオプラットフォームには、Douyin、Kuaishou、Huoshan Videoなどが含まれます。

Python での動的配列の実装: 初心者から熟練者まで Python での動的配列の実装: 初心者から熟練者まで Apr 21, 2023 pm 12:04 PM

パート 1 Python シーケンス型の性質について話しましょう。このブログでは、Python のさまざまな「シーケンス」クラスと、一般的に使用される 3 つの組み込みデータ構造 (リスト、タプル、文字) について話します。文字列クラス (str) の性質)。お気づきかどうかはわかりませんが、これらのクラスには明らかな共通点があります。複数のデータ要素を保存するために使用できます。最も重要な機能は、各クラスがシーケンスの要素への添え字 (インデックス) アクセスをサポートしていることです。 SyntaxSeq[i] の使用など。実際、上記の各クラスは配列などの単純なデータ構造で表されます。ただし、Python に詳しい読者は、これら 3 つのデータ構造にいくつかの違いがあることをご存じかもしれません。たとえば、タプルと文字列は変更できませんが、リストは変更できます。

Golang関数の戻り値の型は何ですか? Golang関数の戻り値の型は何ですか? Apr 13, 2024 pm 05:42 PM

Go 関数は、異なる型の複数の値を返すことができます。戻り値の型は関数シグネチャで指定され、return ステートメントを通じて返されます。たとえば、関数は funcgetDetails()(int,string) のように整数と文字列を返すことができます。実際には、円の面積を計算する関数は、面積とオプションのエラーを返すことができます: funccircleArea(radiusfloat64)(float64,error)。注: 関数シグネチャで型が指定されていない場合は、null 値が返されます。読みやすさを向上させるために、明示的な型宣言を含む return ステートメントを使用することをお勧めします。

Python の型ヒントのベスト プラクティス Python の型ヒントのベスト プラクティス Apr 23, 2023 am 09:28 AM

しばらくの間動的言語を使用するのは素晴らしいことです。コードは火葬場で再構築されます。単体テストと同様に、コードを書くのに少し時間はかかりますが、長い目で見ると非常に価値のある作業です。この記事では、Python の型ヒントをよりよく理解し、使用する方法を説明します。 1. 型ヒントは構文レベルでのみ有効です。型ヒント (PEP3107 以降導入) は、変数、パラメーター、関数パラメーター、およびその戻り値、クラス プロパティ、メソッドに型を追加するために使用されます。 Python の変数型は動的であり、実行時に変更してコードに型ヒントを追加できます。変数型は構文レベルでのみサポートされ、コードの実行には影響しません。Python インタープリタは、コードの実行時に型ヒントを無視します。したがってタイプは

C++ 関数の種類と特性 C++ 関数の種類と特性 Apr 11, 2024 pm 03:30 PM

C++ 関数には、単純関数、const 関数、静的関数、および仮想関数というタイプがあり、インライン関数、デフォルト パラメーター、参照戻り値、およびオーバーロードされた関数などの機能が含まれます。たとえば、calculateArea 関数は π を使用して、指定された半径の円の面積を計算し、それを出力として返します。

See all articles