C# 为什么VisualStudio要添加;参考「;在重构为方法时对类型进行赋值?
我不理解Visual Studio Express 2013在运行“提取方法”重构时做出的决定。考虑下面的代码:C# 为什么VisualStudio要添加;参考「;在重构为方法时对类型进行赋值?,c#,visual-studio,refactoring,ref,C#,Visual Studio,Refactoring,Ref,我不理解Visual Studio Express 2013在运行“提取方法”重构时做出的决定。考虑下面的代码: public struct Foo { private readonly int x, y; public int X { get { return x; } } public int Y { get { return y; } } public Foo(int x, int y) { this.x = x;
public struct Foo
{
private readonly int x, y;
public int X { get { return x; } }
public int Y { get { return y; } }
public Foo(int x, int y)
{
this.x = x;
this.y = y;
}
}
class Test
{
static void Main()
{
Foo a = new Foo(1, 2);
Foo b = new Foo(3, 4);
Console.WriteLine(a);
Console.WriteLine(a + "" + b);
}
}
如果我突出显示第一个控制台.WriteLine
调用并运行提取方法重构,提取一个名为OneParameter
的方法,然后对第二个调用执行相同的操作,提取一个名为TwoParameters
的方法,我将得到以下代码:
class Test
{
static void Main()
{
Foo a = new Foo(1, 2);
Foo b = new Foo(3, 4);
OneParameter(a);
TwoParameters(ref a, ref b);
}
static Foo OneParameter(Foo a)
{
Console.WriteLine(a);
return a;
}
static void TwoParameters(ref Foo a, ref Foo b)
{
Console.WriteLine(a + "" + b);
}
}
为什么双参数方法有ref
参数,而没有单参数方法?在这里使用ref
有什么意义
另外,为什么单参数方法返回Foo?如果结构是可变和修改的,那么返回和两个引用都会发生。VS2013并没有对结构类型进行任何不变性分析,也没有对选择的代码进行任何变异操作分析。原语/Guid/etc不会发生这种情况,因为框架中有一个硬编码的值类型列表,已知这些值类型是不可变的。如果结构是可变和修改的,则返回和两个引用都会发生。VS2013并没有对结构类型进行任何不变性分析,也没有对选择的代码进行任何变异操作分析。原语/Guid/etc不会发生这种情况,因为框架中有一个硬编码的值类型列表,已知这些值类型是不可变的。如果结构是可变和修改的,则返回和两个引用都会发生。VS2013并没有对结构类型进行任何不变性分析,也没有对选择的代码进行任何变异操作分析。原语/Guid/etc不会发生这种情况,因为框架中有一个硬编码的值类型列表,已知这些值类型是不可变的。如果结构是可变和修改的,则返回和两个引用都会发生。VS2013并没有对结构类型进行任何不变性分析,也没有对选择的代码进行任何变异操作分析。原语/Guid/etc不会发生这种情况,因为框架中有一个硬编码的值类型列表,已知这些值类型是不可变的。我怀疑您的假设是无效的,但如果没有“之前和之后”的更改,我们无法判断它正在进行的更改。如果没有例子,你的问题很难回答。您需要了解,
ref
仍然会产生非常显著的语义差异,即使使用引用类型也是如此。看,我想你是在通过折射将一小部分信息转换成方法。因此,它不会冒险使用您的局部变量并通过ref传递它。这样,代码将像以前一样编译和运行,并且依赖项保持不变。如果要重构到方法中的代码更改了一个值类型的变量,它必须通过ref将其传递到重构方法中,以便实际更改它。可以传递和更改引用类型,而无需ref@user1323245-2之间的差异是表面的,正如您所注意到的,单参数版本返回一个Foo。因此,这两种方法都迎合了方法(WriteLine)可能更改原始参数的可能性。我们可以立即看到这没有发生,但重构代码只是没有检查。这是出于安全考虑。ref
s和return
是同一策略的两面。好吧,没有Roslyn,我看到的行为和你一样。这确实很奇怪。我怀疑你的假设是无效的——但如果没有“之前和之后”的改变,我们就无法判断。如果没有例子,你的问题很难回答。您需要了解,ref
仍然会产生非常显著的语义差异,即使使用引用类型也是如此。看,我想你是在通过折射将一小部分信息转换成方法。因此,它不会冒险使用您的局部变量并通过ref传递它。这样,代码将像以前一样编译和运行,并且依赖项保持不变。如果要重构到方法中的代码更改了一个值类型的变量,它必须通过ref将其传递到重构方法中,以便实际更改它。可以传递和更改引用类型,而无需ref@user1323245-2之间的差异是表面的,正如您所注意到的,单参数版本返回一个Foo。因此,这两种方法都迎合了方法(WriteLine)可能更改原始参数的可能性。我们可以立即看到这没有发生,但重构代码只是没有检查。这是出于安全考虑。ref
s和return
是同一策略的两面。好吧,没有Roslyn,我看到的行为和你一样。这确实很奇怪。我怀疑你的假设是无效的——但如果没有“之前和之后”的改变,我们就无法判断。如果没有例子,你的问题很难回答。您需要了解,ref
仍然会产生非常显著的语义差异,即使使用引用类型也是如此。看,我想你是在通过折射将一小部分信息转换成方法。因此,它不会冒险使用您的局部变量并通过ref传递它。这样,代码将像以前一样编译和运行,并且依赖项保持不变。如果要重构到方法中的代码更改了一个值类型的变量,它必须通过ref将其传递到重构方法中,以便实际更改它。可以传递和更改引用类型,而无需ref@user1323245-2之间的差异是表面的,正如您所注意到的,单参数版本返回一个Foo。因此,这两种方法都迎合了方法(WriteLine)可能更改原始参数的可能性。我们可以立即看到这没有发生,但重构代码只是没有检查。这是出于安全考虑。ref
s和return
是同一策略的两面。好吧,没有Roslyn,我看到的行为和你一样。这确实很奇怪。我怀疑你的假设是inva