object o = new { },这里的o算什么类型?

微创社(MCC) 2009-09-24 01:13:20
class MyClass
{
static void Main(string[] args)
{
object o = new { };
System.Console.WriteLine(o.GetType());

System.Console.ReadKey();
}
}

//<>f__AnonymousType0
...全文
360 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
微创社(MCC) 2009-10-06
  • 打赏
  • 举报
回复
给匿名类型增加方法:
http://space.cnblogs.com/question/3412/

using System.Collections.Generic;
using System;

class P
{
delegate string X(string name);
static void Main()
{
var obj = new { Name = "crab",
Age = 23,
SayHello = (X)((string name) => string.Format( "Hello, {0}!", name ))
};
}
}
微创社(MCC) 2009-09-25
  • 打赏
  • 举报
回复
结贴,给分,过节。
美人心计1999 2009-09-25
  • 打赏
  • 举报
回复
学习
微创社(MCC) 2009-09-25
  • 打赏
  • 举报
回复
周靖的序言中提到三种境界:

(1)昨夜西风凋碧树,独上高楼,望尽天涯路。
(2)衣带渐宽终不悔,为伊消得人憔悴。
(3)众里寻他千百度,回头蓦见,那人正在,灯火阑珊处。

回头蓦见,不错啊。
duanyuncanyang 2009-09-24
  • 打赏
  • 举报
回复
这不是c#3.0中新添加的匿名类型吗?
wuyi8808 2009-09-24
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 sunzeshan 的回复:]
        staticvoid Main(string[] args)
{
var stu=new { Name="XiaoShan", Age=21 };
Console.WriteLine(stu.Name);
}
楼主不妨试一下这段代码,很简单,一看就懂了
[/Quote]

这正是匿名类型的最通常的用法。
sunzsh 2009-09-24
  • 打赏
  • 举报
回复
其实 , 就好像我们临时 创建了一个类一样。
sunzsh 2009-09-24
  • 打赏
  • 举报
回复

static void Main(string[] args)
{
var stu = new { Name = "XiaoShan", Age = 21 };
Console.WriteLine(stu.Name);
}

楼主不妨试一下这段代码,很简单,一看就懂了
wowwow_cai 2009-09-24
  • 打赏
  • 举报
回复
java里面是匿名,c不懂
让爱延续 2009-09-24
  • 打赏
  • 举报
回复
呵呵,长见识啦。。。
535cheng110 2009-09-24
  • 打赏
  • 举报
回复
mark
xj150145223 2009-09-24
  • 打赏
  • 举报
回复
呵呵。还有这种类型的啊··学习了
微创社(MCC) 2009-09-24
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 ojlovecd 的回复:]
由于匿名类型上的 Equals 和 GetHashCode 方法是根据属性的 Equals 和 GetHashcode 定义的,因此仅当同一匿名类型的两个实例的所有属性都相等时,这两个实例才相等。
[/Quote]

这个值得研究一下:
using System;

class MyClass
{
static void Main(string[] args)
{
object o1 = new { };
object o2 = new { };
object o3 = new { i = 1, s = "abc" };
object o4 = new { s = "eee", i = 1 };

f__AnonymousType type = new

System.Console.WriteLine("o1:{0},o2:{1},o3:{2},o4:{3}", o1.GetType(), o2.GetType(), o3.GetType(), o4.GetType());

System.Console.ReadKey();
}
}

//o1:<>f__AnonymousType0,
//o2:<>f__AnonymousType0,
//o3:<>f__AnonymousType1`2[System.Int32,System.String],
//o4:<>f__AnonymousType2`2[System.String,System.Int32]


f__AnonymousType这个也算是基类型的,
与传统的基不一样的地方在于:
(1)不能显式引用
(2)与泛型挂钩了
wartim 2009-09-24
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 pcnetman888 的回复:]
引用 12 楼 wartim 的回复:
匿名对象,理解成javascript里的弱类型变量就是了,大体上就像是个指向匿名结构体的指针吧


12楼提到了结构,
本质上,是否是结构呢?
[/Quote]

