自动属性 ​​- Resharper错误或Cool Unknown C#功能?

时间:2010-01-28 00:09:00

标签: c# .net c#-3.0 resharper

我有以下代码:

public interface IMyInterface
{
    DataGrid ItemsInGrid { get; set; }
}

partial public class MyClass: Window, IMyInterface
{
   public DataGrid ItemsInGrid 
   {
       get { return grdItemsInGrid}
       set { grdItemsInGrid= value; }
   }
}

在另一个文件中:

partial public class MyClass: Window
{
   private System.Windows.Forms.DataGrid grdItemsInGrid;

   // Reference to private variable here
   // This is the designer portion that actually sets up the 
   // private variable to be shown on the form.
}

现在resharper希望我将ItemsInGrid转换为autoproperty(public DataGrid ItemsInGrid{ get; set; }

这怎么可能是一个平等的转变? autoproperty会创建一个与私有grdItemsInGrid权限不匹配的隐藏后备变量吗?

resharper被打破了吗?或者我不知道C#.NET中有什么东西?


编辑: 我在这里感觉到一种常见的错过通信。 grdItemsInGrid是一个显示在表单上的网格(MyClass实际上实现了Window)。我们的想法是将对grdItemsInGrid的访问权限授予MyClass作为IMyInterface传递给方法的场景。

9 个答案:

答案 0 :(得分:4)

Autoproperties消除了对可见支持变量的需求。这里什么都没有打破。这只是一个非常方便的功能。

答案 1 :(得分:4)

据我所知,这是resharper中的一个错误。有问题的私有变量是表单上的元素。我没有表现出来,因为我没有意识到它是相关的。因为表单内容在不同的文件中(它是一个部分类)。 Resharper没有意识到私有变量被引用,并认为我可以去一个汽车财产。

一旦我在同一个文件中引用了私有变量,那么ReSharper就会停止提示我应该转换为自动属性。 (但是没有意识到它是为了这个重构而在部分类中引用的。)

答案 2 :(得分:1)

这是一个平等的转变。你使用隐藏的后备变量完全正确。

以下是语言功能的MSDN页面:http://msdn.microsoft.com/en-us/library/bb384054.aspx

答案 3 :(得分:1)

您的接口合约定义了属性的名称,而不是私有支持变量。

所以建议的重构是有效的。

答案 4 :(得分:0)

你试过吗?也许它会删除grdItemsInGrid,然后修复对它的任何引用,以便它们使用该属性。

答案 5 :(得分:0)

如果您不打算对该私人领域做任何特别的事情,您可以放心地接受resharper的建议。它将以完全相同的方式工作。我不确定reshaper是否会删除您案例中的私有成员,因为它名为grdItemsInGrid而不是itemsInGrid

答案 6 :(得分:-1)

我没有看到你的问题?不,autoproperty不匹配grdItemsInGrid,但是你需要什么grdItemsInGrid?您的类将直接与ItemsInGrid交互,因为您无权访问隐藏的支持字段,但在您的逻辑中,您无需访问该文件。

答案 7 :(得分:-1)

自动属性是VS 2008的一项功能,它可以防止懒惰的程序员(比如我;))在他们的类中使用公共字段,编译器将为你完成工作(如你所说,在场景后面)并且会有一个私有变量支持你的财产(你可以使用Reflector看看发生了什么) 只要隐式接口实现关注,应该有一个在类中声明给定名称的属性,它是否是auto属性并不重要。

答案 8 :(得分:-1)

setter或getter都没有逻辑。那么这个重构怎么能以任何方式改变你的代码呢?

ReSharper知道这一点,并会向您展示有问题的重构,因为它很明显。

您认为,您的代码行为方式有何变化?