我想要一些技术来自动替换以下代码:
[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/