自动实现的属性是否支持属性?

时间:2009-01-21 11:21:21

标签: c# attributes automatic-properties

我被告知在自动实现的属性中不允许使用c#属性。真的吗?如果是这样的话?

编辑:我从一本关于LINQ的热门书籍中得到了这些信息,并且无法相信! 编辑:参考Paul Kimmel释放的LINQ第34页,他说“属性不允许在自动实现的属性上,所以如果你需要属性,请自行滚动

5 个答案:

答案 0 :(得分:12)

您可以毫无问题地将属性应用于自动属性。

引自MSDN

  

允许使用属性   自动实现的属性但是   显然不在支持领域   因为那些是无法访问的   你的源代码。如果你必须使用   属性在一个支持领域   财产,只是创建一个常规   属性。

答案 1 :(得分:8)

证明错误的最简单方法就是测试它:

using System;
using System.ComponentModel;
using System.Reflection;

class Test
{
    [Description("Auto-implemented property")]
    public static string Foo { get; set; }  

    static void Main(string[] args)
    {
        var property = typeof(Test).GetProperty("Foo");
        var attributes = property.GetCustomAttributes
                (typeof(DescriptionAttribute), false);

        foreach (DescriptionAttribute description in attributes)
        {
            Console.WriteLine(description.Description);
        }
    }
}

我建议您通过电子邮件发送作者,以便将其作为错误发布。如果他的意思是你不能将属性应用于字段,这将使他有机会更仔细地解释。

答案 2 :(得分:4)

我认为作者的意思是,您无法将自定义属性应用于私有支持字段。 例如,如果要将自动属性标记为非序列化,则不能执行此操作:

[Serializable]
public class MyClass
{
    [field:NonSerializedAttribute()]
    public int Id
    {
        get;
        private set;
    }
}

此代码编译,但不起作用。 您可以将属性应用于属性本身,但无法将其应用于支持字段。

答案 3 :(得分:1)

另请注意,任何Automatic属性也都会应用CompilerGeneratedAttribute。

答案 4 :(得分:0)

Visual Studio和C#编译器的当前版本支持此功能。我使用启用了C#8.0的VS 16.4.2进行了测试。我不知道确切启用了哪个版本,但这是个好消息。

语法:

[field: NonSerialized]
public SomeNonSerializableType MyAutoProperty { get; set; } = DefaultValueAfterSerialization;

实际用例;支持整洁/可往返的合格XML序列化,而没有混乱的后备字段,但避免了运行时异常并解决了代码分析错误CA2235:

/// <summary>
/// XML name table for serialization.
/// </summary
[XmlSerializerNamespaces]
[field: NonSerialized]
public XmlSerializerNamespaces XmlNamespaces { get; set; } = new XmlSerializerNamespaces();

如果您正在使用.NET Core 3,.NET Standard 2.1或更高版本来开发新的“ SDK”样式项目之一,则默认情况下,语言版本为8,它将立即运行。否则,所有“旧版” .NET对于框架项目和非SDK项目,您必须将项目as documented here的“ LangVersion”设置添加到“ 8.0”或“最新”。