C# 使用C自动实现的属性编译错误
A C Noob,我正在尝试使用SharpDevelop实用程序将我的VB.NET应用程序转换为C 我注意到我自动实现的属性正在生成许多错误。例如,以以下属性为例: 公共SqlDateTime出生日期{get;set;} 每当我试图访问隐含的底层模块级变量_DateOfBirth时,我都会得到错误 错误699当前上下文D:\Users\Chad\Desktop\BESI CSharp\BESI\BESI.BusinessObjects.ConvertedToC\ChinaVisa.cs 240 13 BESI.BusinessObjects.Converted中不存在名称“\u DateOfBirth”C# 使用C自动实现的属性编译错误,c#,visual-studio-2010,C#,Visual Studio 2010,A C Noob,我正在尝试使用SharpDevelop实用程序将我的VB.NET应用程序转换为C 我注意到我自动实现的属性正在生成许多错误。例如,以以下属性为例: 公共SqlDateTime出生日期{get;set;} 每当我试图访问隐含的底层模块级变量_DateOfBirth时,我都会得到错误 错误699当前上下文D:\Users\Chad\Desktop\BESI CSharp\BESI\BESI.BusinessObjects.ConvertedToC\ChinaVisa.cs 240
我可以将属性声明扩展为完整的属性,但这不是必需的,我想了解为什么会出现此错误。您无法访问编译器创建的支持变量-您必须使用该属性。编译器生成的BackingField被专门命名,以防止您访问它。它没有命名为DateOfBirth,它的命名类似于k_ubackingfield 直接访问属性-如果需要直接操作支持字段,则不要使用自动实现的属性 只是一个旁注——属性名是什么并不重要,它是一个实现细节,可能会在不同版本的编译器上或在不同的编译器实现中发生变化。该字段被赋予一个标识符,该标识符专门设计用于满足CLR的命名限制,但未通过C的命名限制,因此无法编写直接访问该变量的C代码 还要记住,自动实现的属性不是公共字段。它们是编译器为您展开的一种缩写,有点像宏 所以这个班:
class Bar
{
public object Foo { get; set; }
}
扩展到以下内容:
class Bar
{
[CompilerGenerated]
private object <Foo>k__BackingField;
public object Foo
{
[CompilerGenerated]
get
{
return this.<Foo>k__BackingField;
}
[CompilerGenerated]
set
{
this.<Foo>k__BackingField = value;
}
}
}
它仍然是一个完整的属性——您只需要允许编译器为您编写getter和setter 如果使用自动生成的属性,则不能依赖编译器为支持字段选择任何特定名称。这完全是特定于编译器的,即使您可以访问这些字段,如果您使用其他编译器,您的代码也可能会中断。Hmm。您可以在Vb.NET中执行此操作。如果不能在C中执行此操作,隐式属性与公共变量有何不同?@Chad:Properties的访问方式与字段不同,因此如果使用自动属性并决定稍后在访问器中放入更多代码,则不会中断引用代码的程序集。如果将字段更改为属性,那么引用程序集的程序集将在不重新编译的情况下中断。只要计时器允许,我会投票给你正确的答案,但还有一个问题:据我所知,至少在VB.NET中,访问类中的属性与访问公共变量是一样的。他们有什么不同?@Chad-好问题!访问公共字段和公共属性时,两种语言中使用的语法相同,但编译器为这些成员发出的元数据非常不同。这意味着调用您的类的代码可能使用反射来处理您的类,并且由于属性和字段的元数据不同,如果您将成员从字段切换到属性,您将中断此客户端的代码。