C#中匿名对象与var以及动态类型 dynamic的详解
随着C#的发展,该语言内容不断丰富,开发变得更加方便快捷,C# 的锋利尽显无疑。C# 语言从诞生起就是强类型语言,这一性质到今天不曾改变,我想以后也不会变。既然是强类型语言,那编写任一程序均要求满足下面的基本条件:
1、变量声明必须指明其类型
2、变量类型明确后,其类型在Runtime亦不能改变
代码如下:
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、在一个较大的程序程序中,只有一处或很少几处(不超过3处)需要用到 某个或某些类型(如上 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语法,你可以去百度搜索 “json语法”,告诉你很简单哦(而且很重要)。
匿名对象(匿名类型)
因此C#在3.0版本中吸收了JavaScript脚本语言的这种语法优点,对C#做了相应升级使其也支持这种语法形式(C#依然是强类型语言)。示例代码如下:
static void Main(string[] args) { new {Name="张三",Age=20,Like="LOL"}; }
上面的C#代码 通过new关键字告诉编译器要创建一个对象,该对象具有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 关键字说明 x 的类型由赋于的值来决定(推定),并能根据编译器推定给出智能提示,如下图:
var使用注意事项:
1、var 仅能声明方法内的局部变量
2、var 声明的变量在被赋值后类型即确定下了,后续程序中不能在赋其他类型的值
3、var x = new object() 没有意义,不要写这样的代码...............
现在有匿名对象和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 到底做了什么,可以使上面的程序成功编译呢?
dynamic的作用:
1、dynamic 表示动态类型,动态类型的含义就是 程序编写、编译阶段 类型不确定,在Runtime时再通过反射机制确定相关对象的属性或方法。因此编写阶段不会进行语法检测。
2、dynamic 可用来声明 字段、属性、方法参数、方法返回值
3、dynamic 不支持智能提示,因为你写代码时 dynamic 是什么没法知晓(反射)
dynamic 声明的变量,可理解为 object 类型变量。所以给dynamic变量赋任何类型值都正确,但在使用变量来取得某个属性值或调用某方法时(此时程序肯定处于Runtime状态),CLR会检查(反射)所调用的属性或方法是否存在,不存在报运行时异常。
dynamic在 Asp.net Mvc web开发中处处使用,虽然看上去很复杂,本质就上面所说内容。
说明:
var 和 dynamic 看似功能类似,但它们是不同的:
var | dynamic | |
声明字段 | × | √ |
局部变量 | √ | √ |
方法参数类型 | × | √ |
方法返回值类型 | × | √ |
Atas ialah kandungan terperinci C#中匿名对象与var以及动态类型 dynamic的详解. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Menyediakan rangkaian wayarles adalah perkara biasa, tetapi memilih atau menukar jenis rangkaian boleh mengelirukan, terutamanya jika anda tidak tahu akibatnya. Jika anda sedang mencari nasihat tentang cara menukar jenis rangkaian daripada awam kepada peribadi atau sebaliknya dalam Windows 11, baca terus untuk mendapatkan beberapa maklumat berguna. Apakah profil rangkaian yang berbeza dalam Windows 11? Windows 11 dilengkapi dengan beberapa profil rangkaian, yang pada asasnya merupakan set tetapan yang boleh digunakan untuk mengkonfigurasi pelbagai sambungan rangkaian. Ini berguna jika anda mempunyai berbilang sambungan di rumah atau pejabat supaya anda tidak perlu menyediakan semuanya setiap kali anda menyambung ke rangkaian baharu. Profil rangkaian peribadi dan awam ialah dua jenis biasa dalam Windows 11, tetapi secara amnya

Sama ada anda seorang pemula atau profesional yang berpengalaman, menguasai C# akan membuka jalan untuk kerjaya anda.

Bahagian 1 Mari kita bincangkan tentang sifat jenis jujukan Python Dalam blog ini, mari kita bincangkan tentang pelbagai kelas "jujukan" Python dan tiga struktur data terbina dalam yang biasa digunakan - senarai, tuple dan sifat kelas rentetan (str ). Saya tidak tahu sama ada anda perasan, tetapi kelas ini mempunyai persamaan yang jelas. Mereka boleh digunakan untuk menyimpan berbilang elemen data. seperti menggunakan SyntaxSeq[i]. Malah, setiap kelas di atas diwakili oleh struktur data mudah seperti tatasusunan. Walau bagaimanapun, pembaca yang biasa dengan Python mungkin tahu bahawa ketiga-tiga struktur data ini mempunyai beberapa perbezaan: contohnya, tupel dan rentetan tidak boleh diubah suai, manakala senarai boleh.

Perkembangan teknologi kecerdasan buatan (AI) sedang giat dijalankan hari ini, dan ia telah menunjukkan potensi dan pengaruh yang besar dalam pelbagai bidang. Hari ini Dayao akan berkongsi dengan anda 4 rangka kerja projek berkaitan LLM model AI sumber terbuka .NET, dengan harapan dapat memberi anda sedikit rujukan. https://github.com/YSGStudyHards/DotNetGuide/blob/main/docs/DotNet/DotNetProjectPicks.mdSemanticKernelSemanticKernel ialah kit pembangunan perisian sumber terbuka (SDK) yang direka untuk menyepadukan model bahasa besar (LLM) seperti OpenAI, Azure

Dengan populariti platform video pendek, pemasaran akaun matriks video telah menjadi kaedah pemasaran yang baru muncul. Dengan mencipta dan mengurus berbilang akaun pada platform yang berbeza, perniagaan dan individu boleh mencapai matlamat seperti promosi jenama, pertumbuhan peminat dan jualan produk. Artikel ini akan membincangkan cara menggunakan akaun matriks video dengan berkesan dan memperkenalkan pelbagai jenis akaun matriks video. 1. Bagaimana untuk membuat akaun video matriks? Untuk membuat akaun matriks video yang baik, anda perlu mengikuti langkah berikut: Pertama, anda mesti menjelaskan matlamat akaun matriks video anda, sama ada untuk komunikasi jenama, pertumbuhan peminat atau jualan produk. Mempunyai matlamat yang jelas membantu membangunkan strategi dengan sewajarnya. 2. Pilih platform: Pilih platform video pendek yang sesuai berdasarkan khalayak sasaran anda. Platform video pendek arus perdana termasuk Douyin, Kuaishou, Huoshan Video, dsb.

Fungsi Go boleh mengembalikan berbilang nilai jenis yang berbeza Jenis nilai pulangan ditentukan dalam tandatangan fungsi dan dikembalikan melalui penyata pulangan. Sebagai contoh, fungsi boleh mengembalikan integer dan rentetan: funcgetDetails()(int,string). Dalam amalan, fungsi yang mengira luas bulatan boleh mengembalikan kawasan dan ralat pilihan: funccircleArea(radiusfloat64)(float64,error). Nota: Jika tandatangan fungsi tidak menyatakan jenis, nilai nol dikembalikan; adalah disyorkan untuk menggunakan penyataan pulangan dengan pengisytiharan jenis eksplisit untuk meningkatkan kebolehbacaan.

Menggunakan bahasa dinamik adalah menyeronokkan untuk seketika, dan kod itu dibina semula di krematorium. Saya percaya anda pasti pernah mendengar ayat ini Seperti ujian unit, walaupun memerlukan sedikit masa untuk menulis kod, ia sangat berbaloi untuk jangka masa panjang. Artikel ini berkongsi cara untuk lebih memahami dan menggunakan pembayang jenis Python. 1. Pembayang jenis hanya sah pada peringkat sintaks (diperkenalkan sejak PEP3107) digunakan untuk menambah jenis pada pembolehubah, parameter, parameter fungsi dan nilai pulangannya, sifat kelas dan kaedah. Jenis pembolehubah Python adalah dinamik dan boleh diubah suai semasa runtime untuk menambah petunjuk jenis pada kod tersebut hanya disokong pada tahap sintaks dan tidak mempunyai kesan ke atas jalankan kod tersebut. Oleh itu jenis

Fungsi C++ mempunyai jenis berikut: fungsi ringkas, fungsi const, fungsi statik dan fungsi maya termasuk: fungsi sebaris, parameter lalai, pulangan rujukan dan fungsi terlampau beban; Sebagai contoh, fungsi calculateArea menggunakan π untuk mengira luas bulatan jejari tertentu dan mengembalikannya sebagai output.
