console.writelines 可以直接处理匿名对象吗?
Can console.writelines handle anonymous object directly?
想弄明白为什么下面"Console.WriteLine(x)"可以直接打印匿名对象的对象?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
class program
{
static void Main()
{
var groupA = new[] { 3, 4, 5, 6 };
var groupB = new[] { 6, 7, 8, 9 };
var someInts = from a in groupA
from b in groupB
where a > 4 && b <= 8
select new { a, b, sum = a + b }; // object of Anonymous tyoe
foreach (var x in someInts)
Console.WriteLine(x); // ok
// Console.WriteLine(groupA); // nok
}
}
匿名 class 使用 ToString()
方法创建,仅显示属性。
ToString()
被 WriteLine()
和许多其他方法隐式调用。
对于数组,ToString()
仍在被调用,但它没有被覆盖,所以只给出完全限定名称的默认文本。
您不希望自动显示数组,因为它可能包含数百万个项目。这对于匿名类型来说不太可能(尽管可能)。
匿名 class 与任何其他 class 一样,只是它是隐式的。这意味着它(像任何其他 class 一样)可以包含属性或成员,在您的情况下,整数作为其内部的一部分。所以
Console.WriteLine(x); // makes sense. x is just an integer
理论上,如果您采用任何显式 class 并对其求值 .ToString()
,您就会得到它的名字。所以理论上,如果你做了 groupA.ToStrint()
你应该得到“Anonymous.abjdhjNxx1
”或者其他什么。实际上,您可以在该行断点并将手表添加到您的 groupA 变量以查看它。它仍然只是一个变量,它仍然是类型安全的,你只是永远不知道你的类型的 "name" 会是什么,因为运行时中间环境会随着它的进行而组成它。然而,正如这里所暗示的那样,它是胡言乱语,因此 Microsoft 的好心人决定不直接向我们展示它。这就是为什么
Console.WriteLine(groupA); // not ok
如果你愿意,你仍然可以做到
Console.WriteLine(groupA.GetType().Name);
但我无法想象你为什么要这样做,因为如前所述,它是胡言乱语
想弄明白为什么下面"Console.WriteLine(x)"可以直接打印匿名对象的对象?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
class program
{
static void Main()
{
var groupA = new[] { 3, 4, 5, 6 };
var groupB = new[] { 6, 7, 8, 9 };
var someInts = from a in groupA
from b in groupB
where a > 4 && b <= 8
select new { a, b, sum = a + b }; // object of Anonymous tyoe
foreach (var x in someInts)
Console.WriteLine(x); // ok
// Console.WriteLine(groupA); // nok
}
}
匿名 class 使用 ToString()
方法创建,仅显示属性。
ToString()
被 WriteLine()
和许多其他方法隐式调用。
对于数组,ToString()
仍在被调用,但它没有被覆盖,所以只给出完全限定名称的默认文本。
您不希望自动显示数组,因为它可能包含数百万个项目。这对于匿名类型来说不太可能(尽管可能)。
匿名 class 与任何其他 class 一样,只是它是隐式的。这意味着它(像任何其他 class 一样)可以包含属性或成员,在您的情况下,整数作为其内部的一部分。所以
Console.WriteLine(x); // makes sense. x is just an integer
理论上,如果您采用任何显式 class 并对其求值 .ToString()
,您就会得到它的名字。所以理论上,如果你做了 groupA.ToStrint()
你应该得到“Anonymous.abjdhjNxx1
”或者其他什么。实际上,您可以在该行断点并将手表添加到您的 groupA 变量以查看它。它仍然只是一个变量,它仍然是类型安全的,你只是永远不知道你的类型的 "name" 会是什么,因为运行时中间环境会随着它的进行而组成它。然而,正如这里所暗示的那样,它是胡言乱语,因此 Microsoft 的好心人决定不直接向我们展示它。这就是为什么
Console.WriteLine(groupA); // not ok
如果你愿意,你仍然可以做到
Console.WriteLine(groupA.GetType().Name);
但我无法想象你为什么要这样做,因为如前所述,它是胡言乱语