C#Noob,我正在尝试使用SharpDevelop实用程序将我的VB.NET应用程序转换为C#。
我注意到我自动实现的属性会产生很多错误。例如,请使用以下属性:
public SqlDateTime DateOfBirth {get;组; }
每当我尝试访问隐含的底层模块级变量_DateOfBirth时,我都会收到错误。
错误699当前上下文中不存在名称'_DateOfBirth'D:\ Users \ Chad \ Desktop \ BESI CSharp \ BESI \ BESI.BusinessObjects.ConvertedToC#\ ChinaVisa.cs 240 13 Besi.BusinessObjects.Converted
我可以将属性声明扩展为完整的属性,但这不是必需的,我想了解为什么我会收到此错误。
答案 0 :(得分:9)
您无法访问编译器创建的后备变量 - 您必须使用该属性。编译器生成的支持字段的具体命名方式是阻止您访问它(它不是_DateOfBirth
,它的名称类似于<DateOfBirth>k__BackingField
)。
直接访问该属性 - 如果您需要直接操作支持字段,请不要使用自动实现的属性。
只是旁注 - 属性名称无关紧要(它是一个实现细节,可能会在不同版本的编译器上或完全不同的编译器实现上发生变化)。该字段被赋予一个标识符,专门设计用于满足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。
答案 1 :(得分:1)
如果使用自动生成的属性,则不能依赖编译器选择支持字段的任何特定名称。这完全是特定于编译器的,即使您可以访问这些字段,如果您使用其他编译器,您的代码仍可能会中断。