C#9记录是POCO吗?
我使用IL Spy反编译记录代码,例如:C#9记录是POCO吗?,c#,C#,我使用IL Spy反编译记录代码,例如: public record Record1(string Name); IL Spy中的反编译器 using System; using System.Collections.Generic; using System.Runtime.CompilerServices; using System.Text; public class Record1 : IEquatable<Record1> { protected virtual
public record Record1(string Name);
IL Spy中的反编译器
using System;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using System.Text;
public class Record1 : IEquatable<Record1>
{
protected virtual Type EqualityContract
{
[System.Runtime.CompilerServices.NullableContext(1)]
[CompilerGenerated]
get
{
return typeof(Record1);
}
}
public string Name
{
get;
init;
}
public Record1(string Name)
{
this.Name = Name;
base..ctor();
}
public override string ToString()
{
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.Append("Record1");
stringBuilder.Append(" { ");
if (PrintMembers(stringBuilder))
{
stringBuilder.Append(" ");
}
stringBuilder.Append("}");
return stringBuilder.ToString();
}
protected virtual bool PrintMembers(StringBuilder builder)
{
builder.Append("Name");
builder.Append(" = ");
builder.Append((object?)Name);
return true;
}
[System.Runtime.CompilerServices.NullableContext(2)]
public static bool operator !=(Record1? r1, Record1? r2)
{
return !(r1 == r2);
}
[System.Runtime.CompilerServices.NullableContext(2)]
public static bool operator ==(Record1? r1, Record1? r2)
{
return (object)r1 == r2 || (r1?.Equals(r2) ?? false);
}
public override int GetHashCode()
{
return EqualityComparer<Type>.Default.GetHashCode(EqualityContract) * -1521134295 + EqualityComparer<string>.Default.GetHashCode(Name);
}
public override bool Equals(object? obj)
{
return Equals(obj as Record1);
}
public virtual bool Equals(Record1? other)
{
return (object)other != null && EqualityContract == other!.EqualityContract && EqualityComparer<string>.Default.Equals(Name, other!.Name);
}
public virtual Record1 <Clone>$()
{
return new Record1(this);
}
protected Record1(Record1 original)
{
Name = original.Name;
}
public void Deconstruct(out string Name)
{
Name = this.Name;
}
}
因为它包含像
byimmutable
{get;init;}
通过覆盖等于值等于
公共虚拟布尔等于(记录1?其他)
{
return(object)other!=null&&EqualityContract==other!.EqualityContract&&EqualityComparer.Default.Equals(Name,other!.Name);
}
但我不确定。这里的问题是POCO实际上不是一个技术术语,它更像是一个口语术语,用来描述一组松散的行为/属性,这些行为/属性起源于其他语言,充其量取决于上下文
此外,在.Net或C#规范中实际上没有提及POCO(或其扩展形式)一词。所以我们所能做的就是根据它的口语意义松散地使用这种语言。这是一个不依赖于外部框架的对象
编译记录时
会创建一个相当普通的类,该类实现了BCL接口
这是否足以将其归类为复杂对象(因为它与BCL接口有契约)?我想这取决于你问谁
如果答案是肯定的,我们在哪里划界?具有async
方法且依赖于编译器生成的IAsynStateMachine
实现的类,还是闭包,或者编译器生成依赖关系的许多其他实例
简而言之,POCO一词没有实际用途。只有在讨论这个概念的人能够就一个狭义的、定义明确的定义达成一致意见的情况下,才有可能
因此,如果有人问你某个东西是否是POCO,你应该问他们“为我严格定义POCO”。POCO实际上不是C#中任何语言特性的技术术语。是的,它产生一个类。你为什么要知道这个,也许我们能回答得更好?此外,我认为对这一问题的任何回答(按原样)都是主观的,主要是因为术语POCO定义不清,不属于任何规范的一部分。它不是POCO,它取决于
IEquatable
接口以及其他基本框架类。POCO不应该依赖于这些,在那个类中,它们确实如此。也许其他人可以插话问这个问题?@一般有人问我问题是C#9记录还是POCO,我不确定。我要问的第一个问题是,“从技术上定义POCO”,如果这意味着它不能包括BCL接口,那么它就不是POCO。如果这意味着它不能是编译器生成的类。。。这就是POCO一词的由来。如果您有一个带有异步方法的类,那么该类现在依赖于框架IAsyncStateMachine
实现。甚至类也依赖于BCL对象类。这就像我们在这里画线一样。。。事实上,我们不能这样做,因为从技术上讲,.net或C#规范中没有这样的定义POCO@TheGeneral我甚至不知道POCO是什么。谢谢你的评论。我从你那里学到了一件新东西。Martin Fowler的阴影是什么?“简言之,术语POCO没有实际用途”-在ORMs和MVVM的上下文中,它肯定有适用的用法。诚然,它仍然没有严格定义,但在这些上下文中,它通常被理解为意味着ORM或MVVM框架不依赖于您使用一些基类或接口(例如,实体框架不要求您的实体类继承自任何BaseEntity
,而WPF要求您实现INotifyPropertyChanged
,并且属性设置程序需要有副作用,因此WPF VM不能是POCO)@Dai-hah,我不认为这会悄悄溜走……没有什么,尽管它和Eric Evens一样。人们追随这些福音传道者就像一种宗教,很多都应该带着一点信心salt@Dai我也同意,如果你定义了POCO的用法,那么它就更有用了,但是,如果你问一些东西是否是POCO,而没有这样严格的内容,那么xt是无用的。尤其是在这种情况下。简言之,POCO一词没有语言特征或定义,如果有,它的上下文dependent@Wei这里有一件事,即使是最狭义的,也可能是POCO。当你开始向类添加接口或毛发时,定义变得非常不寻常和模糊。如果你sed来传输数据。您可以将其称为一个只包含属性的简单类..“SCWJP”
public class Record1
{
public string Name {get;set;}
}
public virtual bool Equals(Record1? other)
{
return (object)other != null && EqualityContract == other!.EqualityContract && EqualityComparer<string>.Default.Equals(Name, other!.Name);
}