Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#9记录是POCO吗?_C# - Fatal编程技术网

C#9记录是POCO吗?

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

我使用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 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;
    }
}
因为它包含像

  • immutable
    by
    {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);
    }