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 は正確に何をするのでしょうか?
動的に宣言された変数は、オブジェクト型変数として理解できます。したがって、動的変数に任意のタイプの値を代入することは正しいことですが、変数を使用してプロパティ値を取得したり、メソッドを呼び出したりする場合 (この時点でプログラムはランタイム状態である必要があります)、CLR は (リフレクション) 呼び出されたプロパティまたはメソッドが存在するかどうかに関係なく、実行時例外は報告されません。
dynamic は Asp.net Mvc Web 開発のいたるところで使用されますが、本質は上記のとおりです。
説明:
varとdynamicは似たような機能があるように見えますが、異なります:
var | dynamic | |
宣言フィールド | × | √ |
ローカル変数 | √ | √ |
メソッドパラメータの型 | × | √ |
メソッドの戻り値の型 |
以上がC#の匿名オブジェクト、var、動的型dynamicの詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。