自动属性无法在 C# 实例构造函数中初始化

Posted

技术标签:

【中文标题】自动属性无法在 C# 实例构造函数中初始化【英文标题】:Automatic properties fail to initialize in C# instance constructor 【发布时间】:2013-10-13 00:04:33 【问题描述】:

我需要进行完整性检查以确定我的 C# 编译器是否损坏,或者我不了解自动属性应该如何工作。

给定以下类定义和构造函数,请注意各自的成员值。

public class MyClass

    public string MyString  get; set; 
    public string _anotherString;

    public MyClass()
    
        MyString = "some value";
        // <--- debugger shows MyString as null

        _anotherString = "another value";
        // <--- debugger shows _anotherString as "another value"
    

这种情况继续发生在各种课程中。简而言之,在构造函数中分配值时,所有自动属性都无法初始化。他们在其他任何地方工作。但是,如果我将它们更改为使用后备存储并初始化后备变量,它们就会正确初始化。

我是否正确假设在构造函数中初始化自动属性总是安全的,或者我错过了什么?如果是,那么 Visual Studio 会发生什么?

【问题讨论】:

您是第一次MyString = ...还是在下一行?您的评论建议在下一行,但您不能在评论上设置断点。 除了使用调试器之外,你能显示输出吗?即Console.WriteLineMessageBox.Show(...) 等。不用说,自动属性不会按照您描述的方式运行。 @siride: 谁调试调试器...? @CSJ 这是我不想考虑的那些可怕的问题之一 ;)。 这很奇怪。正如@KirkWoll 所指出的,您描述的行为不是应该的。我猜是过时的 pdb 或配置问题的一些问题。 【参考方案1】:

您是否尝试过一个全新的项目? 您是否清理过解决方案(构建 > 清理解决方案),关闭所有打开的文档/选项卡,然后重新构建(不是构建,重新构建!)并重试?

【讨论】:

【参考方案2】:

我确定这是由两个PostSharp 方面属性之间的冲突引起的。 PostSharp 没有问题,但我创建了一个自定义属性来拦截属性分配。去掉多余的属性就可以正常工作了。

本质上,当有多个方面应用于同一个对象时,PostSharp 在“编织”生成的代码时会做一些棘手的操作。仍在尝试确定如何解决它,但至少我不会完全发疯。

【讨论】:

鉴于您在属性分配上具有 PostSharp 方面属性,您可能应该在问题中这么说 @JohnSaunders - 我认为“健全性检查”这个短语足以表明我需要澄清 C# 语言以及自动属性的工作方式。快速响应实际上有助于验证我的理解,并迫使我更深入地挖掘问题的根源,而问题的根源隐藏在一个单独的组件中。在我看来,与像您这样的专家网络建立联系的价值在于能够在事情没有意义时提出这样的问题。 这位特殊的“专家”觉得您没有告诉我 PostSharp 参与其中是在浪费我的时间。使用 PostSharp 的事实将其从 C# 语言转变为您自己编写的任意语言。 这很公平,约翰。我很抱歉。

以上是关于自动属性无法在 C# 实例构造函数中初始化的主要内容,如果未能解决你的问题,请参考以下文章

C# 构造函数总结

C# 关于 构造函数问题 关于对象实例化

C# 构造函数总结

C#静态构造函数

C#中静态字段声明时赋值与构造函数中赋值

Python构造函数