我对延迟加载的方法有缺陷吗?

dan*_*die 0 c# resharper warnings lazy-loading

平台:带有Resharper 4.1,.NET 3.5的Visual Studio 2008 SP1

我有一个静态方法的类,GetProperty<T>它懒惰地返回一个属性值.

private static T GetProperty<T>(T backingField, Func<T> factory) 
    where T : class 
{
    if (backingField == null)
        backingField = factory();
    return backingField;
}
Run Code Online (Sandbox Code Playgroud)

但是,当我使用上述方法返回属性时,我收到两条警告,指出未分配私有支持字段.但是只有在需要时才会分配它们.

替代文字

这个警告是否可以忽略
- 或者 -
我的加载财产是否存在缺陷?

Ada*_*son 13

你的方法有缺陷.要采用这种方法,您需要创建backingField一个ref参数.

private static T GetProperty<T>(ref T backingField, Func<T> factory)
Run Code Online (Sandbox Code Playgroud)

然后GetProperty,通过ref _ImagXpressref _PdfXpress.

你现在这样做只是为参数赋予一个新值,而不是为实际的后备字段赋值.

  • ref参数在功能上类似于双指针,它允许您替换整个对象引用.值参数在功能上类似于单个指针,重新分配参数(backingField = factory())将仅在方法范围内替换它.您可以操作值参数的状态,但不能操作对堆上对象的引用. (2认同)
  • Jon Skeet可以比我更好地回答这个问题:http://www.yoda.arachsys.com/csharp/parameters.html (2认同)

dus*_*ell 5

你的方法有缺陷.你的字段永远不会被设置为任何东西.该backingField参数是在GetProperty<T>方法中设置的,但是这不会更新您传入的字段.您将要传递带有ref附加关键字的参数,如下所示:

private static T GetProperty<T>(ref T backingField, Func<T> factory)
Run Code Online (Sandbox Code Playgroud)