我被告知在自动实现的属性中不允许使用c#属性。真的吗?如果是这样的话?
编辑:我从一本关于LINQ的热门书籍中得到了这些信息,并且无法相信! 编辑:参考Paul Kimmel释放的LINQ第34页,他说“属性不允许在自动实现的属性上,所以如果你需要属性,请自行滚动”答案 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”或“最新”。