c# - 如何通过添加属性在未初始化的情况下访问属性时发出警告?

标签 c# .net visual-studio

我想要一些技术来自动替换以下代码:

[WarnIfGetButUninitialized]
public int MyProperty {get; set; }

有了这个:

/// <summary>
/// Property which warns you if its value is fetched before it has been specifically instantiated.
/// </summary>
private bool backingFieldIsPopulated = false;
private int backingField;
public int MyProperty { 
    get
    {
        if (backingFieldIsPopulated == false)
        {
            Console.WriteLine("Error: cannot fetch property before it has been initialized properly.\n");
            return 0;
        }
        return backingField;
    }
    set { 
        backingField = value;
        backingFieldIsPopulated = true;
    }
}       

我更喜欢在编译时工作的解决方案,因为反射很慢。

我知道面向方面的编程 (AOP) 可以做到这一点(例如 PostSharp 和 CciSharp),但我很想知道是否有任何其他方法可以实现这一点。

更新

参见 How to use PostSharp to warn if a property is accessed before it has been initialized?其中有一些示例代码的链接,这些示例代码演示了使用 PostSharp 的技术。

最佳答案

属性只是将元数据添加到类和类成员中——它们本身什么都不做。

在装饰成员上完成的操作是通过反射完成的——在一些现有的工具中有一些对此的支持,但不会有对自定义属性的这种支持。

简而言之 - 如果编译器尚不支持某个属性,则无法在编译时对其进行检查。

但是,您可以创建自己的 code snippets使此类代码更易于编写和创建。

关于c# - 如何通过添加属性在未初始化的情况下访问属性时发出警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9033385/

相关文章:

visual-studio - Window Installer 自定义操作失败,说自定义操作失败,即使它成功了

c# - 使用反射分配 Func<Product, object> 属性的值

c# - 对象发送者作为验证当前文本框的参数

c# - 尽可能整齐地处理碰撞过程中的速度矢量

c# - 如何在 C# 中中断 Gurobi 模型优化?

c# - MSTest取消机制

c# - 寻找一个.NET函数来求和,而不是溢出,只会返回int.MaxValue

c++ - 为什么在 Visual Studio 中单词 `false` 写成蓝色,而单词 `FALSE` 写成紫色?

c - 具有返回类型 typedef 结构的函数在 VS2015 中不起作用

c# - 在 Blazor WebAssembly 中调整图像大小 (jpg)?