此结构非彼结构,我说是一个数据结构,不是struct
微创社(MCC) 2009-09-24
  • 打赏
  • 举报
回复
自测一下,并没有发现中间类型,
直接继承至object

所以不能算结构,奇了怪了,跟传统类型还真的不一样。

!dso
PDB symbol for mscorwks.dll not loaded
OS Thread Id: 0x1dcc (7628)
ESP/REG Object Name
0012f09c 01377ea4 <>f__AnonymousType0
0012f0c0 01377ea4 <>f__AnonymousType0
0012f0c8 01377ea4 <>f__AnonymousType0
0012f160 01377ea4 <>f__AnonymousType0
0012f204 01377ea4 <>f__AnonymousType0
0012f208 01377ea4 <>f__AnonymousType0
0012f214 01377ea4 <>f__AnonymousType0

!do 01377ea4
Name: <>f__AnonymousType0
MethodTable: 009e32c8
EEClass: 009e1388
Size: 12(0xc) bytes
Fields:
None

!dumpclass 009e1388
Class Name: <>f__AnonymousType0
Parent Class: 0339d08c
Module: 009e2e58
Method Table: 009e32c8
Vtable Slots: 4
Total Method Slots: 5
Class Attributes: 100100
NumInstanceFields: 0
NumStaticFields: 0

!dumpclass 0339d08c
Class Name: System.Object
mdToken: 02000002 (C:\WINDOWS\assembly\GAC_32\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll)
Parent Class: 00000000
Module: 03362000
Method Table: 0339d0f0
Vtable Slots: 4
Total Method Slots: e
Class Attributes: 102001
NumInstanceFields: 0
NumStaticFields: 0
我姓区不姓区 2009-09-24
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 pcnetman888 的回复:]
@谢谢,键健
长见识了,第一次接触匿名类型

传统的类型就这些:类|结构|数组|委托|枚举|接口

能不能具体讲一下,
特别是他的根类型是什么
(非指object,象数组是System.Array)

[/Quote]
匿名类型是直接从 object 继承的无名类类型。匿名类型的成员是从用于创建该类型的实例的匿名对象初始值设定项推断出的一系列只读属性。

MSDN中有如下信息:
匿名类型是直接从对象派生的引用类型。尽管应用程序无法访问匿名类型,但编译器仍会为其提供一个名称。从公共语言运行时的角度来看,匿名类型与任何其他引用类型没有什么不同,唯一区别在于匿名类型无法强制转换为除 object 以外的任何类型。

如果两个或更多个匿名类型以相同的顺序具有相同数量和种类的属性,则编译器会将这些匿名类型视为相同的类型,并且它们共享编译器生成的相同类型信息。

匿名类型具有方法范围。若要向方法边界外部传递一个匿名类型或一个包含匿名类型的集合,必须首先将匿名类型强制转换为对象。但是,这会使匿名类型的强类型化无效。如果必须存储查询结果或者必须将查询结果传递到方法边界外部,请考虑使用普通的命名结构或类而不是匿名类型。

匿名类型不能像属性一样包含不安全类型。

由于匿名类型上的 Equals 和 GetHashCode 方法是根据属性的 Equals 和 GetHashcode 定义的,因此仅当同一匿名类型的两个实例的所有属性都相等时,这两个实例才相等。
tfpeixun 2009-09-24
  • 打赏
  • 举报
回复
内部类型,这个类型是你新建的,你还没给他命名呢。
微创社(MCC) 2009-09-24
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 wartim 的回复:]
匿名对象,理解成javascript里的弱类型变量就是了,大体上就像是个指向匿名结构体的指针吧
[/Quote]

12楼提到了结构,
本质上,是否是结构呢?
jzywh 2009-09-24
  • 打赏
  • 举报
回复
3.5 的新特性
微创社(MCC) 2009-09-24
  • 打赏
  • 举报
回复
匿名类型是由一个或多个公共只读属性组成的类类型。
不允许包含其他种类的类成员(如方法或事件)。

匿名类型不能强制转换为除 object 以外的任何接口或类型。

是不是能跟传统类型相提并论~~
加载更多回复(12)

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